diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/IceGrid/AdapterCache.cpp | 8 | ||||
-rw-r--r-- | cpp/src/IceGrid/AdapterCache.h | 6 | ||||
-rw-r--r-- | cpp/src/IceGrid/AdminI.cpp | 269 | ||||
-rw-r--r-- | cpp/src/IceGrid/AdminI.h | 5 | ||||
-rw-r--r-- | cpp/src/IceGrid/Database.cpp | 251 | ||||
-rw-r--r-- | cpp/src/IceGrid/Database.h | 12 | ||||
-rw-r--r-- | cpp/src/IceGrid/LocatorI.cpp | 2 | ||||
-rw-r--r-- | cpp/src/IceGrid/Makefile | 27 | ||||
-rw-r--r-- | cpp/src/IceGrid/NodeI.cpp | 18 | ||||
-rw-r--r-- | cpp/src/IceGrid/Parser.cpp | 24 | ||||
-rw-r--r-- | cpp/src/IceGrid/ServerI.cpp | 2 |
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; |