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