/* ====================================================================
* The Vovida Software License, Version 1.0
*
* Copyright (c) 2000 Vovida Networks, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The names "VOCAL", "Vovida Open Communication Application Library",
* and "Vovida Open Communication Application Library (VOCAL)" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact vocal@vovida.org.
*
* 4. Products derived from this software may not be called "VOCAL", nor
* may "VOCAL" appear in their name, without prior written
* permission of Vovida Networks, Inc.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA
* NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
* IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by Vovida
* Networks, Inc. and many individuals on behalf of Vovida Networks,
* Inc. For more information on Vovida Networks, Inc., please see
* <http://www.vovida.org/>.
*
*/
static const char* const UavmContainer_cxx_Version =
"$Id: UavmContainer.cxx,v 1.21 2002/11/09 02:02:30 derekm Exp $";
#include "UavmContainer.hxx"
#include "HeartbeatUtil.h"
#include "HeartbeatCommon.h"
#include "cpLog.h"
#include "ReadLockHelper.hxx"
#include "WriteLockHelper.hxx"
Sptr < UavmContainer > UavmContainer::theUavmContainer = 0;
/**
* Return the one Uavm container or create it if it doesn't already exist.
* @return The singleton Uavm container object
*/
UavmContainer&
UavmContainer::instance()
{
if ( theUavmContainer == 0 )
{
theUavmContainer = new UavmContainer;
}
return *theUavmContainer;
}
/**
* Constructor
*/
UavmContainer::UavmContainer()
: BaseServerContainer()
{}
/**
* Copy Constructor
* @param rhs Object from which to copy
*/
UavmContainer::UavmContainer( const UavmContainer& rhs )
: BaseServerContainer(rhs)
{
if (this != &rhs)
copyRhsToThis( rhs );
}
/**
* Operator overload for "="
* @param rhs Object from which to copy
* @return Reference to this object with new data
*/
UavmContainer&
UavmContainer::operator=( const UavmContainer& rhs )
{
if ( this != &rhs )
{
BaseServerContainer::operator= (rhs);
}
return *this;
}
void UavmContainer::addServer( const Data& key, const ServerType serverType, const int maxMissedHB)
{
/// only UAVM's can be added to the UavmContainer.
if (serverType == SERVER_UAVM)
{
cpLog(LOG_DEBUG, "Adding uavm: %s to UavmContainer", key.logData());
BaseServerContainer::addServer(key, serverType, maxMissedHB);
}
else
{
cpLog( LOG_DEBUG, "Server type is not UAVM");
}
}
/**
* Copy member data from given object into this one
* @param rhs Object from which to copy
*/
void
UavmContainer::copyRhsToThis( const UavmContainer& rhs )
{
operator=(rhs);
}
/**
* Destructor
*/
UavmContainer::~UavmContainer( )
{}
void
UavmContainer::getListofActive( const ServerType type, Sptr < std::vector < Data > > & listofActiveServers )
{
cpLog( LOG_DEBUG_HB, "UavmContainer::getListofActive UAVMs");
ReadLockHelper tableHelper(tableLock);
displayLists();
for (TableIter i = serverList.begin(); i != serverList.end(); ++i)
{
if (i->second->getStatus() != Inactive)
{
listofActiveServers->push_back(i->first);
}
}
}
bool
UavmContainer::processHeartbeat( const Data& key)
{
Sptr < Server > serverPtr;
if (search( key, serverPtr) )
{
ReadLockHelper tableHelper(tableLock);
///process heartbeat and display UAVM info
serverPtr->processHeartbeat(key);
displayServer(*serverPtr);
return true;
}
else
{
return false;
}
}
void
UavmContainer::doHouseKeeping()
{
Sptr < Server > serverPtr;
cpLog( LOG_DEBUG_HB, "****** do HouseKeeping *****");
ReadLockHelper tableHelper(tableLock);
if ( !serverList.empty() )
{
for ( TableIter i = serverList.begin(); i != serverList.end(); ++i)
{
serverPtr = i->second;
if ( serverPtr->getStatus() != Inactive )
{
cpLog( LOG_DEBUG_HB, "%s", i->first.logData() );
serverPtr->doHouseKeeping(i->first);
}
}
}
else
{
cpLog( LOG_DEBUG_HB, "nothing in server container");
}
cpLog( LOG_DEBUG_HB, "****** finished HouseKeeping *****");
}
/**
* Display all of the servers in the container
*/
void UavmContainer::displayLists()
{
ReadLockHelper tableHelper(tableLock);
cpLog( LOG_DEBUG, "----------- UAVMs --------");
for (TableIter i = serverList.begin(); i != serverList.end(); ++i)
{
ServerStatus status = i->second->getStatus();
cpLog( LOG_DEBUG, "UAVM: %s, Status: %s", i->first.logData(), convertToString(status));
}
}
/// End of File
syntax highlighted by Code2HTML, v. 0.9.1