From c614014627bec840f754b964a42c01cf140cb611 Mon Sep 17 00:00:00 2001 From: Kenneth Anthony Giusti Date: Fri, 26 Mar 2010 21:03:31 +0000 Subject: qmf v1 tests pass git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/qmf-devel0.7a@928059 13f79535-47bb-0310-9956-ffa450edef68 --- .../cpp/include/qpid/management/ManagementObject.h | 7 ++-- qpid/cpp/src/qpid/management/ManagementAgent.cpp | 37 ++++++++++++++++++++-- qpid/cpp/src/qpid/management/ManagementObject.cpp | 32 ++++++------------- qpid/cpp/src/tests/ManagementTest.cpp | 8 ++--- 4 files changed, 53 insertions(+), 31 deletions(-) diff --git a/qpid/cpp/include/qpid/management/ManagementObject.h b/qpid/cpp/include/qpid/management/ManagementObject.h index 130b0b2f07..98ef886cd1 100644 --- a/qpid/cpp/include/qpid/management/ManagementObject.h +++ b/qpid/cpp/include/qpid/management/ManagementObject.h @@ -53,18 +53,21 @@ class ObjectId { protected: const AgentAttachment* agent; uint64_t first; + uint64_t second; uint64_t agentEpoch; std::string v2Key; std::string agentName; void fromString(const std::string&); public: - QPID_COMMON_EXTERN ObjectId() : agent(0), first(0) {} + QPID_COMMON_EXTERN ObjectId() : agent(0), first(0), second(0), agentEpoch(0) {} QPID_COMMON_EXTERN ObjectId(const messaging::Variant& map) : - agent(0), first(0), agentEpoch(0) { mapDecode(map.asMap()); } + agent(0), first(0), second(0), agentEpoch(0) { mapDecode(map.asMap()); } QPID_COMMON_EXTERN ObjectId(uint8_t flags, uint16_t seq, uint32_t broker); QPID_COMMON_EXTERN ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq); QPID_COMMON_EXTERN ObjectId(std::istream&); QPID_COMMON_EXTERN ObjectId(const std::string&); + // Deprecated: + QPID_COMMON_EXTERN ObjectId(uint8_t flags, uint16_t seq, uint32_t broker, uint64_t object); QPID_COMMON_EXTERN bool operator==(const ObjectId &other) const; QPID_COMMON_EXTERN bool operator<(const ObjectId &other) const; QPID_COMMON_EXTERN void mapEncode(messaging::VariantMap& map) const; diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.cpp b/qpid/cpp/src/qpid/management/ManagementAgent.cpp index 10c16a39f0..1ee5671c6d 100644 --- a/qpid/cpp/src/qpid/management/ManagementAgent.cpp +++ b/qpid/cpp/src/qpid/management/ManagementAgent.cpp @@ -221,11 +221,42 @@ void ManagementAgent::registerEvent (const string& packageName, addClassLH(ManagementItem::CLASS_KIND_EVENT, pIter, eventName, md5Sum, schemaCall); } -// Deprecated: +// Deprecated: V1 objects ObjectId ManagementAgent::addObject(ManagementObject* object, uint64_t persistId) { - // always force object to generate key string - return addObject(object, std::string(), persistId != 0); + uint16_t sequence; + uint64_t objectNum; + + if (persistId == 0) { + sequence = bootSequence; + objectNum = nextObjectId++; + } else { + sequence = 0; + objectNum = persistId; + } + + ObjectId objId(0 /*flags*/, sequence, brokerBank, objectNum); + objId.setV2Key(*object); // let object generate the v2 key + + object->setObjectId(objId); + + { + 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; + } + } + newManagementObjects[objId] = object; + } + + return objId; } diff --git a/qpid/cpp/src/qpid/management/ManagementObject.cpp b/qpid/cpp/src/qpid/management/ManagementObject.cpp index 9d6ff8dfb9..183763a417 100644 --- a/qpid/cpp/src/qpid/management/ManagementObject.cpp +++ b/qpid/cpp/src/qpid/management/ManagementObject.cpp @@ -39,22 +39,20 @@ void AgentAttachment::setBanks(uint32_t broker, uint32_t bank) ((uint64_t) (bank & 0x0fffffff)); } -#if 0 // Deprecated -ObjectId::ObjectId(uint8_t flags, uint16_t seq, uint32_t broker, uint32_t bank, uint64_t object) - : agent(0) +ObjectId::ObjectId(uint8_t flags, uint16_t seq, uint32_t broker, uint64_t object) + : agent(0), agentEpoch(seq) { first = ((uint64_t) (flags & 0x0f)) << 60 | ((uint64_t) (seq & 0x0fff)) << 48 | - ((uint64_t) (broker & 0x000fffff)) << 28 | - ((uint64_t) (bank & 0x0fffffff)); + ((uint64_t) (broker & 0x000fffff)) << 28; second = object; } -#endif + ObjectId::ObjectId(uint8_t flags, uint16_t seq, uint32_t broker) - : agent(0), agentEpoch(seq) + : agent(0), second(0), agentEpoch(seq) { first = ((uint64_t) (flags & 0x0f)) << 60 | @@ -63,7 +61,7 @@ ObjectId::ObjectId(uint8_t flags, uint16_t seq, uint32_t broker) } ObjectId::ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq) - : agent(_agent), agentEpoch(seq) + : agent(_agent), second(0), agentEpoch(seq) { first = @@ -93,7 +91,7 @@ void ObjectId::fromString(const std::string& text) // format: // V1: ---- - // V2: --<1>-- + // V2: Not used std::string copy(text.c_str()); char* cText; @@ -126,7 +124,7 @@ void ObjectId::fromString(const std::string& text) (atoll(field[2]) << 28); agentName = std::string(field[3]); - v2Key = std::string(field[4]); + second = atoll(field[4]); } @@ -143,13 +141,12 @@ bool ObjectId::operator<(const ObjectId &other) const bool ObjectId::equalV1(const ObjectId &other) const { uint64_t otherFirst = agent == 0 ? other.first : other.first & 0xffff000000000000LL; - return first == otherFirst && v2Key == other.v2Key; + return first == otherFirst && second == other.second; } // encode as V1-format binary void ObjectId::encode(std::string& buffer) const { - uint64_t second; const uint32_t len = 16; char _data[len]; qpid::framing::Buffer body(_data, len); @@ -158,14 +155,6 @@ void ObjectId::encode(std::string& buffer) const body.putLongLong(first); else body.putLongLong(first | agent->first); - - try { - second = boost::lexical_cast(v2Key); - } catch(const boost::bad_lexical_cast&) { - second = 0; - QPID_LOG(error, "Badly formatted QMF Object Id v2Key:" << v2Key); - } - body.putLongLong(second); body.reset(); @@ -175,7 +164,6 @@ void ObjectId::encode(std::string& buffer) const // decode as V1-format binary void ObjectId::decode(const std::string& buffer) { - uint64_t second; const uint32_t len = 16; char _data[len]; qpid::framing::Buffer body(_data, len); @@ -252,7 +240,7 @@ std::ostream& operator<<(std::ostream& out, const ObjectId& i) "-" << ((virtFirst & 0x0FFF000000000000LL) >> 48) << "-" << ((virtFirst & 0x0000FFFFF0000000LL) >> 28) << "-" << i.agentName << - "-" << i.v2Key; + "-" << i.second; return out; } diff --git a/qpid/cpp/src/tests/ManagementTest.cpp b/qpid/cpp/src/tests/ManagementTest.cpp index d0141f796f..58497eefcd 100644 --- a/qpid/cpp/src/tests/ManagementTest.cpp +++ b/qpid/cpp/src/tests/ManagementTest.cpp @@ -58,14 +58,14 @@ QPID_AUTO_TEST_CASE(testObjectIdSerializeString) { QPID_AUTO_TEST_CASE(testObjectIdEncode) { qpid::messaging::Variant::Map oidMap; - ObjectId oid(1, 2, 3); + ObjectId oid(1, 2, 3, 9999); oid.setV2Key("testkey"); oid.setAgentName("myAgent"); std::stringstream out1; out1 << oid; - BOOST_CHECK_EQUAL(out1.str(), "1-2-3-myAgent-testkey"); + BOOST_CHECK_EQUAL(out1.str(), "1-2-3-myAgent-9999"); } QPID_AUTO_TEST_CASE(testObjectIdAttach) { @@ -77,13 +77,13 @@ QPID_AUTO_TEST_CASE(testObjectIdAttach) { std::stringstream out1; out1 << oid; - BOOST_CHECK_EQUAL(out1.str(), "10-20-0-MrSmith-GabbaGabbaHey"); + BOOST_CHECK_EQUAL(out1.str(), "10-20-0-MrSmith-0"); agent.setBanks(30, 40); std::stringstream out2; out2 << oid; - BOOST_CHECK_EQUAL(out2.str(), "10-20-30-MrSmith-GabbaGabbaHey"); + BOOST_CHECK_EQUAL(out2.str(), "10-20-30-MrSmith-0"); } QPID_AUTO_TEST_CASE(testConsoleObjectId) { -- cgit v1.2.1