diff options
author | Ted Ross <tross@apache.org> | 2010-05-20 19:52:55 +0000 |
---|---|---|
committer | Ted Ross <tross@apache.org> | 2010-05-20 19:52:55 +0000 |
commit | 2e056e55cf8c068d3b26a0dab83216d1d6438bb3 (patch) | |
tree | 8518580baf0d5703daa5db968f1f376830b6d54b /cpp/src | |
parent | 449c403f2671c25ea65b11837eaca611d8575957 (diff) | |
download | qpid-python-2e056e55cf8c068d3b26a0dab83216d1d6438bb3.tar.gz |
Removed the logic in the broker's management agent that detected name collisions.
The new logic will disambiguate colliding names by adding an underscore to the one
being inserted.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@946773 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/qpid/management/ManagementAgent.cpp | 113 | ||||
-rw-r--r-- | cpp/src/qpid/management/ManagementAgent.h | 2 | ||||
-rw-r--r-- | cpp/src/qpid/management/ManagementObject.cpp | 36 |
3 files changed, 36 insertions, 115 deletions
diff --git a/cpp/src/qpid/management/ManagementAgent.cpp b/cpp/src/qpid/management/ManagementAgent.cpp index 92f9d799f9..39ac2d11af 100644 --- a/cpp/src/qpid/management/ManagementAgent.cpp +++ b/cpp/src/qpid/management/ManagementAgent.cpp @@ -113,12 +113,6 @@ ManagementAgent::~ManagementAgent () delete object; } managementObjects.clear(); - - while (!deletedManagementObjects.empty()) { - ManagementObject* object = deletedManagementObjects.back(); - delete object; - deletedManagementObjects.pop_back(); - } } } @@ -260,17 +254,11 @@ ObjectId ManagementAgent::addObject(ManagementObject* object, uint64_t persistId object->setObjectId(objId); { - sys::Mutex::ScopedLock lock (addLock); + sys::Mutex::ScopedLock lock(addLock); ManagementObjectMap::iterator destIter = newManagementObjects.find(objId); - if (destIter != newManagementObjects.end()) { - if (destIter->second->isDeleted()) { - newDeletedManagementObjects.push_back(destIter->second); - newManagementObjects.erase(destIter); - } else { - QPID_LOG(error, "ObjectId collision in addObject. class=" << object->getClassName() << - " key=" << objId.getV2Key()); - return objId; - } + while (destIter != newManagementObjects.end()) { + objId.disambiguate(); + destIter = newManagementObjects.find(objId); } newManagementObjects[objId] = object; } @@ -298,17 +286,11 @@ ObjectId ManagementAgent::addObject(ManagementObject* object, object->setObjectId(objId); { - sys::Mutex::ScopedLock lock (addLock); + sys::Mutex::ScopedLock lock(addLock); ManagementObjectMap::iterator destIter = newManagementObjects.find(objId); - if (destIter != newManagementObjects.end()) { - if (destIter->second->isDeleted()) { - newDeletedManagementObjects.push_back(destIter->second); - newManagementObjects.erase(destIter); - } else { - QPID_LOG(error, "ObjectId collision in addObject. class=" << object->getClassName() << - " key=" << objId.getV2Key()); - return objId; - } + while (destIter != newManagementObjects.end()) { + objId.disambiguate(); + destIter = newManagementObjects.find(objId); } newManagementObjects[objId] = object; } @@ -550,30 +532,16 @@ void ManagementAgent::moveNewObjectsLH() for (ManagementObjectMap::iterator iter = newManagementObjects.begin (); iter != newManagementObjects.end (); iter++) { - bool skip = false; - ManagementObjectMap::iterator destIter = managementObjects.find(iter->first); - if (destIter != managementObjects.end()) { - // We have an objectId collision with an existing object. If the old object - // is deleted, move it to the deleted list. - if (destIter->second->isDeleted()) { - deletedManagementObjects.push_back(destIter->second); - managementObjects.erase(destIter); - } else { - QPID_LOG(error, "ObjectId collision in moveNewObjects. class=" << - iter->second->getClassName() << " key=" << iter->first.getV2Key()); - skip = true; - } + ObjectId oid = iter->first; + ManagementObjectMap::iterator destIter = managementObjects.find(oid); + while (destIter != managementObjects.end()) { + oid.disambiguate(); + destIter = managementObjects.find(oid); } - if (!skip) - managementObjects[iter->first] = iter->second; + managementObjects[oid] = iter->second; } newManagementObjects.clear(); - - while (!newDeletedManagementObjects.empty()) { - deletedManagementObjects.push_back(newDeletedManagementObjects.back()); - newDeletedManagementObjects.pop_back(); - } } void ManagementAgent::periodicProcessing (void) @@ -727,58 +695,7 @@ void ManagementAgent::periodicProcessing (void) managementObjects.erase(iter->first); } - // Publish the deletion of objects created by insert-collision - bool collisionDeletions = false; - for (ManagementObjectVector::iterator cdIter = deletedManagementObjects.begin(); - cdIter != deletedManagementObjects.end(); cdIter++) { - collisionDeletions = true; - { - if (qmf1Support) { - Buffer msgBuffer(msgChars, BUFSIZE); - encodeHeader(msgBuffer, 'c'); - sBuf.clear(); - (*cdIter)->writeProperties(sBuf); - msgBuffer.putRawData(sBuf); - contentSize = BUFSIZE - msgBuffer.available (); - msgBuffer.reset (); - stringstream key; - key << "console.obj.1.0." << (*cdIter)->getPackageName() << "." << (*cdIter)->getClassName(); - sendBufferLH(msgBuffer, contentSize, mExchange, key.str()); - QPID_LOG(trace, "SEND ContentInd for deleted object to=" << key.str()); - } - - if (qmf2Support) { - Variant::List list_; - Variant::Map map_; - Variant::Map values; - Variant::Map headers; - - map_["_schema_id"] = mapEncodeSchemaId((*cdIter)->getPackageName(), - (*cdIter)->getClassName(), - "_data", - (*cdIter)->getMd5Sum()); - (*cdIter)->writeTimestamps(map_); - (*cdIter)->mapEncodeValues(values, true, false); - map_["_values"] = values; - list_.push_back(map_); - - headers["method"] = "indication"; - headers["qmf.opcode"] = "_data_indication"; - headers["qmf.content"] = "_data"; - headers["qmf.agent"] = name_address; - - stringstream key; - key << "agent.ind.data." << (*cdIter)->getPackageName() << "." << (*cdIter)->getClassName(); - - string content; - ListCodec::encode(list_, content); - sendBufferLH(content, "", headers, "amqp/list", v2Topic, key.str()); - QPID_LOG(trace, "SEND ContentInd for deleted object to=" << key.str()); - } - } - } - - if (!deleteList.empty() || collisionDeletions) { + if (!deleteList.empty()) { deleteList.clear(); deleteOrphanedAgentsLH(); } diff --git a/cpp/src/qpid/management/ManagementAgent.h b/cpp/src/qpid/management/ManagementAgent.h index a87cc917fe..a1c6f3ce24 100644 --- a/cpp/src/qpid/management/ManagementAgent.h +++ b/cpp/src/qpid/management/ManagementAgent.h @@ -242,13 +242,11 @@ private: // Protected by userLock // ManagementObjectMap managementObjects; - ManagementObjectVector deletedManagementObjects; // // Protected by addLock // ManagementObjectMap newManagementObjects; - ManagementObjectVector newDeletedManagementObjects; framing::Uuid uuid; diff --git a/cpp/src/qpid/management/ManagementObject.cpp b/cpp/src/qpid/management/ManagementObject.cpp index 209c935947..5cdf9eca59 100644 --- a/cpp/src/qpid/management/ManagementObject.cpp +++ b/cpp/src/qpid/management/ManagementObject.cpp @@ -30,6 +30,7 @@ #include <stdlib.h> +using namespace std; using namespace qpid; using namespace qpid::management; @@ -71,19 +72,19 @@ ObjectId::ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq) } -ObjectId::ObjectId(std::istream& in) : agent(0) +ObjectId::ObjectId(istream& in) : agent(0) { - std::string text; + string text; in >> text; fromString(text); } -ObjectId::ObjectId(const std::string& text) : agent(0) +ObjectId::ObjectId(const string& text) : agent(0) { fromString(text); } -void ObjectId::fromString(const std::string& text) +void ObjectId::fromString(const string& text) { #define FIELDS 5 #if defined (_WIN32) && !defined (atoll) @@ -94,7 +95,7 @@ void ObjectId::fromString(const std::string& text) // V1: <flags>-<sequence>-<broker-bank>-<agent-bank>-<uint64-app-id> // V2: Not used - std::string copy(text.c_str()); + string copy(text.c_str()); char* cText; char* field[FIELDS]; bool atFieldStart = true; @@ -124,7 +125,7 @@ void ObjectId::fromString(const std::string& text) (atoll(field[1]) << 48) + (atoll(field[2]) << 28); - agentName = std::string(field[3]); + agentName = string(field[3]); second = atoll(field[4]); } @@ -146,7 +147,7 @@ bool ObjectId::equalV1(const ObjectId &other) const } // encode as V1-format binary -void ObjectId::encode(std::string& buffer) const +void ObjectId::encode(string& buffer) const { const uint32_t len = 16; char _data[len]; @@ -163,7 +164,7 @@ void ObjectId::encode(std::string& buffer) const } // decode as V1-format binary -void ObjectId::decode(const std::string& buffer) +void ObjectId::decode(const string& buffer) { const uint32_t len = 16; char _data[len]; @@ -174,18 +175,23 @@ void ObjectId::decode(const std::string& buffer) body.reset(); first = body.getLongLong(); second = body.getLongLong(); - v2Key = boost::lexical_cast<std::string>(second); + v2Key = boost::lexical_cast<string>(second); } // generate the V2 key from the index fields defined // in the schema. void ObjectId::setV2Key(const ManagementObject& object) { - std::stringstream oname; + stringstream oname; oname << object.getPackageName() << ":" << object.getClassName() << ":" << object.getKey(); v2Key = oname.str(); } +void ObjectId::disambiguate() +{ + v2Key = v2Key + "_"; +} + // encode as V2-format map void ObjectId::mapEncode(types::Variant::Map& map) const { @@ -226,7 +232,7 @@ ObjectId::operator types::Variant::Map() const namespace qpid { namespace management { -std::ostream& operator<<(std::ostream& out, const ObjectId& i) +ostream& operator<<(ostream& out, const ObjectId& i) { uint64_t virtFirst = i.first; if (i.agent) @@ -263,7 +269,7 @@ void ManagementObject::resourceDestroy() int ManagementObject::maxThreads = 1; int ManagementObject::nextThreadIndex = 0; -void ManagementObject::writeTimestamps (std::string& buf) const +void ManagementObject::writeTimestamps (string& buf) const { char _data[4000]; qpid::framing::Buffer body(_data, 4000); @@ -279,16 +285,16 @@ void ManagementObject::writeTimestamps (std::string& buf) const body.reset(); body.getRawData(buf, len); - std::string oid; + string oid; objectId.encode(oid); buf += oid; } -void ManagementObject::readTimestamps (const std::string& buf) +void ManagementObject::readTimestamps (const string& buf) { char _data[4000]; qpid::framing::Buffer body(_data, 4000); - std::string unused; + string unused; uint8_t unusedUuid[16]; body.checkAvailable(buf.length()); |