diff options
| author | Ted Ross <tross@apache.org> | 2008-12-01 16:38:54 +0000 |
|---|---|---|
| committer | Ted Ross <tross@apache.org> | 2008-12-01 16:38:54 +0000 |
| commit | 1d8a1fa5fdbbe04f7c5412c51facae9b5b2518a5 (patch) | |
| tree | a672ee4efbc0a5289fe37d93bf4afcd4879d655f /cpp | |
| parent | 8f38c8b511bbf232c5a65203b415aff456e61992 (diff) | |
| download | qpid-python-1d8a1fa5fdbbe04f7c5412c51facae9b5b2518a5.tar.gz | |
Fixed a performance regression caused by the management code.
The current/last-change timestamp is now set on management objects
when they are published, not when they actually change. Also, the
timestamp is updated only if modifications were made to the object
in the last publish interval.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@722120 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
| -rwxr-xr-x | cpp/managementgen/qmfgen/schema.py | 4 | ||||
| -rw-r--r-- | cpp/src/qpid/agent/ManagementAgentImpl.cpp | 29 | ||||
| -rw-r--r-- | cpp/src/qpid/management/ManagementBroker.cpp | 10 | ||||
| -rw-r--r-- | cpp/src/qpid/management/ManagementObject.h | 12 |
4 files changed, 28 insertions, 27 deletions
diff --git a/cpp/managementgen/qmfgen/schema.py b/cpp/managementgen/qmfgen/schema.py index 16ec40a8c6..ee5efc0bb0 100755 --- a/cpp/managementgen/qmfgen/schema.py +++ b/cpp/managementgen/qmfgen/schema.py @@ -145,7 +145,6 @@ class SchemaType: stream.write (" " + prefix + varName + "Max = val;\n") if changeFlag != None: stream.write (" " + changeFlag + " = true;\n") - stream.write (" setUpdateTime();\n") stream.write (" }\n") if self.style != "mma": stream.write (" inline " + self.asArg + " get_" + varName + "() {\n"); @@ -158,7 +157,6 @@ class SchemaType: stream.write (" presenceMask[presenceByte_%s] &= ~presenceMask_%s;\n" % (varName, varName)) if changeFlag != None: stream.write (" " + changeFlag + " = true;\n") - stream.write (" setUpdateTime();\n") stream.write (" }\n") stream.write (" inline bool isSet_" + varName + "() {\n") stream.write (" return (presenceMask[presenceByte_%s] & presenceMask_%s) != 0;\n" % (varName, varName)) @@ -173,7 +171,6 @@ class SchemaType: stream.write (" " + varName + "High = " + varName + ";\n") if changeFlag != None: stream.write (" " + changeFlag + " = true;\n") - stream.write (" setUpdateTime();\n") stream.write (" }\n"); stream.write (" inline void dec_" + varName + " (" + self.asArg + " by = 1) {\n"); if not self.perThread: @@ -184,7 +181,6 @@ class SchemaType: stream.write (" " + varName + "Low = " + varName + ";\n") if changeFlag != None: stream.write (" " + changeFlag + " = true;\n") - stream.write (" setUpdateTime();\n") stream.write (" }\n"); def genHiLoStatResets (self, stream, varName): diff --git a/cpp/src/qpid/agent/ManagementAgentImpl.cpp b/cpp/src/qpid/agent/ManagementAgentImpl.cpp index 050f29ac7b..4d5034f137 100644 --- a/cpp/src/qpid/agent/ManagementAgentImpl.cpp +++ b/cpp/src/qpid/agent/ManagementAgentImpl.cpp @@ -695,23 +695,20 @@ void ManagementAgentImpl::periodicProcessing() cout << "Objects managed: " << managementObjects.size() << endl; } - if (clientWasAdded) { - clientWasAdded = false; - for (ManagementObjectMap::iterator iter = managementObjects.begin(); - iter != managementObjects.end(); - iter++) { - ManagementObject* object = iter->second; - object->setAllChanged(); - } - } - // // Clear the been-here flag on all objects in the map. // for (ManagementObjectMap::iterator iter = managementObjects.begin(); iter != managementObjects.end(); - iter++) - iter->second->setFlags(0); + iter++) { + ManagementObject* object = iter->second; + object->setFlags(0); + if (clientWasAdded) { + object->setForcePublish(true); + } + } + + clientWasAdded = false; // // Process the entire object map. @@ -727,6 +724,7 @@ void ManagementAgentImpl::periodicProcessing() if (baseObject->getFlags() == 1 || (!baseObject->getConfigChanged() && !baseObject->getInstChanged() && + !baseObject->getForcePublish() && !baseObject->isDeleted())) continue; @@ -737,19 +735,22 @@ void ManagementAgentImpl::periodicProcessing() ManagementObject* object = iter->second; if (baseObject->isSameClass(*object) && object->getFlags() == 0) { object->setFlags(1); + if (object->getConfigChanged() || object->getInstChanged()) + object->setUpdateTime(); - if (object->getConfigChanged() || object->isDeleted()) { + if (object->getConfigChanged() || object->getForcePublish() || object->isDeleted()) { encodeHeader(msgBuffer, 'c'); object->writeProperties(msgBuffer); } - if (object->getInstChanged()) { + if (object->getInstChanged() || object->getForcePublish()) { encodeHeader(msgBuffer, 'i'); object->writeStatistics(msgBuffer); } if (object->isDeleted()) deleteList.push_back(pair<ObjectId, ManagementObject*>(iter->first, object)); + object->setForcePublish(false); if (msgBuffer.available() < (BUFSIZE / 2)) break; diff --git a/cpp/src/qpid/management/ManagementBroker.cpp b/cpp/src/qpid/management/ManagementBroker.cpp index e9610ca282..7a092bbb1b 100644 --- a/cpp/src/qpid/management/ManagementBroker.cpp +++ b/cpp/src/qpid/management/ManagementBroker.cpp @@ -354,7 +354,7 @@ void ManagementBroker::periodicProcessing (void) iter != managementObjects.end (); iter++) { ManagementObject* object = iter->second; - object->setAllChanged (); + object->setForcePublish(true); } } @@ -364,7 +364,10 @@ void ManagementBroker::periodicProcessing (void) { ManagementObject* object = iter->second; - if (object->getConfigChanged () || object->isDeleted ()) + if (object->getConfigChanged() || object->getInstChanged()) + object->setUpdateTime(); + + if (object->getConfigChanged() || object->getForcePublish() || object->isDeleted()) { Buffer msgBuffer (msgChars, BUFSIZE); encodeHeader (msgBuffer, 'c'); @@ -376,7 +379,7 @@ void ManagementBroker::periodicProcessing (void) sendBuffer (msgBuffer, contentSize, mExchange, routingKey); } - if (object->getInstChanged ()) + if (object->getInstChanged() || object->getForcePublish()) { Buffer msgBuffer (msgChars, BUFSIZE); encodeHeader (msgBuffer, 'i'); @@ -390,6 +393,7 @@ void ManagementBroker::periodicProcessing (void) if (object->isDeleted()) deleteList.push_back(pair<ObjectId, ManagementObject*>(iter->first, object)); + object->setForcePublish(false); } // Delete flagged objects diff --git a/cpp/src/qpid/management/ManagementObject.h b/cpp/src/qpid/management/ManagementObject.h index 6f229353e3..e5604eb2e4 100644 --- a/cpp/src/qpid/management/ManagementObject.h +++ b/cpp/src/qpid/management/ManagementObject.h @@ -126,6 +126,7 @@ class ManagementObject : public ManagementItem uint32_t flags; static int nextThreadIndex; + bool forcePublish; int getThreadIndex(); void writeTimestamps (qpid::framing::Buffer& buf); @@ -136,7 +137,8 @@ class ManagementObject : public ManagementItem ManagementObject(ManagementAgent* _agent, Manageable* _core) : createTime(uint64_t(qpid::sys::Duration(qpid::sys::now()))), destroyTime(0), updateTime(createTime), configChanged(true), - instChanged(true), deleted(false), coreObject(_core), agent(_agent) {} + instChanged(true), deleted(false), + coreObject(_core), agent(_agent), forcePublish(false) {} virtual ~ManagementObject() {} virtual writeSchemaCall_t getWriteSchemaCall (void) = 0; @@ -156,11 +158,9 @@ class ManagementObject : public ManagementItem ObjectId getObjectId (void) { return objectId; } inline bool getConfigChanged (void) { return configChanged; } virtual bool getInstChanged (void) { return instChanged; } - inline void setAllChanged (void) { - configChanged = true; - instChanged = true; - } - inline void setUpdateTime() { updateTime = (uint64_t(sys::Duration(sys::now()))); } + inline void setForcePublish(bool f) { forcePublish = f; } + inline bool getForcePublish() { return forcePublish; } + inline void setUpdateTime() { updateTime = (uint64_t(sys::Duration(sys::now()))); } inline void resourceDestroy (void) { destroyTime = uint64_t (qpid::sys::Duration (qpid::sys::now ())); |
