diff options
author | Benoit Foucher <benoit@zeroc.com> | 2009-03-25 12:44:32 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2009-03-25 12:44:32 +0100 |
commit | 1af6b5ee2872fe04c9185cf96f6bb9535506a782 (patch) | |
tree | 69be157019dcd71f0c599e389af18f4ad2d1fe56 /cpp/src/IceGrid/Database.cpp | |
parent | Fixed bug 3898 - bogus exit code for Freeze/transform Java clients (diff) | |
download | ice-1af6b5ee2872fe04c9185cf96f6bb9535506a782.tar.bz2 ice-1af6b5ee2872fe04c9185cf96f6bb9535506a782.tar.xz ice-1af6b5ee2872fe04c9185cf96f6bb9535506a782.zip |
Fixed bug 3230 - IceGrid node leak
Diffstat (limited to 'cpp/src/IceGrid/Database.cpp')
-rw-r--r-- | cpp/src/IceGrid/Database.cpp | 63 |
1 files changed, 29 insertions, 34 deletions
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp index 741462280a7..dc87fad3849 100644 --- a/cpp/src/IceGrid/Database.cpp +++ b/cpp/src/IceGrid/Database.cpp @@ -307,10 +307,7 @@ Database::addApplication(const ApplicationInfo& info, AdminSessionI* session) Lock sync(*this); checkSessionLock(session); - while(_updating.find(info.descriptor.name) != _updating.end()) - { - wait(); - } + waitForUpdate(info.descriptor.name); if(_applications.find(info.descriptor.name) != _applications.end()) { @@ -320,7 +317,7 @@ Database::addApplication(const ApplicationInfo& info, AdminSessionI* session) ApplicationHelper helper(_communicator, info.descriptor, true); checkForAddition(helper); load(helper, entries, info.uuid, info.revision); - startUpdating(info.descriptor.name); + startUpdating(info.descriptor.name, info.uuid, info.revision); } if(_master) @@ -378,10 +375,7 @@ Database::updateApplication(const ApplicationUpdateInfo& updt, AdminSessionI* se Lock sync(*this); checkSessionLock(session); - while(_updating.find(update.descriptor.name) != _updating.end()) - { - wait(); - } + waitForUpdate(update.descriptor.name); StringApplicationInfoDict::const_iterator p = _applications.find(update.descriptor.name); if(p == _applications.end()) @@ -403,7 +397,7 @@ Database::updateApplication(const ApplicationUpdateInfo& updt, AdminSessionI* se newDesc = helper.getDefinition(); - startUpdating(update.descriptor.name); + startUpdating(update.descriptor.name, oldApp.uuid, oldApp.revision + 1); } finishApplicationUpdate(entries, update, oldApp, newDesc, session); @@ -419,10 +413,7 @@ Database::syncApplicationDescriptor(const ApplicationDescriptor& newDesc, AdminS Lock sync(*this); checkSessionLock(session); - while(_updating.find(newDesc.name) != _updating.end()) - { - wait(); - } + waitForUpdate(newDesc.name); StringApplicationInfoDict::const_iterator p = _applications.find(newDesc.name); if(p == _applications.end()) @@ -442,7 +433,7 @@ Database::syncApplicationDescriptor(const ApplicationDescriptor& newDesc, AdminS checkForUpdate(previous, helper); reload(previous, helper, entries, oldApp.uuid, oldApp.revision + 1); - startUpdating(update.descriptor.name); + startUpdating(update.descriptor.name, oldApp.uuid, oldApp.revision + 1); } finishApplicationUpdate(entries, update, oldApp, newDesc, session); @@ -462,10 +453,7 @@ Database::instantiateServer(const string& application, Lock sync(*this); checkSessionLock(session); - while(_updating.find(application) != _updating.end()) - { - wait(); - } + waitForUpdate(application); StringApplicationInfoDict::const_iterator p = _applications.find(application); if(p == _applications.end()) @@ -487,7 +475,7 @@ Database::instantiateServer(const string& application, newDesc = helper.getDefinition(); - startUpdating(update.descriptor.name); + startUpdating(update.descriptor.name, oldApp.uuid, oldApp.revision + 1); } finishApplicationUpdate(entries, update, oldApp, newDesc, session); @@ -502,10 +490,7 @@ Database::removeApplication(const string& name, AdminSessionI* session) Lock sync(*this); checkSessionLock(session); - while(_updating.find(name) != _updating.end()) - { - wait(); - } + waitForUpdate(name); StringApplicationInfoDict::iterator p = _applications.find(name); if(p == _applications.end()) @@ -535,7 +520,7 @@ Database::removeApplication(const string& name, AdminSessionI* session) // } - startUpdating(name); + startUpdating(name, p->second.uuid, p->second.revision); } if(_master) @@ -588,14 +573,15 @@ Database::getAllApplications(const string& expression) void Database::waitForApplicationUpdate(const AMD_NodeSession_waitForApplicationUpdatePtr& cb, - const string& application, + const string& uuid, int revision) { Lock sync(*this); - map<string, vector<AMD_NodeSession_waitForApplicationUpdatePtr> >::iterator p = _updating.find(application); + + vector<UpdateInfo>::iterator p = find(_updating.begin(), _updating.end(), make_pair(uuid, revision)); if(p != _updating.end()) { - p->second.push_back(cb); + p->cbs.push_back(cb); } else { @@ -1674,21 +1660,30 @@ Database::finishApplicationUpdate(ServerEntrySeq& entries, } void -Database::startUpdating(const string& name) +Database::waitForUpdate(const string& name) +{ + while(find(_updating.begin(), _updating.end(), name) != _updating.end()) + { + wait(); + } +} + +void +Database::startUpdating(const string& name, const string& uuid, int revision) { // Must be called within the synchronization. - _updating.insert(make_pair(name, vector<AMD_NodeSession_waitForApplicationUpdatePtr>())); + assert(find(_updating.begin(), _updating.end(), name) == _updating.end()); + _updating.push_back(UpdateInfo(name, uuid, revision)); } void Database::finishUpdating(const string& name) { Lock sync(*this); - - map<string, vector<AMD_NodeSession_waitForApplicationUpdatePtr> >::iterator p = _updating.find(name); + + vector<UpdateInfo>::iterator p = find(_updating.begin(), _updating.end(), name); assert(p != _updating.end()); - for(vector<AMD_NodeSession_waitForApplicationUpdatePtr>::const_iterator q = p->second.begin(); - q != p->second.end(); ++q) + for(vector<AMD_NodeSession_waitForApplicationUpdatePtr>::const_iterator q = p->cbs.begin(); q != p->cbs.end(); ++q) { (*q)->ice_response(); } |