summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2010-05-20 19:52:55 +0000
committerTed Ross <tross@apache.org>2010-05-20 19:52:55 +0000
commit2e056e55cf8c068d3b26a0dab83216d1d6438bb3 (patch)
tree8518580baf0d5703daa5db968f1f376830b6d54b /cpp/src
parent449c403f2671c25ea65b11837eaca611d8575957 (diff)
downloadqpid-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.cpp113
-rw-r--r--cpp/src/qpid/management/ManagementAgent.h2
-rw-r--r--cpp/src/qpid/management/ManagementObject.cpp36
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());