summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/IceGrid/AdapterCache.cpp8
-rw-r--r--cpp/src/IceGrid/AdapterCache.h6
-rw-r--r--cpp/src/IceGrid/AdminI.cpp269
-rw-r--r--cpp/src/IceGrid/AdminI.h5
-rw-r--r--cpp/src/IceGrid/Database.cpp251
-rw-r--r--cpp/src/IceGrid/Database.h12
-rw-r--r--cpp/src/IceGrid/LocatorI.cpp2
-rw-r--r--cpp/src/IceGrid/Makefile27
-rw-r--r--cpp/src/IceGrid/NodeI.cpp18
-rw-r--r--cpp/src/IceGrid/Parser.cpp24
-rw-r--r--cpp/src/IceGrid/ServerI.cpp2
11 files changed, 373 insertions, 251 deletions
diff --git a/cpp/src/IceGrid/AdapterCache.cpp b/cpp/src/IceGrid/AdapterCache.cpp
index aff2dd311d9..2eedddda998 100644
--- a/cpp/src/IceGrid/AdapterCache.cpp
+++ b/cpp/src/IceGrid/AdapterCache.cpp
@@ -148,7 +148,7 @@ ServerAdapterEntry::ServerAdapterEntry(Cache<string, AdapterEntry>& cache, const
}
vector<pair<string, AdapterPrx> >
-ServerAdapterEntry::getProxies(int& nReplicas)
+ServerAdapterEntry::getProxies(bool, int& nReplicas)
{
vector<pair<string, AdapterPrx> > adapters;
try
@@ -302,7 +302,7 @@ ReplicaGroupEntry::removeReplica(const string& replicaId)
}
vector<pair<string, AdapterPrx> >
-ReplicaGroupEntry::getProxies(int& nReplicas)
+ReplicaGroupEntry::getProxies(bool allRegistered, int& nReplicas)
{
ReplicaSeq replicas;
bool adaptive = false;
@@ -368,6 +368,10 @@ ReplicaGroupEntry::getProxies(int& nReplicas)
}
catch(const NodeUnreachableException&)
{
+ if(allRegistered)
+ {
+ adapters.push_back(make_pair(p->first, AdapterPrx()));
+ }
}
}
return adapters;
diff --git a/cpp/src/IceGrid/AdapterCache.h b/cpp/src/IceGrid/AdapterCache.h
index a05a4df0189..eaa1e99edea 100644
--- a/cpp/src/IceGrid/AdapterCache.h
+++ b/cpp/src/IceGrid/AdapterCache.h
@@ -34,7 +34,7 @@ public:
AdapterEntry(Cache<std::string, AdapterEntry>&, const std::string&);
- virtual std::vector<std::pair<std::string, AdapterPrx> > getProxies(int&) {
+ virtual std::vector<std::pair<std::string, AdapterPrx> > getProxies(bool, int&) {
return std::vector<std::pair<std::string, AdapterPrx> >(); }
virtual float getLeastLoadedNodeLoad(LoadSample) const { return 0.0f; }
virtual std::string getApplication() const { return ""; }
@@ -53,7 +53,7 @@ public:
ServerAdapterEntry(Cache<std::string, AdapterEntry>&, const std::string&);
- virtual std::vector<std::pair<std::string, AdapterPrx> > getProxies(int&);
+ virtual std::vector<std::pair<std::string, AdapterPrx> > getProxies(bool, int&);
virtual float getLeastLoadedNodeLoad(LoadSample) const;
virtual std::string getApplication() const;
@@ -77,7 +77,7 @@ public:
ReplicaGroupEntry(Cache<std::string, AdapterEntry>&, const std::string&);
- virtual std::vector<std::pair<std::string, AdapterPrx> > getProxies(int&);
+ virtual std::vector<std::pair<std::string, AdapterPrx> > getProxies(bool, int&);
virtual float getLeastLoadedNodeLoad(LoadSample) const;
virtual std::string getApplication() const;
diff --git a/cpp/src/IceGrid/AdminI.cpp b/cpp/src/IceGrid/AdminI.cpp
index 5cf816b8b6a..eb262971728 100644
--- a/cpp/src/IceGrid/AdminI.cpp
+++ b/cpp/src/IceGrid/AdminI.cpp
@@ -22,6 +22,9 @@ using namespace std;
using namespace Ice;
using namespace IceGrid;
+namespace IceGrid
+{
+
class ServerProxyWrapper
{
public:
@@ -77,6 +80,189 @@ private:
string _node;
};
+class PatchAggregator : public IceUtil::Mutex, public IceUtil::Shared
+{
+public:
+
+ PatchAggregator(const AMD_Admin_patchApplicationPtr& cb,
+ const TraceLevelsPtr& traceLevels,
+ const string& application,
+ int nodeCount) :
+ _cb(cb), _traceLevels(traceLevels), _application(application), _count(nodeCount), _nSuccess(0), _nFailure(0)
+ {
+ }
+
+ void
+ finished(const string& node, const string& failure)
+ {
+ Lock sync(*this);
+ if(failure.empty())
+ {
+ if(_traceLevels->patch > 0)
+ {
+ Ice::Trace out(_traceLevels->logger, _traceLevels->patchCat);
+ out << "finished patching of application `" << _application << "' on node `" << node << "'";
+ }
+
+ ++_nSuccess;
+ }
+ else
+ {
+ if(_traceLevels->patch > 0)
+ {
+ Ice::Trace out(_traceLevels->logger, _traceLevels->patchCat);
+ out << "patching of application `" << _application << "' on node `" << node <<"' failed:\n" << failure;
+ }
+
+ ++_nFailure;
+ _lastFailure = failure;
+ }
+
+ if((_nSuccess + _nFailure) == _count)
+ {
+ if(_nSuccess > 0)
+ {
+ _cb->ice_response();
+ }
+ else
+ {
+ _cb->ice_exception(PatchException(_lastFailure));
+ }
+ }
+ }
+
+private:
+
+ const AMD_Admin_patchApplicationPtr _cb;
+ const TraceLevelsPtr _traceLevels;
+ const string _application;
+ const int _count;
+ int _nSuccess;
+ int _nFailure;
+ string _lastFailure;
+};
+typedef IceUtil::Handle<PatchAggregator> PatchAggregatorPtr;
+
+class PatchCB : public AMI_Node_patch
+{
+public:
+
+ PatchCB(const PatchAggregatorPtr& cb, const string& node) :
+ _cb(cb), _node(node)
+ {
+ }
+
+ void
+ ice_response()
+ {
+ _cb->finished(_node, "");
+ }
+
+ void
+ ice_exception(const Ice::Exception& ex)
+ {
+ string reason;
+ try
+ {
+ ex.ice_throw();
+ }
+ catch(const PatchException& ex)
+ {
+ reason = ex.reason;
+ }
+ catch(const NodeNotExistException&)
+ {
+ reason = "node doesn't exist";
+ }
+ catch(const NodeUnreachableException&)
+ {
+ reason = "node is not active";
+ }
+ catch(const Ice::Exception& ex)
+ {
+ ostringstream os;
+ os << ex;
+ reason = os.str();
+ }
+ _cb->finished(_node, reason);
+ }
+
+private:
+
+ const PatchAggregatorPtr _cb;
+ const string _node;
+};
+
+class ServerPatchCB : public AMI_Node_patch
+{
+public:
+
+ ServerPatchCB(const AMD_Admin_patchServerPtr& cb,
+ const TraceLevelsPtr& traceLevels,
+ const string& server,
+ const string& node) :
+ _cb(cb), _traceLevels(traceLevels), _server(server), _node(node)
+ {
+ }
+
+ void
+ ice_response()
+ {
+ if(_traceLevels->patch > 0)
+ {
+ Ice::Trace out(_traceLevels->logger, _traceLevels->patchCat);
+ out << "finished patching of server `" << _server << "' on node `" << _node << "'";
+ }
+
+ _cb->ice_response();
+ }
+
+ void
+ ice_exception(const Ice::Exception& ex)
+ {
+ string reason;
+ try
+ {
+ ex.ice_throw();
+ }
+ catch(const PatchException& ex)
+ {
+ reason = ex.reason;
+ }
+ catch(const NodeNotExistException&)
+ {
+ reason = "node `" + _node + "' doesn't exist";
+ }
+ catch(const NodeUnreachableException&)
+ {
+ reason = "node `" + _node + "' is not active";
+ }
+ catch(const Ice::Exception& ex)
+ {
+ ostringstream os;
+ os << ex;
+ reason = os.str();
+ }
+
+ if(_traceLevels->patch > 0)
+ {
+ Ice::Trace out(_traceLevels->logger, _traceLevels->patchCat);
+ out << "patching of server `" << _server << "' on node `" << _node << "' failed:\n" << reason;
+ }
+
+ _cb->ice_exception(PatchException(reason));
+ }
+
+private:
+
+ const AMD_Admin_patchServerPtr _cb;
+ const TraceLevelsPtr _traceLevels;
+ const string _server;
+ const string _node;
+};
+
+}
+
AdminI::AdminI(const DatabasePtr& database, const RegistryPtr& registry, const TraceLevelsPtr& traceLevels) :
_database(database),
_registry(registry),
@@ -119,13 +305,41 @@ AdminI::instantiateServer(const string& app, const string& node, const ServerIns
}
void
-AdminI::patchApplication(const string& name, bool shutdown, const Current&)
+AdminI::patchApplication_async(const AMD_Admin_patchApplicationPtr& amdCB,
+ const string& name,
+ bool shutdown,
+ const Current&)
{
ApplicationHelper helper(_database->getApplicationDescriptor(name));
DistributionDescriptor appDistrib;
map<string, DistributionDescriptorDict> nodeDistrib;
helper.getDistributions(appDistrib, nodeDistrib);
- _database->patchApplication(name, appDistrib, nodeDistrib, shutdown);
+
+ if(nodeDistrib.empty())
+ {
+ amdCB->ice_response();
+ return;
+ }
+
+ PatchAggregatorPtr aggregator = new PatchAggregator(amdCB, _traceLevels, name, nodeDistrib.size());
+ for(map<string, DistributionDescriptorDict>::const_iterator p = nodeDistrib.begin(); p != nodeDistrib.end(); ++p)
+ {
+ if(_traceLevels->patch > 0)
+ {
+ Ice::Trace out(_traceLevels->logger, _traceLevels->patchCat);
+ out << "started patching of application `" << name << "' on node `" << p->first << "'";
+ }
+
+ AMI_Node_patchPtr cb = new PatchCB(aggregator, p->first);
+ try
+ {
+ _database->getNode(p->first)->patch_async(cb, name, appDistrib, p->second, shutdown);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ cb->ice_exception(ex);
+ }
+ }
}
ApplicationDescriptor
@@ -260,7 +474,7 @@ AdminI::stopServer(const string& id, const Current&)
}
void
-AdminI::patchServer(const string& id, bool shutdown, const Current&)
+AdminI::patchServer_async(const AMD_Admin_patchServerPtr& amdCB, const string& id, bool shutdown, const Current&)
{
ServerInfo info = _database->getServerInfo(id);
ApplicationHelper helper(_database->getApplicationDescriptor(info.application));
@@ -270,27 +484,21 @@ AdminI::patchServer(const string& id, bool shutdown, const Current&)
if(appDistrib.icepatch.empty() && nodeDistrib.empty())
{
+ amdCB->ice_response();
return;
}
- for(map<string, DistributionDescriptorDict>::const_iterator p = nodeDistrib.begin(); p != nodeDistrib.end(); ++p)
+ assert(nodeDistrib.size() == 1);
+
+ map<string, DistributionDescriptorDict>::const_iterator p = nodeDistrib.begin();
+ AMI_Node_patchPtr amiCB = new ServerPatchCB(amdCB, _traceLevels, id, p->first);
+ try
{
- try
- {
- _database->getNode(p->first)->patch(info.application, appDistrib, p->second, shutdown);
- }
- catch(const NodeNotExistException&)
- {
- }
- catch(const NodeUnreachableException&)
- {
- }
- catch(const Ice::ObjectNotExistException&)
- {
- }
- catch(const Ice::LocalException&)
- {
- }
+ _database->getNode(p->first)->patch_async(amiCB, info.application, appDistrib, p->second, shutdown);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ amiCB->ice_exception(ex);
}
}
@@ -362,18 +570,25 @@ StringObjectProxyDict
AdminI::getAdapterEndpoints(const string& adapterId, const Current&) const
{
int count;
- vector<pair<string, AdapterPrx> > adapters = _database->getAdapters(adapterId, count);
+ vector<pair<string, AdapterPrx> > adapters = _database->getAdapters(adapterId, true, count);
StringObjectProxyDict adpts;
for(vector<pair<string, AdapterPrx> >::const_iterator p = adapters.begin(); p != adapters.end(); ++p)
{
- try
- {
- adpts[p->first] = p->second->getDirectProxy();
- }
- catch(const Ice::ObjectNotExistException&)
+ if(p->second)
{
+ try
+ {
+ adpts[p->first] = p->second->getDirectProxy();
+ }
+ catch(const Ice::ObjectNotExistException&)
+ {
+ }
+ catch(const Ice::Exception&)
+ {
+ adpts[p->first] = 0;
+ }
}
- catch(const Ice::Exception&)
+ else
{
adpts[p->first] = 0;
}
diff --git a/cpp/src/IceGrid/AdminI.h b/cpp/src/IceGrid/AdminI.h
index 95daf8fadec..4d0147f1e60 100644
--- a/cpp/src/IceGrid/AdminI.h
+++ b/cpp/src/IceGrid/AdminI.h
@@ -34,7 +34,8 @@ public:
virtual void removeApplication(const std::string&, const Ice::Current&);
virtual void instantiateServer(const std::string&, const std::string&, const ServerInstanceDescriptor&,
const Ice::Current&);
- virtual void patchApplication(const std::string&, bool, const Ice::Current&);
+ virtual void patchApplication_async(const AMD_Admin_patchApplicationPtr&, const std::string&, bool,
+ const Ice::Current&);
virtual ApplicationDescriptor getApplicationDescriptor(const ::std::string&, const Ice::Current&) const;
virtual ApplicationDescriptor getDefaultApplicationDescriptor(const Ice::Current&) const;
virtual Ice::StringSeq getAllApplicationNames(const Ice::Current&) const;
@@ -44,7 +45,7 @@ public:
virtual Ice::Int getServerPid(const ::std::string&, const Ice::Current&) const;
virtual void startServer(const ::std::string&, const Ice::Current&);
virtual void stopServer(const ::std::string&, const Ice::Current&);
- virtual void patchServer(const ::std::string&, bool, const Ice::Current&);
+ virtual void patchServer_async(const AMD_Admin_patchServerPtr&, const ::std::string&, bool, const Ice::Current&);
virtual void sendSignal(const ::std::string&, const ::std::string&, const Ice::Current&);
virtual void writeMessage(const ::std::string&, const ::std::string&, Ice::Int, const Ice::Current&);
virtual Ice::StringSeq getAllServerIds(const Ice::Current&) const;
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp
index 561b384c565..72f9dbad849 100644
--- a/cpp/src/IceGrid/Database.cpp
+++ b/cpp/src/IceGrid/Database.cpp
@@ -24,7 +24,6 @@ using namespace IceGrid;
const string Database::_descriptorDbName = "applications";
const string Database::_adapterDbName = "adapters";
-const string Database::_replicaGroupDbName = "replica-groups";
const string Database::_objectDbName = "objects";
namespace IceGrid
@@ -105,47 +104,6 @@ struct ObjectLoadCI : binary_function<pair<Ice::ObjectPrx, float>&, pair<Ice::Ob
}
};
-class PatchCB : public AMI_Node_patch
-{
-public:
-
- PatchCB(const DatabasePtr& database, const string& name, const string& node) :
- _database(database), _application(name), _node(node)
- {
- }
-
- void
- ice_response()
- {
- _database->finishedPatchApplication(_application, _node);
- }
-
- void
- ice_exception(const Ice::Exception& ex)
- {
- try
- {
- ex.ice_throw();
- }
- catch(const PatchException& ex)
- {
- _database->finishedPatchApplication(_application, _node, ex.reason);
- }
- catch(const Ice::Exception& ex)
- {
- ostringstream os;
- os << ex;
- _database->finishedPatchApplication(_application, _node, os.str());
- }
- }
-
-private:
-
- const DatabasePtr _database;
- const string _application;
- const string _node;
-};
-
}
Database::Database(const Ice::ObjectAdapterPtr& adapter,
@@ -165,7 +123,6 @@ Database::Database(const Ice::ObjectAdapterPtr& adapter,
_descriptors(_connection, _descriptorDbName),
_objects(_connection, _objectDbName),
_adapters(_connection, _adapterDbName),
- _replicaGroups(_connection, _replicaGroupDbName),
_lock(0),
_serial(0)
{
@@ -504,49 +461,6 @@ Database::instantiateServer(const string& application, const string& node, const
for_each(entries.begin(), entries.end(), IceUtil::voidMemFun(&ServerEntry::sync));
}
-void
-Database::patchApplication(const string& name,
- const DistributionDescriptor& appDistrib,
- const map<string, DistributionDescriptorDict>& nodeDistrib,
- bool shutdown)
-{
- for(map<string, DistributionDescriptorDict>::const_iterator p = nodeDistrib.begin(); p != nodeDistrib.end(); ++p)
- {
- if(_traceLevels->patch > 0)
- {
- Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat);
- out << "started patching of application `" << name << "' on node `" << p->first << "'";
- }
- AMI_Node_patchPtr cb = new PatchCB(this, name, p->first);
- try
- {
- _nodeCache.get(p->first)->getProxy()->patch_async(cb, name, appDistrib, p->second, shutdown);
- }
- catch(const Ice::Exception& ex)
- {
- cb->ice_exception(ex);
- }
- }
-}
-
-void
-Database::finishedPatchApplication(const string& name, const string& node, const string& failure)
-{
- if(_traceLevels->patch > 0)
- {
- if(failure.empty())
- {
- Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat);
- out << "finished patching of application `" << name << "' on node `" << node << "'";
- }
- else
- {
- Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat);
- out << "patching of application `" << name << "' on node `" << node << "' failed:\n" << failure;
- }
- }
-}
-
ApplicationDescriptor
Database::getApplicationDescriptor(const std::string& name)
{
@@ -642,8 +556,7 @@ bool
Database::setAdapterDirectProxy(const string& adapterId, const string& replicaGroupId, const Ice::ObjectPrx& proxy)
{
Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName);
- StringProxyDict adapters(connection, _adapterDbName);
- StringStringSeqDict replicaGroups(connection, _replicaGroupDbName);
+ StringAdapterInfoDict adapters(connection, _adapterDbName);
if(proxy)
{
Lock sync(*this);
@@ -652,46 +565,39 @@ Database::setAdapterDirectProxy(const string& adapterId, const string& replicaGr
return false;
}
- StringProxyDict::iterator p = adapters.find(adapterId);
+ StringAdapterInfoDict::iterator p = adapters.find(adapterId);
if(p != adapters.end())
{
- p.set(proxy);
+ AdapterInfo info = p->second;
+ info.proxy = proxy;
+ info.replicaGroupId = replicaGroupId;
+ p.set(info);
if(_traceLevels->adapter > 0)
{
Ice::Trace out(_traceLevels->logger, _traceLevels->adapterCat);
out << "updated adapter `" << adapterId << "'";
+ if(!replicaGroupId.empty())
+ {
+ out << " with replica group `" << replicaGroupId << "'";
+ }
}
}
else
{
- adapters.put(StringProxyDict::value_type(adapterId, proxy));
+ AdapterInfo info;
+ info.proxy = proxy;
+ info.replicaGroupId = replicaGroupId;
+ adapters.put(StringAdapterInfoDict::value_type(adapterId, info));
if(_traceLevels->adapter > 0)
{
Ice::Trace out(_traceLevels->logger, _traceLevels->adapterCat);
out << "added adapter `" << adapterId << "'";
- }
- }
-
- if(!replicaGroupId.empty())
- {
- StringStringSeqDict::iterator q = replicaGroups.find(replicaGroupId);
- if(q != replicaGroups.end())
- {
- if(find(q->second.begin(), q->second.end(), adapterId) == q->second.end())
+ if(!replicaGroupId.empty())
{
- Ice::StringSeq adapters = q->second;
- adapters.push_back(adapterId);
- q.set(adapters);
+ out << " with replica group `" << replicaGroupId << "'";
}
}
- else
- {
- Ice::StringSeq adapters;
- adapters.push_back(adapterId);
- replicaGroups.put(StringStringSeqDict::value_type(replicaGroupId, adapters));
- }
- }
-
+ }
return true;
}
else
@@ -702,10 +608,13 @@ Database::setAdapterDirectProxy(const string& adapterId, const string& replicaGr
return false;
}
- if(adapters.erase(adapterId) == 0)
+ StringAdapterInfoDict::iterator p = adapters.find(adapterId);
+ if(p == adapters.end())
{
return true;
}
+ AdapterInfo info = p->second;
+ adapters.erase(p);
if(_traceLevels->adapter > 0)
{
@@ -713,19 +622,6 @@ Database::setAdapterDirectProxy(const string& adapterId, const string& replicaGr
out << "removed adapter `" << adapterId << "'";
}
- if(!replicaGroupId.empty())
- {
- StringStringSeqDict::iterator q = replicaGroups.find(replicaGroupId);
- if(q == replicaGroups.end())
- {
- return true;
- }
-
- Ice::StringSeq adapters = q->second;
- adapters.erase(remove(adapters.begin(), adapters.end(), adapterId), adapters.end());
- q.set(adapters);
- }
-
return true;
}
}
@@ -734,11 +630,11 @@ Ice::ObjectPrx
Database::getAdapterDirectProxy(const string& adapterId)
{
Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName);
- StringProxyDict adapters(connection, _adapterDbName);
- StringProxyDict::const_iterator p = adapters.find(adapterId);
+ StringAdapterInfoDict adapters(connection, _adapterDbName);
+ StringAdapterInfoDict::const_iterator p = adapters.find(adapterId);
if(p != adapters.end())
{
- return p->second;
+ return p->second.proxy;
}
return 0;
}
@@ -759,33 +655,50 @@ Database::removeAdapter(const string& adapterId)
}
Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName);
- StringProxyDict adapters(connection, _adapterDbName);
- StringProxyDict::iterator p = adapters.find(adapterId);
- if(p != adapters.end())
+
{
- adapters.erase(p);
- if(_traceLevels->adapter > 0)
+ StringAdapterInfoDict adapters(connection, _adapterDbName);
+ StringAdapterInfoDict::iterator p = adapters.find(adapterId);
+ if(p != adapters.end())
{
- Ice::Trace out(_traceLevels->logger, _traceLevels->adapterCat);
- out << "removed adapter `" << adapterId << "'";
+ AdapterInfo info = p->second;
+ adapters.erase(p);
+
+ if(_traceLevels->adapter > 0)
+ {
+ Ice::Trace out(_traceLevels->logger, _traceLevels->adapterCat);
+ out << "removed adapter `" << adapterId << "'";
+ }
+ return;
}
- return;
}
- StringStringSeqDict replicaGroups(connection, _replicaGroupDbName);
- StringStringSeqDict::iterator q = replicaGroups.find(adapterId);
- if(q != replicaGroups.end())
{
- replicaGroups.erase(q);
- if(_traceLevels->adapter > 0)
+ Freeze::TransactionHolder txHolder(connection);
+ StringAdapterInfoDict adapters(connection, _adapterDbName);
+
+ StringAdapterInfoDict::iterator p = adapters.findByReplicaGroupId(adapterId, true);
+ if(p == adapters.end())
{
- Ice::Trace out(_traceLevels->logger, _traceLevels->adapterCat);
- out << "removed adapter `" << adapterId << "'";
+ throw AdapterNotExistException(adapterId);
+ }
+
+ while(p != adapters.end())
+ {
+ AdapterInfo info = p->second;
+ info.replicaGroupId = "";
+ adapters.put(StringAdapterInfoDict::value_type(p->first, info));
+ ++p;
}
- return;
+
+ txHolder.commit();
}
- throw AdapterNotExistException(adapterId);
+ if(_traceLevels->adapter > 0)
+ {
+ Ice::Trace out(_traceLevels->logger, _traceLevels->adapterCat);
+ out << "removed replica group `" << adapterId << "'";
+ }
}
AdapterPrx
@@ -795,7 +708,7 @@ Database::getAdapter(const string& id, const string& replicaGroupId)
}
vector<pair<string, AdapterPrx> >
-Database::getAdapters(const string& id, int& endpointCount)
+Database::getAdapters(const string& id, bool allRegistered, int& endpointCount)
{
//
// First we check if the given adapter id is associated to a
@@ -804,7 +717,7 @@ Database::getAdapters(const string& id, int& endpointCount)
//
try
{
- return _adapterCache.get(id)->getProxies(endpointCount);
+ return _adapterCache.get(id)->getProxies(allRegistered, endpointCount);
}
catch(AdapterNotExistException&)
{
@@ -815,8 +728,8 @@ Database::getAdapters(const string& id, int& endpointCount)
// entry the adapter is managed by the registry itself.
//
Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName);
- StringProxyDict adapters(connection, _adapterDbName);
- StringProxyDict::const_iterator p = adapters.find(id);
+ StringAdapterInfoDict adapters(connection, _adapterDbName);
+ StringAdapterInfoDict::const_iterator p = adapters.find(id);
if(p != adapters.end())
{
vector<pair<string, AdapterPrx> > adapters;
@@ -833,22 +746,22 @@ Database::getAdapters(const string& id, int& endpointCount)
// If it's not a regular object adapter, perhaps it's a replica
// group...
//
- StringStringSeqDict replicaGroups(connection, _replicaGroupDbName);
- StringStringSeqDict::const_iterator q = replicaGroups.find(id);
- if(q != replicaGroups.end())
+ p = adapters.findByReplicaGroupId(id, true);
+ if(p != adapters.end())
{
- vector<pair<string, AdapterPrx> > adapters;
- for(Ice::StringSeq::const_iterator r = q->second.begin(); r != q->second.end(); ++r)
+ vector<pair<string, AdapterPrx> > adpts;
+ while(p != adapters.end())
{
Ice::Identity identity;
identity.category = "IceGridAdapter";
- identity.name = *r;
+ identity.name = p->first;
AdapterPrx adpt = AdapterPrx::uncheckedCast(_internalAdapter->createDirectProxy(identity));
- adapters.push_back(make_pair(*r, adpt));
+ adpts.push_back(make_pair(p->first, adpt));
+ ++p;
}
- random_shuffle(adapters.begin(), adapters.end());
- endpointCount = adapters.size();
- return adapters;
+ random_shuffle(adpts.begin(), adpts.end());
+ endpointCount = adpts.size();
+ return adpts;
}
throw AdapterNotExistException(id);
@@ -861,10 +774,20 @@ Database::getAllAdapters(const string& expression)
vector<string> result;
vector<string> ids = _adapterCache.getAll(expression);
result.swap(ids);
- ids = getMatchingKeys<StringProxyDict>(_adapters, expression);
- result.insert(result.end(), ids.begin(), ids.end());
- ids = getMatchingKeys<StringStringSeqDict>(_replicaGroups, expression);
- result.insert(result.end(), ids.begin(), ids.end());
+ set<string> groups;
+ for(StringAdapterInfoDict::const_iterator p = _adapters.begin(); p != _adapters.end(); ++p)
+ {
+ if(expression.empty() || IceUtil::match(p->first, expression, true))
+ {
+ result.push_back(p->first);
+ }
+ string replicaGroupId = p->second.replicaGroupId;
+ if(!replicaGroupId.empty() && (expression.empty() || IceUtil::match(replicaGroupId, expression, true)))
+ {
+ groups.insert(replicaGroupId);
+ }
+ }
+ result.insert(result.end(), groups.begin(), groups.end());
return result;
}
@@ -1136,7 +1059,7 @@ Database::checkAdapterForAddition(const string& id)
{
if(_adapterCache.has(id) ||
_adapters.find(id) != _adapters.end() ||
- _replicaGroups.find(id) != _replicaGroups.end())
+ _adapters.findByReplicaGroupId(id) != _adapters.end())
{
DeploymentException ex;
ex.reason = "adapter `" + id + "' is already registered";
diff --git a/cpp/src/IceGrid/Database.h b/cpp/src/IceGrid/Database.h
index da990cfbd7c..17f79b36bc5 100644
--- a/cpp/src/IceGrid/Database.h
+++ b/cpp/src/IceGrid/Database.h
@@ -18,8 +18,7 @@
#include <IceGrid/Internal.h>
#include <IceGrid/StringApplicationDescriptorDict.h>
#include <IceGrid/IdentityObjectInfoDict.h>
-#include <IceGrid/StringProxyDict.h>
-#include <IceGrid/StringStringSeqDict.h>
+#include <IceGrid/StringAdapterInfoDict.h>
#include <IceGrid/ServerCache.h>
#include <IceGrid/NodeCache.h>
#include <IceGrid/ObjectCache.h>
@@ -61,10 +60,6 @@ public:
void removeApplicationDescriptor(ObserverSessionI*, const std::string&);
void instantiateServer(const std::string&, const std::string&, const ServerInstanceDescriptor&);
- void patchApplication(const std::string&, const DistributionDescriptor&,
- const std::map<std::string, DistributionDescriptorDict>&, bool = false);
- void finishedPatchApplication(const std::string&, const std::string&, const std::string& = std::string());
-
ApplicationDescriptor getApplicationDescriptor(const std::string&);
Ice::StringSeq getAllApplications(const std::string& = std::string());
@@ -84,7 +79,7 @@ public:
Ice::ObjectPrx getAdapterDirectProxy(const std::string&);
void removeAdapter(const std::string&);
AdapterPrx getAdapter(const std::string&, const std::string&);
- std::vector<std::pair<std::string, AdapterPrx> > getAdapters(const std::string&, int&);
+ std::vector<std::pair<std::string, AdapterPrx> > getAdapters(const std::string&, bool, int&);
Ice::StringSeq getAllAdapters(const std::string& = std::string());
void addObject(const ObjectInfo&);
@@ -140,8 +135,7 @@ private:
Freeze::ConnectionPtr _connection;
StringApplicationDescriptorDict _descriptors;
IdentityObjectInfoDict _objects;
- StringProxyDict _adapters;
- StringStringSeqDict _replicaGroups;
+ StringAdapterInfoDict _adapters;
ObserverSessionI* _lock;
std::string _lockUserId;
diff --git a/cpp/src/IceGrid/LocatorI.cpp b/cpp/src/IceGrid/LocatorI.cpp
index ba46f59e6da..7d8c0013032 100644
--- a/cpp/src/IceGrid/LocatorI.cpp
+++ b/cpp/src/IceGrid/LocatorI.cpp
@@ -339,7 +339,7 @@ LocatorI::findAdapterById_async(const Ice::AMD_Locator_findAdapterByIdPtr& cb,
try
{
int count;
- vector<pair<string, AdapterPrx> > adapters = _database->getAdapters(id, count);
+ vector<pair<string, AdapterPrx> > adapters = _database->getAdapters(id, false, count);
if(adapters.empty())
{
cb->ice_response(0);
diff --git a/cpp/src/IceGrid/Makefile b/cpp/src/IceGrid/Makefile
index 867bf489442..6a042a6311a 100644
--- a/cpp/src/IceGrid/Makefile
+++ b/cpp/src/IceGrid/Makefile
@@ -49,10 +49,9 @@ NODE_OBJS = NodeI.o \
PlatformInfo.o
REGISTRY_OBJS = RegistryI.o \
- StringProxyDict.o \
- StringStringSeqDict.o \
StringApplicationDescriptorDict.o \
IdentityObjectInfoDict.o \
+ StringAdapterInfoDict.o \
Database.o \
AdapterCache.o \
ObjectCache.o \
@@ -140,22 +139,6 @@ $(LOCAL_HDIR)/%.h %.cpp: $(SDIR)/%.ice $(SLICE2CPP)
rm -f $(HDIR)/$(*F).h $(*F).cpp
$(SLICE2CPP) $(SLICE2CPPFLAGS) $(SDIR)/$(*F).ice
-$(LOCAL_HDIR)/StringProxyDict.h StringProxyDict.cpp: $(SLICE2FREEZE)
- rm -f StringProxyDict.h StringProxyDict.cpp
- $(SLICE2FREEZECMD) --dict IceGrid::StringProxyDict,string,Object* \
- StringProxyDict $(LOCAL_SDIR)/Internal.ice
-
-clean::
- rm -f StringProxyDict.h StringProxyDict.cpp
-
-$(LOCAL_HDIR)/StringStringSeqDict.h StringStringSeqDict.cpp: $(SLICE2FREEZE)
- rm -f StringStringSeqDict.h StringStringSeqDict.cpp
- $(SLICE2FREEZECMD) --dict IceGrid::StringStringSeqDict,string,Ice::StringSeq \
- StringStringSeqDict $(SDIR)/../Ice/BuiltinSequences.ice
-
-clean::
- rm -f StringStringSeqDict.h StringStringSeqDict.cpp
-
$(LOCAL_HDIR)/StringApplicationDescriptorDict.h StringApplicationDescriptorDict.cpp: $(SLICE2FREEZE)
rm -f StringApplicationDescriptorDict.h StringApplicationDescriptorDict.cpp
$(SLICE2FREEZECMD) --dict IceGrid::StringApplicationDescriptorDict,string,IceGrid::ApplicationDescriptor \
@@ -173,6 +156,14 @@ $(LOCAL_HDIR)/IdentityObjectInfoDict.h IdentityObjectInfoDict.cpp: $(SLICE2FREEZ
clean::
rm -f IdentityObjectInfoDict.h IdentityObjectInfoDict.cpp
+$(LOCAL_HDIR)/StringAdapterInfoDict.h StringAdapterInfoDict.cpp: $(SLICE2FREEZE)
+ rm -f StringAdapterInfoDict.h StringAdapterInfoDict.cpp
+ $(SLICE2FREEZECMD) --dict IceGrid::StringAdapterInfoDict,string,IceGrid::AdapterInfo \
+ --dict-index IceGrid::StringAdapterInfoDict,replicaGroupId StringAdapterInfoDict $(SDIR)/Admin.ice
+
+clean::
+ rm -f StringAdapterInfoDict.h StringAdapterInfoDict.cpp
+
# Needed for make -jn to work.
#../IceGrid/Grammar.y: Grammar.h
diff --git a/cpp/src/IceGrid/NodeI.cpp b/cpp/src/IceGrid/NodeI.cpp
index 3a6139f2b34..2b428ff04af 100644
--- a/cpp/src/IceGrid/NodeI.cpp
+++ b/cpp/src/IceGrid/NodeI.cpp
@@ -308,18 +308,19 @@ NodeI::patch(const string& application,
try
{
+ set<ServerIPtr>::iterator s = servers.begin();
vector<string> running;
- set<ServerIPtr>::const_iterator s;
- for(s = servers.begin(); s != servers.end(); ++s)
+ while(s != servers.end())
{
if(!(*s)->startPatch(shutdown))
{
running.push_back((*s)->getId());
+ servers.erase(s++);
+ }
+ else
+ {
+ ++s;
}
- }
- for(s = servers.begin(); s != servers.end(); ++s)
- {
- (*s)->waitForPatch();
}
if(!running.empty())
@@ -337,6 +338,11 @@ NodeI::patch(const string& application,
throw ex;
}
+ for(s = servers.begin(); s != servers.end(); ++s)
+ {
+ (*s)->waitForPatch();
+ }
+
try
{
//
diff --git a/cpp/src/IceGrid/Parser.cpp b/cpp/src/IceGrid/Parser.cpp
index 91ed2165125..f7969448903 100644
--- a/cpp/src/IceGrid/Parser.cpp
+++ b/cpp/src/IceGrid/Parser.cpp
@@ -103,14 +103,8 @@ Parser::usage()
" started on demand or administratively).\n"
"\n"
"adapter list List all registered adapters.\n"
- "adapter endpoints ID [REPLICAID]\n"
- " Show the endpoints of adapter ID from replica REPLICAID.\n"
- " If REPLICAID is not specified, show the endpoints of all\n"
- " the registered replicas.\n"
- "adapter remove ID [REPLICAID]\n"
- " Remove the endpoints of adapter ID from replica REPLICAID.\n"
- " If REPLICAID is not specified, remove the endpoints of all\n"
- " the registered replicas.\n"
+ "adapter endpoints ID Show the endpoints of adapter or replica group ID.\n"
+ "adapter remove ID Remove adapter or replica group ID.\n"
"\n"
"object add PROXY [TYPE] Add an object to the object registry,\n"
" optionally specifying its type.\n"
@@ -944,9 +938,9 @@ Parser::listAllServers()
void
Parser::endpointsAdapter(const list<string>& args)
{
- if(args.size() < 1)
+ if(args.size() != 1)
{
- error("`adapter endpoints' requires at least one argument\n(`help' for more info)");
+ error("`adapter endpoints' requires exactly one argument\n(`help' for more info)");
return;
}
@@ -955,15 +949,9 @@ Parser::endpointsAdapter(const list<string>& args)
list<string>::const_iterator p = args.begin();
string adapterId = *p++;
StringObjectProxyDict proxies = _admin->getAdapterEndpoints(adapterId);
- if(args.size() > 1)
+ if(proxies.size() == 1 && proxies.begin()->first == adapterId)
{
- string serverId = *p++;
- if(proxies.find(serverId) == proxies.end())
- {
- throw ServerNotExistException();
- }
-
- string endpoints = _communicator->proxyToString(proxies[serverId]);
+ string endpoints = _communicator->proxyToString(proxies.begin()->second);
cout << (endpoints.empty() ? "<inactive>" : endpoints) << endl;
}
else
diff --git a/cpp/src/IceGrid/ServerI.cpp b/cpp/src/IceGrid/ServerI.cpp
index 423e194945b..a4f53f88b39 100644
--- a/cpp/src/IceGrid/ServerI.cpp
+++ b/cpp/src/IceGrid/ServerI.cpp
@@ -1761,7 +1761,7 @@ ServerI::updateConfigFile(const string& serverDir, const CommunicatorDescriptorP
}
}
else
- {
+ {
ServiceDescriptorPtr serviceDesc = ServiceDescriptorPtr::dynamicCast(descriptor);
assert(serviceDesc);
configFilePath = serverDir + "/config/config_" + serviceDesc->name;