[asterisk-scf-commits] asterisk-scf/integration/servicediscovery.git branch "replication" created.
Commits to the Asterisk SCF project code repositories
asterisk-scf-commits at lists.digium.com
Sat Jan 22 17:21:03 CST 2011
branch "replication" has been created
at 6dba63805671b9ffafa67dbd7dd3a556d3451562 (commit)
- Log -----------------------------------------------------------------
commit 6dba63805671b9ffafa67dbd7dd3a556d3451562
Author: Joshua Colp <jcolp at digium.com>
Date: Sat Jan 22 19:17:42 2011 -0400
Constify the items being passed to the replicateState and removeState functions.
diff --git a/src/ServiceLocatorManagement.cpp b/src/ServiceLocatorManagement.cpp
index a0b4ff2..dc72db9 100644
--- a/src/ServiceLocatorManagement.cpp
+++ b/src/ServiceLocatorManagement.cpp
@@ -585,7 +585,7 @@ void ServiceLocatorManagementImpl::removeService(
/**
* Function which replicates state items.
*/
-void ServiceLocatorManagementImpl::replicateState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr item)
+void ServiceLocatorManagementImpl::replicateState(const AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr& item)
{
if (!item)
{
@@ -615,7 +615,7 @@ void ServiceLocatorManagementImpl::replicateState(AsteriskSCF::Core::Discovery::
/**
* Function which removes state items from the replicator.
*/
-void ServiceLocatorManagementImpl::removeState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr item)
+void ServiceLocatorManagementImpl::removeState(const AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr& item)
{
if (!item)
{
diff --git a/src/ServiceLocatorManagement.h b/src/ServiceLocatorManagement.h
index f755522..2251ad5 100644
--- a/src/ServiceLocatorManagement.h
+++ b/src/ServiceLocatorManagement.h
@@ -79,8 +79,8 @@ public:
// Replication related functions.
ServiceManagementImplPtr addService(const Ice::ObjectPrx&, const std::string&, const
Ice::Identity&);
- void replicateState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr);
- void removeState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr);
+ void replicateState(const AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr&);
+ void removeState(const AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr&);
void setStateReplicator(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateReplicatorPrx);
//
commit 57f91e2f44daef95eeb826020ac3a07cb12eb538
Author: Joshua Colp <jcolp at digium.com>
Date: Sat Jan 22 19:16:29 2011 -0400
This is no longer needed.
diff --git a/local-slice/CMakeLists.txt b/local-slice/CMakeLists.txt
deleted file mode 100644
index 94e9d7d..0000000
--- a/local-slice/CMakeLists.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-asterisk_scf_slice_include_directories("${CMAKE_SOURCE_DIR}/slice")
-asterisk_scf_compile_slice(ServiceLocatorStateReplicationIf.ice lib "Service Locator State Replicator" service_locator)
-
commit b4b9514036a1fdb9cee737ec9fd8e4d7f398366e
Author: Joshua Colp <jcolp at digium.com>
Date: Sat Jan 22 19:16:16 2011 -0400
Get to a working state once again.
diff --git a/local-slice/ServiceLocatorStateReplicationIf.ice b/local-slice/ServiceLocatorStateReplicationIf.ice
index abb8e12..c0fc4e2 100644
--- a/local-slice/ServiceLocatorStateReplicationIf.ice
+++ b/local-slice/ServiceLocatorStateReplicationIf.ice
@@ -18,7 +18,7 @@
#include <Ice/BuiltinSequences.ice>
#include <Ice/Identity.ice>
-#include "Core/Discovery/ServiceLocatorIf.ice"
+#include "AsteriskSCF/Core/Discovery/ServiceLocatorIf.ice"
module AsteriskSCF
{
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 997b6c9..b72ddb2 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -9,6 +9,11 @@
include_directories(${utils_dir}/StateReplicator/src)
include_directories(${utils_dir}/SmartProxy/src)
+include_directories(${utils_dir}/StateReplicator/include)
+include_directories(${utils_dir}/SmartProxy/include)
+
+asterisk_scf_slice_include_directories(${API_SLICE_DIR})
+
# Create the actual standalone service locator component
asterisk_scf_component_init(service_locator CXX)
diff --git a/src/ServiceLocatorManagement.h b/src/ServiceLocatorManagement.h
index 168fae9..f755522 100644
--- a/src/ServiceLocatorManagement.h
+++ b/src/ServiceLocatorManagement.h
@@ -20,7 +20,7 @@
#include <IceUtil/Shared.h>
-#include "System/Component/ReplicaIf.h"
+#include <AsteriskSCF/System/Component/ReplicaIf.h>
#include "ServiceLocatorStateReplicationIf.h"
diff --git a/src/ServiceLocatorStateListener.cpp b/src/ServiceLocatorStateListener.cpp
index 1018ad4..d4df1e5 100644
--- a/src/ServiceLocatorStateListener.cpp
+++ b/src/ServiceLocatorStateListener.cpp
@@ -19,11 +19,11 @@
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
-#include "ReplicaIf.h"
-#include "SmartProxy.h"
+#include <AsteriskSCF/System/Component/ReplicaIf.h>
+#include <AsteriskSCF/SmartProxy.h>
-#include "Core/Discovery/ServiceLocatorIf.h"
-#include "Core/Discovery/ServiceLocatorEventsIf.h"
+#include <AsteriskSCF/Core/Discovery/ServiceLocatorIf.h>
+#include <AsteriskSCF/Core/Discovery/ServiceLocatorEventsIf.h>
#include "ServiceLocatorManagement.h"
#include "ServiceManagement.h"
diff --git a/src/ServiceLocatorStateReplicator.h b/src/ServiceLocatorStateReplicator.h
index dfaf388..0dea777 100644
--- a/src/ServiceLocatorStateReplicator.h
+++ b/src/ServiceLocatorStateReplicator.h
@@ -17,12 +17,12 @@
#pragma once
#include <Ice/Ice.h>
-#include "Core/Discovery/ServiceLocatorIf.h"
-#include "Core/Discovery/ServiceLocatorEventsIf.h"
+#include <AsteriskSCF/Core/Discovery/ServiceLocatorIf.h>
+#include <AsteriskSCF/Core/Discovery/ServiceLocatorEventsIf.h>
#include "ServiceLocatorStateReplicationIf.h"
#include "ServiceLocatorManagement.h"
#include "ServiceManagement.h"
-#include "StateReplicator.h"
+#include <AsteriskSCF/StateReplicator.h>
using namespace AsteriskSCF::Core::Discovery::V1;
diff --git a/src/ServiceLocatorStateReplicatorApp.cpp b/src/ServiceLocatorStateReplicatorApp.cpp
index c125aa2..8a80f0d 100644
--- a/src/ServiceLocatorStateReplicatorApp.cpp
+++ b/src/ServiceLocatorStateReplicatorApp.cpp
@@ -21,11 +21,11 @@
#include <pjlib.h>
-#include "ServiceLocatorIf.h"
-#include "ComponentServiceIf.h"
+#include <AsteriskSCF/Core/Discovery/ServiceLocatorIf.h>
+#include <AsteriskSCF/System/Component/ComponentServiceIf.h>
#include "ServiceLocatorStateReplicator.h"
-#include "IceLogger.h"
-#include "logger.h"
+#include <AsteriskSCF/logger.h>
+#include <AsteriskSCF/Logger/IceLogger.h>
using namespace std;
using namespace AsteriskSCF::Core;
commit e443a92d5d8df9effce88c61057e355988c589e1
Author: Joshua Colp <jcolp at digium.com>
Date: Mon Jan 3 09:55:23 2011 -0400
Provide a default value for Ice::Current in the declaration so one does not need to be created before using it elsewhere.
diff --git a/src/ServiceLocatorManagement.h b/src/ServiceLocatorManagement.h
index 98ca5e7..168fae9 100644
--- a/src/ServiceLocatorManagement.h
+++ b/src/ServiceLocatorManagement.h
@@ -95,7 +95,7 @@ public:
void addCompare(const std::string&,
const AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsComparePrx&,
const Ice::Current&);
- void removeCompare(const std::string&, const Ice::Current&);
+ void removeCompare(const std::string&, const Ice::Current& = Ice::Current());
void isSupported(const std::string&,
const AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsPtr&,
diff --git a/src/ServiceLocatorStateListener.cpp b/src/ServiceLocatorStateListener.cpp
index 38d79dd..1018ad4 100644
--- a/src/ServiceLocatorStateListener.cpp
+++ b/src/ServiceLocatorStateListener.cpp
@@ -36,17 +36,18 @@ using namespace AsteriskSCF::ServiceDiscovery;
class ServiceLocatorStateReplicatorItem
{
public:
- ServiceLocatorStateReplicatorItem(ServiceLocatorManagementImplPtr locatorManagement) : mLocatorManagement(locatorManagement) { }
+ ServiceLocatorStateReplicatorItem(ServiceLocatorManagementImplPtr locatorManagement) :
+ mLocatorManagement(locatorManagement) { }
+
~ServiceLocatorStateReplicatorItem()
{
- Ice::Current current;
if (mService)
{
- mService->unregister(current);
+ mService->unregister();
}
if (!mComparator.empty())
{
- mLocatorManagement->removeCompare(mComparator, current);
+ mLocatorManagement->removeCompare(mComparator);
}
}
@@ -104,7 +105,6 @@ public:
if ((serviceState = ServiceLocatorServiceStateItemPtr::dynamicCast((*item))))
{
- Ice::Current current;
std::map<std::string, boost::shared_ptr<ServiceLocatorStateReplicatorItem> >::iterator i = mStateItems.find((*item)->key);
boost::shared_ptr<ServiceLocatorStateReplicatorItem> localitem;
@@ -124,11 +124,11 @@ public:
// The only thing that can be changed by a subsequent state item is the suspend status
if (serviceState->suspended == true)
{
- localitem->getService()->suspend(current);
+ localitem->getService()->suspend();
}
else
{
- localitem->getService()->unsuspend(current);
+ localitem->getService()->unsuspend();
}
}
else if ((paramsState = ServiceLocatorParamsStateItemPtr::dynamicCast((*item))))
@@ -142,8 +142,7 @@ public:
}
// Parameters are only ever added, they are never modified or removed
- Ice::Current current;
- i->second->getService()->addLocatorParams(paramsState->params, paramsState->compareGuid, current);
+ i->second->getService()->addLocatorParams(paramsState->params, paramsState->compareGuid);
}
else if ((comparatorState = ServiceLocatorComparatorStateItemPtr::dynamicCast((*item))))
{
diff --git a/src/ServiceManagement.h b/src/ServiceManagement.h
index 14b5b13..66fd43f 100644
--- a/src/ServiceManagement.h
+++ b/src/ServiceManagement.h
@@ -39,10 +39,10 @@ public:
//
// AsteriskSCF::Core::Discovery::V1::ServiceManagement interface.
//
- void addLocatorParams(const AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsPtr&, const std::string&, const Ice::Current&);
- void suspend(const Ice::Current&);
- void unsuspend(const Ice::Current&);
- void unregister(const Ice::Current&);
+ void addLocatorParams(const AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsPtr&, const std::string&, const Ice::Current& = Ice::Current());
+ void suspend(const Ice::Current& = Ice::Current());
+ void unsuspend(const Ice::Current& = Ice::Current());
+ void unregister(const Ice::Current& = Ice::Current());
AsteriskSCF::Core::Discovery::V1::ServiceStatus getStatus(const Ice::Current&) const { return getStatus(); }
Ice::ObjectPrx getService();
commit 3832f7809439029a156ae8c4fab6396ed7d88f03
Author: Joshua Colp <jcolp at digium.com>
Date: Mon Jan 3 09:42:26 2011 -0400
Add proper logging if a suitable proxy is not available for replication.
diff --git a/src/ServiceLocatorManagement.cpp b/src/ServiceLocatorManagement.cpp
index bec6a78..a0b4ff2 100644
--- a/src/ServiceLocatorManagement.cpp
+++ b/src/ServiceLocatorManagement.cpp
@@ -606,8 +606,9 @@ void ServiceLocatorManagementImpl::replicateState(AsteriskSCF::Core::Discovery::
ServiceLocatorStateReplicatorPrx oneway = ServiceLocatorStateReplicatorPrx::uncheckedCast(mImpl->mStateReplicator->ice_oneway());
oneway->setState(items);
}
- catch (...)
+ catch (const Ice::NoEndpointException&)
{
+ lg(Error) << "No endpoint for oneway invocation of replicateState() for state replication." << std::endl;
}
}
@@ -635,8 +636,9 @@ void ServiceLocatorManagementImpl::removeState(AsteriskSCF::Core::Discovery::V1:
ServiceLocatorStateReplicatorPrx oneway = ServiceLocatorStateReplicatorPrx::uncheckedCast(mImpl->mStateReplicator->ice_oneway());
oneway->removeState(items);
}
- catch (...)
+ catch (const Ice::NoEndpointException&)
{
+ lg(Error) << "No endpoint for oneway invocation of replicateState() for state replication." << std::endl;
}
}
commit 5a3992df4a3e1646519055b4a2f044e2c78ca3da
Author: Joshua Colp <jcolp at digium.com>
Date: Mon Jan 3 09:35:33 2011 -0400
Since only one item is ever passed to replicateState and removeState simply make it accept the base class.
diff --git a/src/ServiceLocatorManagement.cpp b/src/ServiceLocatorManagement.cpp
index 73e24c2..bec6a78 100644
--- a/src/ServiceLocatorManagement.cpp
+++ b/src/ServiceLocatorManagement.cpp
@@ -108,7 +108,7 @@ public:
mStateItem->key = IceUtil::generateUUID();
mStateItem->name = name;
mStateItem->comparator = compare;
- mManagement->replicateState(0, 0, mStateItem);
+ mManagement->replicateState(mStateItem);
}
/**
@@ -117,7 +117,7 @@ public:
*/
~ServiceLocatorComparator()
{
- mManagement->removeState(0, 0, mStateItem);
+ mManagement->removeState(mStateItem);
}
/**
@@ -585,10 +585,13 @@ void ServiceLocatorManagementImpl::removeService(
/**
* Function which replicates state items.
*/
-void ServiceLocatorManagementImpl::replicateState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr service,
- AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr params,
- AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr comparator)
+void ServiceLocatorManagementImpl::replicateState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr item)
{
+ if (!item)
+ {
+ return;
+ }
+
if (!mImpl->mStateReplicator || mImpl->mReplicaService->isActive() == false)
{
return;
@@ -596,25 +599,7 @@ void ServiceLocatorManagementImpl::replicateState(AsteriskSCF::Core::Discovery::
ServiceLocatorStateItemSeq items;
- if (service)
- {
- items.push_back(service);
- }
-
- if (params)
- {
- items.push_back(params);
- }
-
- if (comparator)
- {
- items.push_back(comparator);
- }
-
- if (items.size() == 0)
- {
- return;
- }
+ items.push_back(item);
try
{
@@ -629,10 +614,13 @@ void ServiceLocatorManagementImpl::replicateState(AsteriskSCF::Core::Discovery::
/**
* Function which removes state items from the replicator.
*/
-void ServiceLocatorManagementImpl::removeState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr service,
- AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr params,
- AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr comparator)
+void ServiceLocatorManagementImpl::removeState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr item)
{
+ if (!item)
+ {
+ return;
+ }
+
if (!mImpl->mStateReplicator || mImpl->mReplicaService->isActive() == false)
{
return;
@@ -640,25 +628,7 @@ void ServiceLocatorManagementImpl::removeState(AsteriskSCF::Core::Discovery::V1:
Ice::StringSeq items;
- if (service)
- {
- items.push_back(service->key);
- }
-
- if (params)
- {
- items.push_back(params->key);
- }
-
- if (comparator)
- {
- items.push_back(comparator->key);
- }
-
- if (items.size() == 0)
- {
- return;
- }
+ items.push_back(item->key);
try
{
diff --git a/src/ServiceLocatorManagement.h b/src/ServiceLocatorManagement.h
index b80aaec..98ca5e7 100644
--- a/src/ServiceLocatorManagement.h
+++ b/src/ServiceLocatorManagement.h
@@ -79,12 +79,8 @@ public:
// Replication related functions.
ServiceManagementImplPtr addService(const Ice::ObjectPrx&, const std::string&, const
Ice::Identity&);
- void replicateState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr,
- AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr,
- AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr);
- void removeState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr,
- AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr,
- AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr);
+ void replicateState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr);
+ void removeState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr);
void setStateReplicator(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateReplicatorPrx);
//
diff --git a/src/ServiceManagement.cpp b/src/ServiceManagement.cpp
index bedbecf..13fddf6 100644
--- a/src/ServiceManagement.cpp
+++ b/src/ServiceManagement.cpp
@@ -64,12 +64,12 @@ public:
mStateItem->serviceKey = serviceState->key;
mStateItem->params = params;
mStateItem->compareGuid = compareGuid;
- mManagement->replicateState(0, mStateItem, 0);
+ mManagement->replicateState(mStateItem);
}
~ServiceLocatorParamsSpec()
{
- mManagement->removeState(0, mStateItem, 0);
+ mManagement->removeState(mStateItem);
}
void isSupported(const AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsPtr&, const IsSupportedCallbackPtr&);
@@ -108,7 +108,7 @@ public:
{
mLocatorTopic->serviceRegistered(guid);
}
- mManagement->replicateState(mStateItem, 0, 0);
+ mManagement->replicateState(mStateItem);
}
/**
@@ -328,7 +328,7 @@ void ServiceManagementImpl::suspend(const Ice::Current&)
{
lg(Info) << "Suspending " << mImpl->mStateItem->guid << " " << mImpl->mStateItem->service->ice_toString();
mImpl->mStateItem->suspended = true;
- mImpl->mManagement->replicateState(mImpl->mStateItem, 0, 0);
+ mImpl->mManagement->replicateState(mImpl->mStateItem);
}
if (mImpl->mLocatorTopic)
@@ -348,7 +348,7 @@ void ServiceManagementImpl::unsuspend(const Ice::Current&)
{
lg(Info) << "Un-suspending " << mImpl->mStateItem->guid << " " << mImpl->mStateItem->service->ice_toString();
mImpl->mStateItem->suspended = false;
- mImpl->mManagement->replicateState(mImpl->mStateItem, 0, 0);
+ mImpl->mManagement->replicateState(mImpl->mStateItem);
}
if (mImpl->mLocatorTopic)
@@ -380,7 +380,7 @@ void ServiceManagementImpl::unregister(const Ice::Current&)
*/
lg(Info) << "Un-register " << mImpl->mStateItem->guid << " " << mImpl->mStateItem->service->ice_toString();
- mImpl->mManagement->removeState(mImpl->mStateItem, 0, 0);
+ mImpl->mManagement->removeState(mImpl->mStateItem);
mImpl->mAdapter->remove(mImpl->mManagementPrx->ice_getIdentity());
commit c6702d31128aab08e903ed8942374208101853df
Author: Joshua Colp <jcolp at digium.com>
Date: Mon Jan 3 09:28:21 2011 -0400
If we can't talk to the state replicator for some reason give more detail on why not if an exception is thrown.
diff --git a/src/ServiceLocator.cpp b/src/ServiceLocator.cpp
index 5ffdfa6..1eee03a 100644
--- a/src/ServiceLocator.cpp
+++ b/src/ServiceLocator.cpp
@@ -259,6 +259,10 @@ void ServiceLocatorApp::start(const string& name, const Ice::CommunicatorPtr& co
lg(Info) << "Operating in an active state and pushing updates." << endl;
}
}
+ catch (const std::exception& e)
+ {
+ lg(Info) << "Operating in an active and standalone state since we got an exception: " << e.what() << endl;
+ }
catch (...)
{
// If we reach this point then no state replicator is present and we are acting in a stand-alone fashion
commit 7bb626f8158bc6ebf94a38cb924c15b19af9c389
Author: Joshua Colp <jcolp at digium.com>
Date: Mon Jan 3 09:23:32 2011 -0400
Don't prefix local variables with m, since they aren't member variables.
diff --git a/src/ServiceLocator.cpp b/src/ServiceLocator.cpp
index accd7d7..5ffdfa6 100644
--- a/src/ServiceLocator.cpp
+++ b/src/ServiceLocator.cpp
@@ -243,15 +243,15 @@ void ServiceLocatorApp::start(const string& name, const Ice::CommunicatorPtr& co
try
{
mStateReplicator = ServiceLocatorStateReplicatorPrx::checkedCast(communicator->propertyToProxy("ServiceLocator.StateReplicator.Proxy"));
- ServiceLocatorStateReplicatorListenerPtr mReplicatorListener = new ServiceLocatorStateReplicatorListenerI(locatorServiceManagement);
- ServiceLocatorStateReplicatorListenerPrx mReplicatorListenerProxy = ServiceLocatorStateReplicatorListenerPrx::uncheckedCast(mLocalAdapter->addWithUUID(mReplicatorListener));
+ ServiceLocatorStateReplicatorListenerPtr replicatorListener = new ServiceLocatorStateReplicatorListenerI(locatorServiceManagement);
+ ServiceLocatorStateReplicatorListenerPrx replicatorListenerProxy = ServiceLocatorStateReplicatorListenerPrx::uncheckedCast(mLocalAdapter->addWithUUID(replicatorListener));
locatorServiceManagement->setStateReplicator(mStateReplicator);
if (communicator->getProperties()->getPropertyWithDefault("ServiceLocatorStateReplicatorListener", "no") == "yes")
{
mReplicaService->standby();
- mStateReplicator->addListener(mReplicatorListenerProxy);
+ mStateReplicator->addListener(replicatorListenerProxy);
lg(Info) << "Operating as a standby replica." << endl;
}
else
commit 3c3c3e655aae318e216b2c1ba4ad93fcc635c60b
Author: Joshua Colp <jcolp at digium.com>
Date: Mon Jan 3 09:22:08 2011 -0400
Get rid of the logger adapter in favor of the local adapter.
diff --git a/src/ServiceLocator.cpp b/src/ServiceLocator.cpp
index 5d846fe..accd7d7 100644
--- a/src/ServiceLocator.cpp
+++ b/src/ServiceLocator.cpp
@@ -57,7 +57,6 @@ private:
Ice::ObjectAdapterPtr mLocalAdapter;
Ice::ObjectAdapterPtr mDiscoveryAdapter;
Ice::ObjectAdapterPtr mManagementAdapter;
- Ice::ObjectAdapterPtr mLoggerAdapter;
AsteriskSCF::ServiceDiscovery::CollocatedIceStormPtr mIceStorm;
ReplicaPtr mReplicaService;
ServiceLocatorStateReplicatorPrx mStateReplicator;
@@ -170,13 +169,13 @@ void ServiceLocatorApp::start(const string& name, const Ice::CommunicatorPtr& co
{
mIceStorm = new AsteriskSCF::ServiceDiscovery::CollocatedIceStorm("AsteriskSCFIceStorm", communicator->getProperties());
- mLoggerAdapter = communicator->createObjectAdapter("LoggerAdapter");
+ mLocalAdapter = communicator->createObjectAdapter("ServiceLocatorLocalAdapter");
- ConfiguredIceLoggerPtr mIceLogger = createIceLogger(mLoggerAdapter);
+ ConfiguredIceLoggerPtr mIceLogger = createIceLogger(mLocalAdapter);
getLoggerFactory().setLogOutput(mIceLogger->getLogger());
- mLoggerAdapter->activate();
+ mLocalAdapter->activate();
lg(Info) << "Initializing service discovery component";
@@ -223,14 +222,9 @@ void ServiceLocatorApp::start(const string& name, const Ice::CommunicatorPtr& co
lg(Info) << "IceStorm topic manager proxy not present, events disabled.";
}
- mLocalAdapter = communicator->createObjectAdapter(
- "ServiceLocatorLocalAdapter");
-
mReplicaService = new ReplicaImpl(mLocalAdapter);
mLocalAdapter->add(mReplicaService, communicator->stringToIdentity(ReplicaServiceId));
- mLocalAdapter->activate();
-
/* Management and discovery use separate adapters to provide a level of security,
* management may want to be protected so arbitrary people can't inject bad services
* into the infrastructure while discovery as a read only function may be allowed to all.
commit 8158ae940a21e1a82bc460ae4777dfb00ddef155
Author: Joshua Colp <jcolp at digium.com>
Date: Mon Jan 3 09:20:36 2011 -0400
Constify the passing of the locator service management pointer.
diff --git a/src/ServiceLocator.cpp b/src/ServiceLocator.cpp
index dcd9c82..5d846fe 100644
--- a/src/ServiceLocator.cpp
+++ b/src/ServiceLocator.cpp
@@ -124,7 +124,7 @@ private:
class ServiceLocatorImpl : public ServiceLocator
{
public:
- ServiceLocatorImpl(ServiceLocatorManagementImplPtr LocatorServiceManagement) :
+ ServiceLocatorImpl(const ServiceLocatorManagementImplPtr& LocatorServiceManagement) :
mLocatorServiceManagement(LocatorServiceManagement) { };
/**
* Asynchronously locate a service for the given parameters.
commit 12f5496c2f3eda95ff7c9fc8808dc2bf15102ca2
Author: Joshua Colp <jcolp at digium.com>
Date: Mon Jan 3 09:17:59 2011 -0400
Don't prefix state items with m, and don't call a comparator proxy a service call it a comparator.
diff --git a/local-slice/ServiceLocatorStateReplicationIf.ice b/local-slice/ServiceLocatorStateReplicationIf.ice
index 7d4c71f..abb8e12 100644
--- a/local-slice/ServiceLocatorStateReplicationIf.ice
+++ b/local-slice/ServiceLocatorStateReplicationIf.ice
@@ -57,23 +57,23 @@ module V1
class ServiceLocatorServiceStateItem extends ServiceLocatorStateItem
{
- bool mSuspended;
- Object *mService;
- Ice::Identity mManagementIdentity;
- string mGuid;
+ bool suspended;
+ Object *service;
+ Ice::Identity managementIdentity;
+ string guid;
};
class ServiceLocatorParamsStateItem extends ServiceLocatorStateItem
{
- string mServiceKey;
- ServiceLocatorParams mParams;
- string mCompareGuid;
+ string serviceKey;
+ ServiceLocatorParams params;
+ string compareGuid;
};
class ServiceLocatorComparatorStateItem extends ServiceLocatorStateItem
{
- string mName;
- ServiceLocatorParamsCompare *mService;
+ string name;
+ ServiceLocatorParamsCompare *comparator;
};
}; //module V1
diff --git a/src/ServiceLocatorManagement.cpp b/src/ServiceLocatorManagement.cpp
index 60e4bff..73e24c2 100644
--- a/src/ServiceLocatorManagement.cpp
+++ b/src/ServiceLocatorManagement.cpp
@@ -106,8 +106,8 @@ public:
mStateItem(new ServiceLocatorComparatorStateItem())
{
mStateItem->key = IceUtil::generateUUID();
- mStateItem->mName = name;
- mStateItem->mService = compare;
+ mStateItem->name = name;
+ mStateItem->comparator = compare;
mManagement->replicateState(0, 0, mStateItem);
}
@@ -137,7 +137,7 @@ public:
Ice::CallbackPtr d = Ice::newCallback(iceCallback,
&Comparator_IsSupported_Callback::finished);
// async forward to the comparator
- mStateItem->mService->begin_isSupported(params, d);
+ mStateItem->comparator->begin_isSupported(params, d);
}
private:
/**
diff --git a/src/ServiceLocatorStateListener.cpp b/src/ServiceLocatorStateListener.cpp
index e6bb3fd..38d79dd 100644
--- a/src/ServiceLocatorStateListener.cpp
+++ b/src/ServiceLocatorStateListener.cpp
@@ -113,7 +113,7 @@ public:
boost::shared_ptr<ServiceLocatorStateReplicatorItem> newitem(new ServiceLocatorStateReplicatorItem(mLocatorManagement));
localitem = newitem;
mStateItems.insert(std::make_pair((*item)->key, newitem));
- ServiceManagementImplPtr service = mLocatorManagement->addService(serviceState->mService, serviceState->mGuid, serviceState->mManagementIdentity);
+ ServiceManagementImplPtr service = mLocatorManagement->addService(serviceState->service, serviceState->guid, serviceState->managementIdentity);
newitem->setService(service);
}
else
@@ -122,7 +122,7 @@ public:
}
// The only thing that can be changed by a subsequent state item is the suspend status
- if (serviceState->mSuspended == true)
+ if (serviceState->suspended == true)
{
localitem->getService()->suspend(current);
}
@@ -134,7 +134,7 @@ public:
else if ((paramsState = ServiceLocatorParamsStateItemPtr::dynamicCast((*item))))
{
// This is special, we have to find the respective service and then add parameters to it
- std::map<std::string, boost::shared_ptr<ServiceLocatorStateReplicatorItem> >::iterator i = mStateItems.find(paramsState->mServiceKey);
+ std::map<std::string, boost::shared_ptr<ServiceLocatorStateReplicatorItem> >::iterator i = mStateItems.find(paramsState->serviceKey);
if ((i == mStateItems.end()))
{
@@ -143,7 +143,7 @@ public:
// Parameters are only ever added, they are never modified or removed
Ice::Current current;
- i->second->getService()->addLocatorParams(paramsState->mParams, paramsState->mCompareGuid, current);
+ i->second->getService()->addLocatorParams(paramsState->params, paramsState->compareGuid, current);
}
else if ((comparatorState = ServiceLocatorComparatorStateItemPtr::dynamicCast((*item))))
{
@@ -158,10 +158,10 @@ public:
try
{
Ice::Current current;
- mLocatorManagement->addCompare(comparatorState->mName, comparatorState->mService, current);
+ mLocatorManagement->addCompare(comparatorState->name, comparatorState->comparator, current);
boost::shared_ptr<ServiceLocatorStateReplicatorItem> newitem(new ServiceLocatorStateReplicatorItem(mLocatorManagement));
mStateItems.insert(std::make_pair((*item)->key, newitem));
- newitem->setComparator(comparatorState->mName);
+ newitem->setComparator(comparatorState->name);
}
catch (...)
{
diff --git a/src/ServiceManagement.cpp b/src/ServiceManagement.cpp
index 5d8960d..bedbecf 100644
--- a/src/ServiceManagement.cpp
+++ b/src/ServiceManagement.cpp
@@ -61,9 +61,9 @@ public:
mManagement(management)
{
mStateItem->key = IceUtil::generateUUID();
- mStateItem->mServiceKey = serviceState->key;
- mStateItem->mParams = params;
- mStateItem->mCompareGuid = compareGuid;
+ mStateItem->serviceKey = serviceState->key;
+ mStateItem->params = params;
+ mStateItem->compareGuid = compareGuid;
mManagement->replicateState(0, mStateItem, 0);
}
@@ -99,11 +99,11 @@ public:
mManagement(management), mAdapter(adapter), mLocatorTopic(serviceDiscoveryTopic)
{
mStateItem->key = IceUtil::generateUUID();
- mStateItem->mSuspended = false;
- mStateItem->mService = service;
- mStateItem->mGuid = guid;
+ mStateItem->suspended = false;
+ mStateItem->service = service;
+ mStateItem->guid = guid;
mManagementPrx = ServiceManagementPrx::uncheckedCast(mAdapter->add(impl, identity));
- mStateItem->mManagementIdentity = identity;
+ mStateItem->managementIdentity = identity;
if (mLocatorTopic)
{
mLocatorTopic->serviceRegistered(guid);
@@ -169,7 +169,7 @@ ServiceManagementImpl::ServiceManagementImpl(ServiceLocatorManagementImplPtr man
*/
Ice::ObjectPrx ServiceManagementImpl::getService()
{
- return mImpl->mStateItem->mService;
+ return mImpl->mStateItem->service;
}
/**
@@ -245,7 +245,7 @@ void ServiceManagementImpl::isSupported(const ServiceLocatorParamsPtr& params, c
/* If this service is suspended we can just skip the entire check and
* return false now, easy as pie
*/
- if (mImpl->mStateItem->mSuspended)
+ if (mImpl->mStateItem->suspended)
{
lg(Debug) << " ...isSupported(" << params->category << ") = false (suspended)\n";
callback->result(false);
@@ -266,7 +266,7 @@ void ServiceManagementImpl::isSupported(const ServiceLocatorParamsPtr& params, c
const std::string& ServiceManagementImpl::getGuid() const
{
- return mImpl->mStateItem->mGuid;
+ return mImpl->mStateItem->guid;
}
/**
@@ -288,15 +288,15 @@ void ServiceLocatorParamsSpec::isSupported(const ServiceLocatorParamsPtr& params
}
/* This is just a simple comparison that acts as a preliminary, and
* perhaps final, check */
- else if (mStateItem->mParams->category != params->category)
+ else if (mStateItem->params->category != params->category)
{
lg(Debug) << " ...isSupported(" << params->category << ") = false (different categories)\n";
callback->result(false);
}
/* If a comparator was provided then yield to it for a final yay or nay */
- else if (!mStateItem->mCompareGuid.empty())
+ else if (!mStateItem->compareGuid.empty())
{
- mManagement->isSupported(mStateItem->mCompareGuid, params, callback);
+ mManagement->isSupported(mStateItem->compareGuid, params, callback);
}
/* category matches, no comparator to turn us down. it's a match. */
else
@@ -324,16 +324,16 @@ void ServiceManagementImpl::suspend(const Ice::Current&)
{
boost::unique_lock<boost::shared_mutex> lock(mImpl->mLock);
- if (!mImpl->mStateItem->mSuspended)
+ if (!mImpl->mStateItem->suspended)
{
- lg(Info) << "Suspending " << mImpl->mStateItem->mGuid << " " << mImpl->mStateItem->mService->ice_toString();
- mImpl->mStateItem->mSuspended = true;
+ lg(Info) << "Suspending " << mImpl->mStateItem->guid << " " << mImpl->mStateItem->service->ice_toString();
+ mImpl->mStateItem->suspended = true;
mImpl->mManagement->replicateState(mImpl->mStateItem, 0, 0);
}
if (mImpl->mLocatorTopic)
{
- mImpl->mLocatorTopic->serviceSuspended(mImpl->mStateItem->mGuid);
+ mImpl->mLocatorTopic->serviceSuspended(mImpl->mStateItem->guid);
}
}
@@ -344,23 +344,23 @@ void ServiceManagementImpl::unsuspend(const Ice::Current&)
{
boost::unique_lock<boost::shared_mutex> lock(mImpl->mLock);
- if (mImpl->mStateItem->mSuspended)
+ if (mImpl->mStateItem->suspended)
{
- lg(Info) << "Un-suspending " << mImpl->mStateItem->mGuid << " " << mImpl->mStateItem->mService->ice_toString();
- mImpl->mStateItem->mSuspended = false;
+ lg(Info) << "Un-suspending " << mImpl->mStateItem->guid << " " << mImpl->mStateItem->service->ice_toString();
+ mImpl->mStateItem->suspended = false;
mImpl->mManagement->replicateState(mImpl->mStateItem, 0, 0);
}
if (mImpl->mLocatorTopic)
{
- mImpl->mLocatorTopic->serviceUnsuspended(mImpl->mStateItem->mGuid);
+ mImpl->mLocatorTopic->serviceUnsuspended(mImpl->mStateItem->guid);
}
}
ServiceStatus ServiceManagementImpl::getStatus() const
{
boost::unique_lock<boost::shared_mutex> lock(mImpl->mLock);
- if (mImpl->mStateItem->mSuspended)
+ if (mImpl->mStateItem->suspended)
{
return Suspended;
}
@@ -378,7 +378,7 @@ void ServiceManagementImpl::unregister(const Ice::Current&)
/* You'll notice no lock here. That's because we aren't actually modifying any internal state that should
* be protected, and if we did lock here there is a chance for a deadlock which is super sad.
*/
- lg(Info) << "Un-register " << mImpl->mStateItem->mGuid << " " << mImpl->mStateItem->mService->ice_toString();
+ lg(Info) << "Un-register " << mImpl->mStateItem->guid << " " << mImpl->mStateItem->service->ice_toString();
mImpl->mManagement->removeState(mImpl->mStateItem, 0, 0);
@@ -388,7 +388,7 @@ void ServiceManagementImpl::unregister(const Ice::Current&)
if (mImpl->mLocatorTopic)
{
- mImpl->mLocatorTopic->serviceUnregistered(mImpl->mStateItem->mGuid);
+ mImpl->mLocatorTopic->serviceUnregistered(mImpl->mStateItem->guid);
}
}
commit 78153456f35531d951bd20a0be9db7241a28bf3d
Author: Joshua Colp <jcolp at digium.com>
Date: Mon Dec 20 08:40:24 2010 -0400
Remove service locator details from service locator replication slice. The proxies have to be specified in the configuration.
diff --git a/local-slice/ServiceLocatorStateReplicationIf.ice b/local-slice/ServiceLocatorStateReplicationIf.ice
index c475cf8..7d4c71f 100644
--- a/local-slice/ServiceLocatorStateReplicationIf.ice
+++ b/local-slice/ServiceLocatorStateReplicationIf.ice
@@ -32,14 +32,6 @@ module Discovery
["suppress"]
module V1
{
- const string StateReplicatorComponentCategory = "ServiceLocatorStateReplicatorComponent";
- const string StateReplicatorDiscoveryCategory = "ServiceLocatorStateReplicator";
-
- class ServiceLocatorStateReplicatorParams extends AsteriskSCF::Core::Discovery::V1::ServiceLocatorParams
- {
- string mName;
- };
-
class ServiceLocatorStateItem
{
string key;
commit ffa80ea5f956ca2c043576e6f260c5a2497e5f8f
Author: Joshua Colp <jcolp at digium.com>
Date: Sun Dec 19 10:01:31 2010 -0400
Be more descriptive in debug messages about why an isSupported call is true or false.
diff --git a/src/ServiceManagement.cpp b/src/ServiceManagement.cpp
index 15ad1d2..5d8960d 100644
--- a/src/ServiceManagement.cpp
+++ b/src/ServiceManagement.cpp
@@ -247,6 +247,7 @@ void ServiceManagementImpl::isSupported(const ServiceLocatorParamsPtr& params, c
*/
if (mImpl->mStateItem->mSuspended)
{
+ lg(Debug) << " ...isSupported(" << params->category << ") = false (suspended)\n";
callback->result(false);
return;
}
@@ -282,12 +283,14 @@ void ServiceLocatorParamsSpec::isSupported(const ServiceLocatorParamsPtr& params
// everything/anything, so give it to them
if (params->category.empty())
{
+ lg(Debug) << " ...isSupported(" << params->category << ") = true (empty category)\n";
callback->result(true);
}
/* This is just a simple comparison that acts as a preliminary, and
* perhaps final, check */
else if (mStateItem->mParams->category != params->category)
{
+ lg(Debug) << " ...isSupported(" << params->category << ") = false (different categories)\n";
callback->result(false);
}
/* If a comparator was provided then yield to it for a final yay or nay */
commit 3a037bcd3d5c056aa516d3e1661b482736e63467
Author: Joshua Colp <jcolp at digium.com>
Date: Sun Dec 19 10:00:54 2010 -0400
Use a boost::shared_ptr so the parameters state item does not get prematurely removed.
diff --git a/src/ServiceManagement.cpp b/src/ServiceManagement.cpp
index 5de72bf..15ad1d2 100644
--- a/src/ServiceManagement.cpp
+++ b/src/ServiceManagement.cpp
@@ -19,6 +19,7 @@
#include <boost/thread.hpp>
#include <boost/thread/shared_mutex.hpp>
+#include <boost/shared_ptr.hpp>
#include <AsteriskSCF/Core/Discovery/ServiceLocatorIf.h>
#include <AsteriskSCF/Core/Discovery/ServiceLocatorEventsIf.h>
@@ -138,7 +139,7 @@ public:
/**
* A vector of locator parameters that this service supports.
*/
- std::vector<ServiceLocatorParamsSpec> mSupportedLocatorParams;
+ std::vector< boost::shared_ptr<ServiceLocatorParamsSpec> > mSupportedLocatorParams;
/**
* A proxy that can be used to publish events to the service locator topic.
@@ -253,12 +254,12 @@ void ServiceManagementImpl::isSupported(const ServiceLocatorParamsPtr& params, c
IsSupportedCallbackPtr myCallback = new CountedIsSupported(
callback, mImpl->mSupportedLocatorParams.size());
- for (vector<ServiceLocatorParamsSpec>::iterator
+ for (vector<boost::shared_ptr<ServiceLocatorParamsSpec>>::iterator
spec = mImpl->mSupportedLocatorParams.begin();
spec != mImpl->mSupportedLocatorParams.end();
++spec)
{
- spec->isSupported(params, myCallback);
+ (*spec)->isSupported(params, myCallback);
}
}
@@ -308,7 +309,7 @@ void ServiceManagementImpl::addLocatorParams(const ServiceLocatorParamsPtr& para
{
boost::unique_lock<boost::shared_mutex> lock(mImpl->mLock);
- ServiceLocatorParamsSpec spec(params, compareGuid, mImpl->mManagement, mImpl->mStateItem);
+ boost::shared_ptr<ServiceLocatorParamsSpec> spec(new ServiceLocatorParamsSpec(params, compareGuid, mImpl->mManagement, mImpl->mStateItem));
mImpl->mSupportedLocatorParams.push_back(spec);
}
commit 55d5ae61ad3fa1583e29c5ce2c7c65fc7e24ab50
Author: Joshua Colp <jcolp at digium.com>
Date: Sun Dec 19 09:54:19 2010 -0400
Pass the service state item into the parameters spec so the key can be copied.
diff --git a/src/ServiceManagement.cpp b/src/ServiceManagement.cpp
index 89a0190..5de72bf 100644
--- a/src/ServiceManagement.cpp
+++ b/src/ServiceManagement.cpp
@@ -53,12 +53,14 @@ class ServiceLocatorParamsSpec
public:
ServiceLocatorParamsSpec(const ServiceLocatorParamsPtr& params,
const std::string& compareGuid,
- ServiceLocatorManagementImplPtr management)
+ ServiceLocatorManagementImplPtr management,
+ ServiceLocatorServiceStateItemPtr serviceState)
:
mStateItem(new ServiceLocatorParamsStateItem()),
mManagement(management)
{
mStateItem->key = IceUtil::generateUUID();
+ mStateItem->mServiceKey = serviceState->key;
mStateItem->mParams = params;
mStateItem->mCompareGuid = compareGuid;
mManagement->replicateState(0, mStateItem, 0);
@@ -306,7 +308,7 @@ void ServiceManagementImpl::addLocatorParams(const ServiceLocatorParamsPtr& para
{
boost::unique_lock<boost::shared_mutex> lock(mImpl->mLock);
- ServiceLocatorParamsSpec spec(params, compareGuid, mImpl->mManagement);
+ ServiceLocatorParamsSpec spec(params, compareGuid, mImpl->mManagement, mImpl->mStateItem);
mImpl->mSupportedLocatorParams.push_back(spec);
}
commit db89112f4d059757e6ad1d32a4f500e9a4412e7c
Author: Joshua Colp <jcolp at digium.com>
Date: Sun Dec 19 09:10:11 2010 -0400
Fix a race condition where it was possible for the service locator to think it was active, thus replicating to itself for a small period of time.
diff --git a/src/ServiceLocator.cpp b/src/ServiceLocator.cpp
index 59ebe3d..dcd9c82 100644
--- a/src/ServiceLocator.cpp
+++ b/src/ServiceLocator.cpp
@@ -256,8 +256,8 @@ void ServiceLocatorApp::start(const string& name, const Ice::CommunicatorPtr& co
if (communicator->getProperties()->getPropertyWithDefault("ServiceLocatorStateReplicatorListener", "no") == "yes")
{
+ mReplicaService->standby();
mStateReplicator->addListener(mReplicatorListenerProxy);
- mReplicaService->standby();
lg(Info) << "Operating as a standby replica." << endl;
}
else
commit b37ab5655657a54fd0a1fc053d02ff2a1cbd23d8
Author: Joshua Colp <jcolp at digium.com>
Date: Sun Dec 19 09:09:31 2010 -0400
Update configuration files and add new ones for state replicator.
diff --git a/config/test_service_locator.config b/config/test_service_locator.config
index d058ee6..2ad533f 100644
--- a/config/test_service_locator.config
+++ b/config/test_service_locator.config
@@ -47,10 +47,17 @@ AsteriskSCFIceStorm.Flush.Timeout=2000
# Test endpoints for the service locator management adapter
ServiceLocatorManagementAdapter.Endpoints=tcp -p 4422
+# Test endpoints for the service locator local adapter
+ServiceLocatorLocalAdapter.Endpoints=tcp -p 4412
+
# Test endpoints for the service locator adapter
ServiceLocatorAdapter.Endpoints=tcp -p 4411
LocatorService.Proxy=LocatorService:tcp -p 4411
+ServiceLocator.StateReplicator.Proxy=ServiceLocatorStateReplicatorService:tcp -p 4413
+
+ServiceLocatorStateReplicatorListener=no
+
# Test endpoints for IceStorm
TopicManager.Proxy=AsteriskSCFIceStorm/TopicManager:default -p 10000
diff --git a/config/test_service_locator.config b/config/test_service_locator_listener.config
similarity index 86%
copy from config/test_service_locator.config
copy to config/test_service_locator_listener.config
index d058ee6..12f1482 100644
--- a/config/test_service_locator.config
+++ b/config/test_service_locator_listener.config
@@ -47,10 +47,17 @@ AsteriskSCFIceStorm.Flush.Timeout=2000
# Test endpoints for the service locator management adapter
ServiceLocatorManagementAdapter.Endpoints=tcp -p 4422
+# Test endpoints for the service locator local adapter
+ServiceLocatorLocalAdapter.Endpoints=tcp -p 4412
+
# Test endpoints for the service locator adapter
ServiceLocatorAdapter.Endpoints=tcp -p 4411
LocatorService.Proxy=LocatorService:tcp -p 4411
+ServiceLocator.StateReplicator.Proxy=ServiceLocatorStateReplicatorService:tcp -p 4413
+
+ServiceLocatorStateReplicatorListener=yes
+
# Test endpoints for IceStorm
TopicManager.Proxy=AsteriskSCFIceStorm/TopicManager:default -p 10000
diff --git a/config/test_servicelocator_state_replicator.conf b/config/test_servicelocator_state_replicator.conf
new file mode 100644
index 0000000..98a48d4
--- /dev/null
+++ b/config/test_servicelocator_state_replicator.conf
@@ -0,0 +1,11 @@
+# Adapter parameters for this component
+ServiceLocatorStateReplicator.Endpoints=tcp -p 4413:udp -p 4413
+ServiceLocatorStateReplicator.ThreadPool.Size=4
+
+# A proxy to the IceStorm topic manager
+TopicManager.Proxy=AsteriskSCFIceStorm/TopicManager:default -p 10000
+
+LocatorService.Proxy=LocatorService:tcp -p 4411
+
+IceBox.InheritProperties=1
+IceBox.Service.ServiceLocatorStateReplicator=ServiceLocatorStateReplicator:create
commit 111b4673736e29555052b53dfd4d920cc593b9ed
Author: Joshua Colp <jcolp at digium.com>
Date: Thu Dec 16 11:08:58 2010 -0400
Get the service locator talking to the state replicator and pushing out state items.
diff --git a/config/test_component.config.in b/config/test_component.config.in
index b793c27..6d13371 100644
--- a/config/test_component.config.in
+++ b/config/test_component.config.in
@@ -40,11 +40,20 @@ AsteriskSCFIceStorm.Trace.TopicManager=2
#
AsteriskSCFIceStorm.Flush.Timeout=2000
+# Service Locator State Replicator Configuration
+IceBox.Service.ServiceDiscoveryStateReplicator=../src at ServiceLocatorStateReplicator:create
+
+# Test endpoints for the state replicator
+ServiceLocatorStateReplicator.Endpoints=tcp -p 4413:udp -p 4413
+
#
# ServiceDiscovery configuration
#
IceBox.Service.ServiceDiscovery=../src at service_locator:create
+# Test endpoints for the service locator local adapter
+ServiceLocatorLocalAdapter.Endpoints=tcp -p 4412
+
# Test endpoints for the service locator management adapter
ServiceLocatorManagementAdapter.Endpoints=tcp -p 4422
@@ -54,6 +63,12 @@ ServiceLocatorAdapter.Endpoints=tcp -p 4411
# Test endpoints for IceStorm
TopicManager.Proxy=AsteriskSCFIceStorm/TopicManager:default -p 10000
+# Proxy to the state replicator
+ServiceLocator.StateReplicator.Proxy=ServiceLocatorStateReplicatorService:tcp -p 4413
+
+# Configure ourselves as a master
+ServiceLocatorStateReplicatorListener=no
+
#
# Logger configuration
#
@@ -70,4 +85,4 @@ ServiceLocatorManagement.proxy=ServiceLocatorManagement:tcp -p 4422
#
# IceBox load order
#
-IceBox.LoadOrder=ServiceDiscovery,ServiceDiscoveryTest
+IceBox.LoadOrder=ServiceDiscoveryStateReplicator,ServiceDiscovery,ServiceDiscoveryTest
diff --git a/src/ServiceLocator.cpp b/src/ServiceLocator.cpp
index 9c4f70b..59ebe3d 100644
--- a/src/ServiceLocator.cpp
+++ b/src/ServiceLocator.cpp
@@ -22,9 +22,11 @@
#include <AsteriskSCF/Core/Discovery/ServiceLocatorEventsIf.h>
#include <AsteriskSCF/logger.h>
#include <AsteriskSCF/Logger/IceLogger.h>
+#include <AsterisksCF/System/Component/ReplicaIf.h>
#include "ServiceLocatorManagement.h"
#include "ServiceManagement.h"
+#include "ServiceLocatorStateReplicator.h"
#include "CollocatedIceStorm.h"
using namespace std;
@@ -32,11 +34,14 @@ using namespace AsteriskSCF::System::Discovery;
using namespace AsteriskSCF::System::Logging;
using namespace AsteriskSCF::Core::Discovery::V1;
using namespace AsteriskSCF::ServiceDiscovery;
+using namespace AsteriskSCF::System::Component::V1;
namespace
{
Logger const &lg = getLoggerFactory().getLogger("AsteriskSCF.System.Discovery");
+static const string ReplicaServiceId("ServiceLocatorReplica");
+
/**
* Implementation of the Ice::Application class
*/
@@ -49,10 +54,68 @@ public:
void stop();
private:
+ Ice::ObjectAdapterPtr mLocalAdapter;
Ice::ObjectAdapterPtr mDiscoveryAdapter;
Ice::ObjectAdapterPtr mManagementAdapter;
Ice::ObjectAdapterPtr mLoggerAdapter;
AsteriskSCF::ServiceDiscovery::CollocatedIceStormPtr mIceStorm;
+ ReplicaPtr mReplicaService;
+ ServiceLocatorStateReplicatorPrx mStateReplicator;
+};
+
+/**
+ * Implementation of the Replica interface.
+ */
+class ReplicaImpl : public Replica
+{
+public:
+ ReplicaImpl(Ice::ObjectAdapterPtr adapter) : mAdapter(adapter), mPaused(false), mActive(true) { }
+
+ bool isActive(const Ice::Current&)
+ {
+ return mActive;
+ }
+
+ bool activate(const Ice::Current&)
+ {
+ mActive = true;
+
+ for (vector<AsteriskSCF::System::Component::V1::ReplicaListenerPrx>::const_iterator listener = mListeners.begin(); listener != mListeners.end(); ++listener)
+ {
+ (*listener)->activated(ReplicaPrx::uncheckedCast(mAdapter->createDirectProxy(mAdapter->getCommunicator()->stringToIdentity(ReplicaServiceId))));
+ }
+
+ return true;
+ }
+
+ void standby(const Ice::Current&)
+ {
+ mActive = false;
+
+ for (vector<AsteriskSCF::System::Component::V1::ReplicaListenerPrx>::const_iterator listener = mListeners.begin(); listener != mListeners.end(); ++listener)
+ {
+ (*listener)->onStandby(ReplicaPrx::uncheckedCast(mAdapter->createDirectProxy(mAdapter->getCommunicator()->stringToIdentity(ReplicaServiceId))));
+ }
+ }
+
+ void addListener(const AsteriskSCF::System::Component::V1::ReplicaListenerPrx& listener, const Ice::Current&)
+ {
+ mListeners.push_back(listener);
+ }
+
+ void removeListener(const AsteriskSCF::System::Component::V1::ReplicaListenerPrx& listener, const Ice::Current&)
+ {
+ mListeners.erase(std::remove(mListeners.begin(), mListeners.end(), listener), mListeners.end());
+ }
+
+private:
+ Ice::ObjectAdapterPtr mAdapter;
+
+ vector<AsteriskSCF::System::Component::V1::ReplicaListenerPrx> mListeners;
+
+ bool mPaused;
+
+ bool mActive;
};
/**
@@ -61,7 +124,7 @@ private:
class ServiceLocatorImpl : public ServiceLocator
{
public:
- ServiceLocatorImpl(ServiceLocatorManagementImpl* LocatorServiceManagement) :
+ ServiceLocatorImpl(ServiceLocatorManagementImplPtr LocatorServiceManagement) :
mLocatorServiceManagement(LocatorServiceManagement) { };
/**
* Asynchronously locate a service for the given parameters.
@@ -81,7 +144,7 @@ private:
* actually stored. Our ServiceLocator implementation simply acts as a read-only
* frontend to it.
*/
- ServiceLocatorManagementImpl* mLocatorServiceManagement;
+ ServiceLocatorManagementImplPtr mLocatorServiceManagement;
};
}
@@ -107,6 +170,14 @@ void ServiceLocatorApp::start(const string& name, const Ice::CommunicatorPtr& co
{
mIceStorm = new AsteriskSCF::ServiceDiscovery::CollocatedIceStorm("AsteriskSCFIceStorm", communicator->getProperties());
+ mLoggerAdapter = communicator->createObjectAdapter("LoggerAdapter");
+
+ ConfiguredIceLoggerPtr mIceLogger = createIceLogger(mLoggerAdapter);
+
+ getLoggerFactory().setLogOutput(mIceLogger->getLogger());
+
+ mLoggerAdapter->activate();
+
lg(Info) << "Initializing service discovery component";
/* Talk to the topic manager to either create or get the service discovery topic,
@@ -152,6 +223,14 @@ void ServiceLocatorApp::start(const string& name, const Ice::CommunicatorPtr& co
lg(Info) << "IceStorm topic manager proxy not present, events disabled.";
}
+ mLocalAdapter = communicator->createObjectAdapter(
+ "ServiceLocatorLocalAdapter");
+
+ mReplicaService = new ReplicaImpl(mLocalAdapter);
+ mLocalAdapter->add(mReplicaService, communicator->stringToIdentity(ReplicaServiceId));
+
+ mLocalAdapter->activate();
+
/* Management and discovery use separate adapters to provide a level of security,
* management may want to be protected so arbitrary people can't inject bad services
* into the infrastructure while discovery as a read only function may be allowed to all.
@@ -159,14 +238,39 @@ void ServiceLocatorApp::start(const string& name, const Ice::CommunicatorPtr& co
mManagementAdapter= communicator->createObjectAdapter(
"ServiceLocatorManagementAdapter");
- ServiceLocatorManagementImpl* locatorServiceManagement =
- new ServiceLocatorManagementImpl(mManagementAdapter, serviceDiscoveryTopic);
+ ServiceLocatorManagementImplPtr locatorServiceManagement =
+ new ServiceLocatorManagementImpl(mManagementAdapter, serviceDiscoveryTopic, mReplicaService);
mManagementAdapter->add(locatorServiceManagement,
communicator->stringToIdentity("LocatorServiceManagement"));
mManagementAdapter->activate();
+ try
+ {
+ mStateReplicator = ServiceLocatorStateReplicatorPrx::checkedCast(communicator->propertyToProxy("ServiceLocator.StateReplicator.Proxy"));
+ ServiceLocatorStateReplicatorListenerPtr mReplicatorListener = new ServiceLocatorStateReplicatorListenerI(locatorServiceManagement);
+ ServiceLocatorStateReplicatorListenerPrx mReplicatorListenerProxy = ServiceLocatorStateReplicatorListenerPrx::uncheckedCast(mLocalAdapter->addWithUUID(mReplicatorListener));
+
+ locatorServiceManagement->setStateReplicator(mStateReplicator);
+
+ if (communicator->getProperties()->getPropertyWithDefault("ServiceLocatorStateReplicatorListener", "no") == "yes")
+ {
+ mStateReplicator->addListener(mReplicatorListenerProxy);
+ mReplicaService->standby();
+ lg(Info) << "Operating as a standby replica." << endl;
+ }
+ else
+ {
+ lg(Info) << "Operating in an active state and pushing updates." << endl;
+ }
+ }
+ catch (...)
+ {
+ // If we reach this point then no state replicator is present and we are acting in a stand-alone fashion
+ lg(Info) << "Operating in an active and standalone state." << endl;
+ }
+
lg(Info) << "Activated service discovery management.";
mDiscoveryAdapter = communicator->createObjectAdapter("ServiceLocatorAdapter");
@@ -177,14 +281,6 @@ void ServiceLocatorApp::start(const string& name, const Ice::CommunicatorPtr& co
mDiscoveryAdapter->activate();
- mLoggerAdapter = communicator->createObjectAdapter("LoggerAdapter");
-
- ConfiguredIceLoggerPtr mIceLogger = createIceLogger(mLoggerAdapter);
-
- getLoggerFactory().setLogOutput(mIceLogger->getLogger());
-
- mLoggerAdapter->activate();
-
lg(Info) << "Activated service discovery.";
lg(Info) << "Waiting for requests.";
diff --git a/src/ServiceLocatorManagement.cpp b/src/ServiceLocatorManagement.cpp
index 9e7e28e..60e4bff 100644
--- a/src/ServiceLocatorManagement.cpp
+++ b/src/ServiceLocatorManagement.cpp
@@ -314,8 +314,9 @@ class AsteriskSCF::ServiceDiscovery::ServiceLocatorManagementImplPriv :
{
public:
ServiceLocatorManagementImplPriv(const Ice::ObjectAdapterPtr& adapter,
- const EventsPrx& serviceDiscoveryTopic) :
- mAdapter(adapter), mLocatorTopic(serviceDiscoveryTopic)
+ const EventsPrx& serviceDiscoveryTopic,
+ const AsteriskSCF::System::Component::V1::ReplicaPtr replicaService) :
+ mAdapter(adapter), mLocatorTopic(serviceDiscoveryTopic), mReplicaService(replicaService)
{
};
@@ -345,6 +346,16 @@ public:
* A proxy that can be used to publish locator events.
*/
AsteriskSCF::System::Discovery::EventsPrx mLocatorTopic;
+
+ /**
+ * A proxy to the state replicator we are pushing updates to.
+ */
+ ServiceLocatorStateReplicatorPrx mStateReplicator;
+
+ /**
+ * A pointer to an instance of our replica service.
+ */
+ AsteriskSCF::System::Component::V1::ReplicaPtr mReplicaService;
};
/**
@@ -352,8 +363,9 @@ public:
*/
ServiceLocatorManagementImpl::ServiceLocatorManagementImpl(
const Ice::ObjectAdapterPtr& adapter,
- const EventsPrx& serviceDiscoveryTopic) :
- mImpl(new ServiceLocatorManagementImplPriv(adapter, serviceDiscoveryTopic))
+ const EventsPrx& serviceDiscoveryTopic,
+ const AsteriskSCF::System::Component::V1::ReplicaPtr replicaService) :
+ mImpl(new ServiceLocatorManagementImplPriv(adapter, serviceDiscoveryTopic, replicaService))
{
}
@@ -577,6 +589,11 @@ void ServiceLocatorManagementImpl::replicateState(AsteriskSCF::Core::Discovery::
AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr params,
AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr comparator)
{
+ if (!mImpl->mStateReplicator || mImpl->mReplicaService->isActive() == false)
+ {
+ return;
+ }
+
ServiceLocatorStateItemSeq items;
if (service)
@@ -593,6 +610,20 @@ void ServiceLocatorManagementImpl::replicateState(AsteriskSCF::Core::Discovery::
{
items.push_back(comparator);
}
+
+ if (items.size() == 0)
+ {
+ return;
+ }
+
+ try
+ {
+ ServiceLocatorStateReplicatorPrx oneway = ServiceLocatorStateReplicatorPrx::uncheckedCast(mImpl->mStateReplicator->ice_oneway());
+ oneway->setState(items);
+ }
+ catch (...)
+ {
+ }
}
/**
@@ -602,6 +633,11 @@ void ServiceLocatorManagementImpl::removeState(AsteriskSCF::Core::Discovery::V1:
AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr params,
AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr comparator)
{
+ if (!mImpl->mStateReplicator || mImpl->mReplicaService->isActive() == false)
+ {
+ return;
+ }
+
Ice::StringSeq items;
if (service)
@@ -618,4 +654,26 @@ void ServiceLocatorManagementImpl::removeState(AsteriskSCF::Core::Discovery::V1:
{
items.push_back(comparator->key);
}
+
+ if (items.size() == 0)
+ {
+ return;
+ }
+
+ try
+ {
+ ServiceLocatorStateReplicatorPrx oneway = ServiceLocatorStateReplicatorPrx::uncheckedCast(mImpl->mStateReplicator->ice_oneway());
+ oneway->removeState(items);
+ }
+ catch (...)
+ {
+ }
+}
+
+/**
+ * Function which sets the proxy to the state replicator.
+ */
+void ServiceLocatorManagementImpl::setStateReplicator(ServiceLocatorStateReplicatorPrx stateReplicator)
+{
+ mImpl->mStateReplicator = stateReplicator;
}
diff --git a/src/ServiceLocatorManagement.h b/src/ServiceLocatorManagement.h
index 705f853..b80aaec 100644
--- a/src/ServiceLocatorManagement.h
+++ b/src/ServiceLocatorManagement.h
@@ -20,6 +20,8 @@
#include <IceUtil/Shared.h>
+#include "System/Component/ReplicaIf.h"
+
#include "ServiceLocatorStateReplicationIf.h"
namespace AsteriskSCF
@@ -65,7 +67,8 @@ class ServiceLocatorManagementImpl :
{
public:
ServiceLocatorManagementImpl(const Ice::ObjectAdapterPtr& adapter,
- const AsteriskSCF::System::Discovery::EventsPrx& serviceDiscoveryTopic);
+ const AsteriskSCF::System::Discovery::EventsPrx& serviceDiscoveryTopic,
+ const AsteriskSCF::System::Component::V1::ReplicaPtr);
void locate(
const AsteriskSCF::Core::Discovery::V1::AMD_ServiceLocator_locatePtr&,
const AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsPtr&);
@@ -82,6 +85,7 @@ public:
void removeState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr,
AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr,
AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr);
+ void setStateReplicator(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateReplicatorPrx);
//
// AsteriskSCF::Core::Discovery::V1::ServiceLocatorManagement interface.
commit 98b2f444209e008770b792dbb2df3790437c2966
Author: Joshua Colp <jcolp at digium.com>
Date: Wed Dec 15 15:26:33 2010 -0400
Add missing implementations.
diff --git a/src/ServiceLocatorManagement.cpp b/src/ServiceLocatorManagement.cpp
index 81a77f2..9e7e28e 100644
--- a/src/ServiceLocatorManagement.cpp
+++ b/src/ServiceLocatorManagement.cpp
@@ -404,15 +404,33 @@ ServiceManagementPrx ServiceLocatorManagementImpl::addService(
{
lg(Debug) << "addService(" << guid << ')';
boost::unique_lock<boost::shared_mutex> lock(mImpl->mLock);
+
+ Ice::Identity identity;
+ identity.name = IceUtil::generateUUID();
+
ServiceManagementImplPtr new_service = new ServiceManagementImpl(this,
service,
- mImpl->mAdapter, mImpl->mLocatorTopic, guid);
+ mImpl->mAdapter, mImpl->mLocatorTopic, guid, identity);
mImpl->mServices.push_back(new_service);
return new_service->getServiceManagementPrx();
}
+ServiceManagementImplPtr ServiceLocatorManagementImpl::addService(const Ice::ObjectPrx& service,
+ const std::string& guid, const Ice::Identity& identity)
+{
+ lg(Debug) << "addService(" << guid << ')';
+ boost::unique_lock<boost::shared_mutex> lock(mImpl->mLock);
+ ServiceManagementImplPtr new_service = new ServiceManagementImpl(this,
+ service,
+ mImpl->mAdapter, mImpl->mLocatorTopic, guid, identity);
+
+ mImpl->mServices.push_back(new_service);
+
+ return new_service;
+}
+
ServiceInfoSeq ServiceLocatorManagementImpl::getServices(const ::Ice::Current&) const
{
lg(Debug) << "getServices()";
@@ -551,3 +569,53 @@ void ServiceLocatorManagementImpl::removeService(
lg(Error) << "removeService(" << service->getGuid() <<
") failed. service not found";
}
+
+/**
+ * Function which replicates state items.
+ */
+void ServiceLocatorManagementImpl::replicateState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr service,
+ AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr params,
+ AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr comparator)
+{
+ ServiceLocatorStateItemSeq items;
+
+ if (service)
+ {
+ items.push_back(service);
+ }
+
+ if (params)
+ {
+ items.push_back(params);
+ }
+
+ if (comparator)
+ {
+ items.push_back(comparator);
+ }
+}
+
+/**
+ * Function which removes state items from the replicator.
+ */
+void ServiceLocatorManagementImpl::removeState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr service,
+ AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr params,
+ AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr comparator)
+{
+ Ice::StringSeq items;
+
+ if (service)
+ {
+ items.push_back(service->key);
+ }
+
+ if (params)
+ {
+ items.push_back(params->key);
+ }
+
+ if (comparator)
+ {
+ items.push_back(comparator->key);
+ }
+}
diff --git a/src/ServiceManagement.cpp b/src/ServiceManagement.cpp
index 0c83a69..89a0190 100644
--- a/src/ServiceManagement.cpp
+++ b/src/ServiceManagement.cpp
@@ -91,7 +91,7 @@ class ServiceManagementImplPriv
public:
ServiceManagementImplPriv(ServiceManagementImpl* impl, ServiceLocatorManagementImplPtr management,
const Ice::ObjectPrx& service, const Ice::ObjectAdapterPtr& adapter, const AsteriskSCF::System::Discovery::EventsPrx& serviceDiscoveryTopic,
- const string& guid) :
+ const string& guid, const Ice::Identity& identity) :
mStateItem(new ServiceLocatorServiceStateItem()),
mManagement(management), mAdapter(adapter), mLocatorTopic(serviceDiscoveryTopic)
{
@@ -99,8 +99,8 @@ public:
mStateItem->mSuspended = false;
mStateItem->mService = service;
mStateItem->mGuid = guid;
- mManagementPrx = ServiceManagementPrx::uncheckedCast(mAdapter->addWithUUID(impl));
- mStateItem->mManagementIdentity = mManagementPrx->ice_getIdentity();
+ mManagementPrx = ServiceManagementPrx::uncheckedCast(mAdapter->add(impl, identity));
+ mStateItem->mManagementIdentity = identity;
if (mLocatorTopic)
{
mLocatorTopic->serviceRegistered(guid);
@@ -153,8 +153,9 @@ using namespace AsteriskSCF::System::Discovery;
* also sends out an event for those that are listening.
*/
ServiceManagementImpl::ServiceManagementImpl(ServiceLocatorManagementImplPtr management,
- const Ice::ObjectPrx& service, const Ice::ObjectAdapterPtr& adapter, const EventsPrx& serviceDiscoveryTopic, const string& guid) :
- mImpl(new ServiceManagementImplPriv(this, management, service, adapter, serviceDiscoveryTopic, guid))
+ const Ice::ObjectPrx& service, const Ice::ObjectAdapterPtr& adapter, const EventsPrx& serviceDiscoveryTopic, const string& guid,
+ const Ice::Identity& identity) :
+ mImpl(new ServiceManagementImplPriv(this, management, service, adapter, serviceDiscoveryTopic, guid, identity))
{
}
diff --git a/src/ServiceManagement.h b/src/ServiceManagement.h
index ecd3e5c..14b5b13 100644
--- a/src/ServiceManagement.h
+++ b/src/ServiceManagement.h
@@ -33,8 +33,8 @@ class ServiceManagementImplPriv;
class ServiceManagementImpl : public AsteriskSCF::Core::Discovery::V1::ServiceManagement
{
public:
- ServiceManagementImpl(ServiceLocatorManagementImplPtr, const Ice::ObjectPrx&, const Ice::ObjectAdapterPtr&,
- const AsteriskSCF::System::Discovery::EventsPrx&, const std::string&);
+ ServiceManagementImpl(ServiceLocatorManagementImplPtr, const Ice::ObjectPrx&, const Ice::ObjectAdapterPtr&,
+ const AsteriskSCF::System::Discovery::EventsPrx&, const std::string&, const Ice::Identity&);
//
// AsteriskSCF::Core::Discovery::V1::ServiceManagement interface.
commit 088414bdb58269202ac55f7ae34acd59c9fd8ddd
Author: Joshua Colp <jcolp at digium.com>
Date: Wed Dec 15 14:46:32 2010 -0400
Add calls to replicateState and removeState in places where it should be done.
diff --git a/src/ServiceLocatorManagement.cpp b/src/ServiceLocatorManagement.cpp
index 07cc3df..81a77f2 100644
--- a/src/ServiceLocatorManagement.cpp
+++ b/src/ServiceLocatorManagement.cpp
@@ -46,10 +46,9 @@ namespace ServiceLocatorManagementImplNS
const Logger& lg = getLoggerFactory().getLogger("AsteriskSCF.System.Discovery");
-<<<<<<< HEAD
/** Parameter type for Locator, to allow use of ResponseCollector. */
typedef std::pair<bool, ServiceManagementImplPtr> LocateParam;
-=======
+
/**
* Callback class for isSupported AMI calls. Acts as a bridge between
* Ice callbacks and IsSupportedCallback.
@@ -101,12 +100,24 @@ public:
*
* @param compare A proxy to the comparator service we are wrapping.
*/
- ServiceLocatorComparator(const ServiceLocatorParamsComparePrx& compare, std::string name) :
+ ServiceLocatorComparator(const ServiceLocatorParamsComparePrx& compare, std::string name,
+ ServiceLocatorManagementImplPtr management) :
+ mManagement(management),
mStateItem(new ServiceLocatorComparatorStateItem())
{
mStateItem->key = IceUtil::generateUUID();
mStateItem->mName = name;
mStateItem->mService = compare;
+ mManagement->replicateState(0, 0, mStateItem);
+ }
+
+ /**
+ * Destructor for the ServiceLocatorComparator class.
+ *
+ */
+ ~ServiceLocatorComparator()
+ {
+ mManagement->removeState(0, 0, mStateItem);
}
/**
@@ -130,6 +141,11 @@ public:
}
private:
/**
+ * A pointer to the locator management instance.
+ */
+ ServiceLocatorManagementImplPtr mManagement;
+
+ /**
* Comparator state replication item.
*/
ServiceLocatorComparatorStateItemPtr mStateItem;
diff --git a/src/ServiceLocatorManagement.h b/src/ServiceLocatorManagement.h
index 6ff4655..705f853 100644
--- a/src/ServiceLocatorManagement.h
+++ b/src/ServiceLocatorManagement.h
@@ -20,6 +20,8 @@
#include <IceUtil/Shared.h>
+#include "ServiceLocatorStateReplicationIf.h"
+
namespace AsteriskSCF
{
namespace ServiceDiscovery
@@ -74,6 +76,12 @@ public:
// Replication related functions.
ServiceManagementImplPtr addService(const Ice::ObjectPrx&, const std::string&, const
Ice::Identity&);
+ void replicateState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr,
+ AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr,
+ AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr);
+ void removeState(AsteriskSCF::Core::Discovery::V1::ServiceLocatorStateItemPtr,
+ AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsStateItemPtr,
+ AsteriskSCF::Core::Discovery::V1::ServiceLocatorComparatorStateItemPtr);
//
// AsteriskSCF::Core::Discovery::V1::ServiceLocatorManagement interface.
diff --git a/src/ServiceManagement.cpp b/src/ServiceManagement.cpp
index ff26a02..0c83a69 100644
--- a/src/ServiceManagement.cpp
+++ b/src/ServiceManagement.cpp
@@ -53,7 +53,7 @@ class ServiceLocatorParamsSpec
public:
ServiceLocatorParamsSpec(const ServiceLocatorParamsPtr& params,
const std::string& compareGuid,
- ServiceLocatorManagementImpl* management)
+ ServiceLocatorManagementImplPtr management)
:
mStateItem(new ServiceLocatorParamsStateItem()),
mManagement(management)
@@ -61,6 +61,12 @@ public:
mStateItem->key = IceUtil::generateUUID();
mStateItem->mParams = params;
mStateItem->mCompareGuid = compareGuid;
+ mManagement->replicateState(0, mStateItem, 0);
+ }
+
+ ~ServiceLocatorParamsSpec()
+ {
+ mManagement->removeState(0, mStateItem, 0);
}
void isSupported(const AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsPtr&, const IsSupportedCallbackPtr&);
@@ -74,7 +80,7 @@ private:
/**
* A pointer to the service locator management implementation that instantiated this class.
*/
- ServiceLocatorManagementImpl* mManagement;
+ ServiceLocatorManagementImplPtr mManagement;
};
/**
@@ -83,7 +89,7 @@ private:
class ServiceManagementImplPriv
{
public:
- ServiceManagementImplPriv(ServiceManagementImpl* impl, ServiceLocatorManagementImpl* management,
+ ServiceManagementImplPriv(ServiceManagementImpl* impl, ServiceLocatorManagementImplPtr management,
const Ice::ObjectPrx& service, const Ice::ObjectAdapterPtr& adapter, const AsteriskSCF::System::Discovery::EventsPrx& serviceDiscoveryTopic,
const string& guid) :
mStateItem(new ServiceLocatorServiceStateItem()),
@@ -99,6 +105,7 @@ public:
{
mLocatorTopic->serviceRegistered(guid);
}
+ mManagement->replicateState(mStateItem, 0, 0);
}
/**
@@ -114,7 +121,7 @@ public:
/**
* A pointer to the service locator management implementation that instantiated this call.
*/
- ServiceLocatorManagementImpl* mManagement;
+ ServiceLocatorManagementImplPtr mManagement;
/**
* A pointer to the object adapter that this service is available on.
@@ -145,7 +152,7 @@ using namespace AsteriskSCF::System::Discovery;
* Constructor for the ServiceManagementImpl class. This adds itself to the object adapter so the service can perform some management and
* also sends out an event for those that are listening.
*/
-ServiceManagementImpl::ServiceManagementImpl(ServiceLocatorManagementImpl* management,
+ServiceManagementImpl::ServiceManagementImpl(ServiceLocatorManagementImplPtr management,
const Ice::ObjectPrx& service, const Ice::ObjectAdapterPtr& adapter, const EventsPrx& serviceDiscoveryTopic, const string& guid) :
mImpl(new ServiceManagementImplPriv(this, management, service, adapter, serviceDiscoveryTopic, guid))
{
@@ -314,6 +321,7 @@ void ServiceManagementImpl::suspend(const Ice::Current&)
{
lg(Info) << "Suspending " << mImpl->mStateItem->mGuid << " " << mImpl->mStateItem->mService->ice_toString();
mImpl->mStateItem->mSuspended = true;
+ mImpl->mManagement->replicateState(mImpl->mStateItem, 0, 0);
}
if (mImpl->mLocatorTopic)
@@ -333,6 +341,7 @@ void ServiceManagementImpl::unsuspend(const Ice::Current&)
{
lg(Info) << "Un-suspending " << mImpl->mStateItem->mGuid << " " << mImpl->mStateItem->mService->ice_toString();
mImpl->mStateItem->mSuspended = false;
+ mImpl->mManagement->replicateState(mImpl->mStateItem, 0, 0);
}
if (mImpl->mLocatorTopic)
@@ -364,6 +373,8 @@ void ServiceManagementImpl::unregister(const Ice::Current&)
*/
lg(Info) << "Un-register " << mImpl->mStateItem->mGuid << " " << mImpl->mStateItem->mService->ice_toString();
+ mImpl->mManagement->removeState(mImpl->mStateItem, 0, 0);
+
mImpl->mAdapter->remove(mImpl->mManagementPrx->ice_getIdentity());
mImpl->mManagement->removeService(this);
diff --git a/src/ServiceManagement.h b/src/ServiceManagement.h
index 24236c1..ecd3e5c 100644
--- a/src/ServiceManagement.h
+++ b/src/ServiceManagement.h
@@ -33,7 +33,7 @@ class ServiceManagementImplPriv;
class ServiceManagementImpl : public AsteriskSCF::Core::Discovery::V1::ServiceManagement
{
public:
- ServiceManagementImpl(ServiceLocatorManagementImpl*, const Ice::ObjectPrx&, const Ice::ObjectAdapterPtr&,
+ ServiceManagementImpl(ServiceLocatorManagementImplPtr, const Ice::ObjectPrx&, const Ice::ObjectAdapterPtr&,
const AsteriskSCF::System::Discovery::EventsPrx&, const std::string&);
//
commit a129bc7a69bacda3bb9fdfa7b2c335f6de5c8be6
Author: Joshua Colp <jcolp at digium.com>
Date: Wed Dec 15 14:03:41 2010 -0400
Add listener implementation for service locator replication.
diff --git a/src/ServiceLocatorManagement.h b/src/ServiceLocatorManagement.h
index 6d9f65d..6ff4655 100644
--- a/src/ServiceLocatorManagement.h
+++ b/src/ServiceLocatorManagement.h
@@ -71,6 +71,10 @@ public:
const AsteriskSCF::Core::Discovery::V1::AMD_ServiceLocator_locateAllPtr&,
const AsteriskSCF::Core::Discovery::V1::ServiceLocatorParamsPtr&);
+ // Replication related functions.
+ ServiceManagementImplPtr addService(const Ice::ObjectPrx&, const std::string&, const
+ Ice::Identity&);
+
//
// AsteriskSCF::Core::Discovery::V1::ServiceLocatorManagement interface.
//
@@ -99,5 +103,10 @@ private:
void finish_isSupported(const Ice::AsyncResultPtr& r);
};
+/**
+ * A typedef which creates a smart pointer type for ServiceLocatorManagementImpl.
+ */
+typedef IceUtil::Handle<ServiceLocatorManagementImpl> ServiceLocatorManagementImplPtr;
+
} /* end of ServiceDiscovery */
} /* end of AsteriskSCF */
diff --git a/src/ServiceLocatorStateListener.cpp b/src/ServiceLocatorStateListener.cpp
index 4753f48..e6bb3fd 100644
--- a/src/ServiceLocatorStateListener.cpp
+++ b/src/ServiceLocatorStateListener.cpp
@@ -22,25 +22,70 @@
#include "ReplicaIf.h"
#include "SmartProxy.h"
+#include "Core/Discovery/ServiceLocatorIf.h"
+#include "Core/Discovery/ServiceLocatorEventsIf.h"
+
+#include "ServiceLocatorManagement.h"
+#include "ServiceManagement.h"
+
#include "ServiceLocatorStateReplicator.h"
using namespace AsteriskSCF::Core::Discovery::V1;
+using namespace AsteriskSCF::ServiceDiscovery;
class ServiceLocatorStateReplicatorItem
{
public:
- ServiceLocatorStateReplicatorItem() { }
+ ServiceLocatorStateReplicatorItem(ServiceLocatorManagementImplPtr locatorManagement) : mLocatorManagement(locatorManagement) { }
~ServiceLocatorStateReplicatorItem()
{
+ Ice::Current current;
+ if (mService)
+ {
+ mService->unregister(current);
+ }
+ if (!mComparator.empty())
+ {
+ mLocatorManagement->removeCompare(mComparator, current);
+ }
}
+
+ /**
+ * Helper function which sets the service.
+ */
+ void setService(ServiceManagementImplPtr service) { mService = service; };
+
+ /**
+ * Helper function which sets the comparator.
+ */
+ void setComparator(std::string name) { mComparator = name; };
+
+ /**
+ * Helper function which gets the service.
+ */
+ ServiceManagementImplPtr getService() { return mService; };
private:
+ /**
+ * Pointer to the locator management instance.
+ */
+ ServiceLocatorManagementImplPtr mLocatorManagement;
+
+ /**
+ * Pointer to the service.
+ */
+ ServiceManagementImplPtr mService;
+
+ /**
+ * Name of the comparator.
+ */
+ std::string mComparator;
};
struct ServiceLocatorStateReplicatorListenerImpl
{
public:
- ServiceLocatorStateReplicatorListenerImpl(Ice::ObjectAdapterPtr adapter)
- : mId(IceUtil::generateUUID()), mAdapter(adapter) {}
+ ServiceLocatorStateReplicatorListenerImpl(ServiceLocatorManagementImplPtr management)
+ : mId(IceUtil::generateUUID()), mLocatorManagement(management) {}
void removeStateNoticeImpl(const Ice::StringSeq& itemKeys)
{
for (Ice::StringSeq::const_iterator key = itemKeys.begin(); key != itemKeys.end(); ++key)
@@ -53,15 +98,85 @@ public:
{
for (ServiceLocatorStateItemSeq::const_iterator item = items.begin(); item != items.end(); ++item)
{
+ ServiceLocatorServiceStateItemPtr serviceState;
+ ServiceLocatorParamsStateItemPtr paramsState;
+ ServiceLocatorComparatorStateItemPtr comparatorState;
+
+ if ((serviceState = ServiceLocatorServiceStateItemPtr::dynamicCast((*item))))
+ {
+ Ice::Current current;
+ std::map<std::string, boost::shared_ptr<ServiceLocatorStateReplicatorItem> >::iterator i = mStateItems.find((*item)->key);
+ boost::shared_ptr<ServiceLocatorStateReplicatorItem> localitem;
+
+ if ((i == mStateItems.end()))
... 20352 lines suppressed ...
--
asterisk-scf/integration/servicediscovery.git
More information about the asterisk-scf-commits
mailing list