You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2010/05/20 21:52:56 UTC
svn commit: r946773 - in /qpid/trunk/qpid/cpp:
include/qpid/management/ManagementObject.h
src/qpid/management/ManagementAgent.cpp src/qpid/management/ManagementAgent.h
src/qpid/management/ManagementObject.cpp
Author: tross
Date: Thu May 20 19:52:55 2010
New Revision: 946773
URL: http://svn.apache.org/viewvc?rev=946773&view=rev
Log:
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.
Modified:
qpid/trunk/qpid/cpp/include/qpid/management/ManagementObject.h
qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp
qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.h
qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.cpp
Modified: qpid/trunk/qpid/cpp/include/qpid/management/ManagementObject.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/management/ManagementObject.h?rev=946773&r1=946772&r2=946773&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/management/ManagementObject.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/management/ManagementObject.h Thu May 20 19:52:55 2010
@@ -78,6 +78,7 @@ public:
QPID_COMMON_EXTERN bool equalV1(const ObjectId &other) const;
QPID_COMMON_EXTERN void setV2Key(const std::string& _key) { v2Key = _key; }
QPID_COMMON_EXTERN void setV2Key(const ManagementObject& object);
+ QPID_COMMON_EXTERN void disambiguate();
QPID_COMMON_EXTERN void setAgentName(const std::string& _name) { agentName = _name; }
QPID_COMMON_EXTERN const std::string& getAgentName() const { return agentName; }
QPID_COMMON_EXTERN const std::string& getV2Key() const { return v2Key; }
Modified: qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp?rev=946773&r1=946772&r2=946773&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp Thu May 20 19:52:55 2010
@@ -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(Mana
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(Mana
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
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();
}
Modified: qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.h?rev=946773&r1=946772&r2=946773&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.h Thu May 20 19:52:55 2010
@@ -242,13 +242,11 @@ private:
// Protected by userLock
//
ManagementObjectMap managementObjects;
- ManagementObjectVector deletedManagementObjects;
//
// Protected by addLock
//
ManagementObjectMap newManagementObjects;
- ManagementObjectVector newDeletedManagementObjects;
framing::Uuid uuid;
Modified: qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.cpp?rev=946773&r1=946772&r2=946773&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.cpp Thu May 20 19:52:55 2010
@@ -30,6 +30,7 @@
#include <stdlib.h>
+using namespace std;
using namespace qpid;
using namespace qpid::management;
@@ -71,19 +72,19 @@ ObjectId::ObjectId(AgentAttachment* _age
}
-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::str
// 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::str
(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 &o
}
// 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& buffe
}
// 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&
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()
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 (
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());
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org