diff options
| author | Alan Conway <aconway@apache.org> | 2010-12-08 19:21:05 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2010-12-08 19:21:05 +0000 |
| commit | 91723b2f5449f4eab8fd4b6db745eb4d97ee7064 (patch) | |
| tree | f744829ba90693ba176bb10c71af4aa3340738b5 /cpp/src/qpid/management | |
| parent | ce09d14a88ba18f37e309bbe555b51e367b3da39 (diff) | |
| download | qpid-python-91723b2f5449f4eab8fd4b6db745eb4d97ee7064.tar.gz | |
Defer update of managaement agent to end of update process.
Move updating of the management agent to the very end of the update
process, after all objects used by the update process itself have been
deleted. Before the fix deletions from the update process itself
(deleting the qpid.cluster-update queue and its binding to the default
exchange) were sporadically appearing as extra delete messages on the
updatees management agent and causing inconsistency.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1043621 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/management')
| -rw-r--r-- | cpp/src/qpid/management/ManagementAgent.cpp | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/cpp/src/qpid/management/ManagementAgent.cpp b/cpp/src/qpid/management/ManagementAgent.cpp index 9d9cfb5164..900f80fce6 100644 --- a/cpp/src/qpid/management/ManagementAgent.cpp +++ b/cpp/src/qpid/management/ManagementAgent.cpp @@ -2940,29 +2940,27 @@ void ManagementAgent::exportDeletedObjects(DeletedObjectList& outList) } } - -// Merge this list's deleted objects to the management Agent's list of deleted -// objects waiting for next (last) publish-ment. +// Called by cluster to reset the management agent's list of deleted +// objects to match the rest of the cluster. void ManagementAgent::importDeletedObjects(const DeletedObjectList& inList) { sys::Mutex::ScopedLock lock (userLock); - + // Clear out any existing deleted objects + moveNewObjectsLH(); + pendingDeletedObjs.clear(); + ManagementObjectMap::iterator i = managementObjects.begin(); + while (i != managementObjects.end()) { + ManagementObject* object = i->second; + if (object->isDeleted()) { + delete object; + managementObjects.erase(i++); + } + else ++i; + } for (DeletedObjectList::const_iterator lIter = inList.begin(); lIter != inList.end(); lIter++) { std::string classkey((*lIter)->packageName + std::string(":") + (*lIter)->className); - DeletedObjectList& dList = pendingDeletedObjs[classkey]; - - // not sure if this is necessary - merge by objectid.... - bool found = false; - for (DeletedObjectList::iterator dIter = dList.begin(); dIter != dList.end(); dIter++) { - if ((*dIter)->objectId == (*lIter)->objectId) { - found = true; - break; - } - } - if (!found) { - dList.push_back(*lIter); - } + pendingDeletedObjs[classkey].push_back(*lIter); } } |
