Author: tross
Date: Mon Dec 1 08:38:54 2008
New Revision: 722120
URL: http://svn.apache.org/viewvc?rev=722120&view=rev
Log:
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.
Modified:
incubator/qpid/trunk/qpid/cpp/managementgen/qmfgen/schema.py
incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.h
incubator/qpid/trunk/qpid/python/qmf/console.py
Modified: incubator/qpid/trunk/qpid/cpp/managementgen/qmfgen/schema.py
URL:
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/managementgen/qmfgen/schema.py?rev=722120&r1=722119&r2=722120&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/managementgen/qmfgen/schema.py (original)
+++ incubator/qpid/trunk/qpid/cpp/managementgen/qmfgen/schema.py Mon Dec 1
08:38:54 2008
@@ -145,7 +145,6 @@
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 @@
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 @@
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 @@
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):
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp
URL:
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp?rev=722120&r1=722119&r2=722120&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp Mon
Dec 1 08:38:54 2008
@@ -695,23 +695,20 @@
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 @@
if (baseObject->getFlags() == 1 ||
(!baseObject->getConfigChanged() &&
!baseObject->getInstChanged() &&
+ !baseObject->getForcePublish() &&
!baseObject->isDeleted()))
continue;
@@ -737,19 +735,22 @@
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;
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp
URL:
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp?rev=722120&r1=722119&r2=722120&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp Mon
Dec 1 08:38:54 2008
@@ -354,7 +354,7 @@
iter != managementObjects.end ();
iter++) {
ManagementObject* object = iter->second;
- object->setAllChanged ();
+ object->setForcePublish(true);
}
}
@@ -364,7 +364,10 @@
{
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 @@
sendBuffer (msgBuffer, contentSize, mExchange, routingKey);
}
- if (object->getInstChanged ())
+ if (object->getInstChanged() || object->getForcePublish())
{
Buffer msgBuffer (msgChars, BUFSIZE);
encodeHeader (msgBuffer, 'i');
@@ -390,6 +393,7 @@
if (object->isDeleted())
deleteList.push_back(pair<ObjectId,
ManagementObject*>(iter->first, object));
+ object->setForcePublish(false);
}
// Delete flagged objects
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.h
URL:
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.h?rev=722120&r1=722119&r2=722120&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.h
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.h Mon
Dec 1 08:38:54 2008
@@ -126,6 +126,7 @@
uint32_t flags;
static int nextThreadIndex;
+ bool forcePublish;
int getThreadIndex();
void writeTimestamps (qpid::framing::Buffer& buf);
@@ -136,7 +137,8 @@
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 @@
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 ()));
Modified: incubator/qpid/trunk/qpid/python/qmf/console.py
URL:
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/python/qmf/console.py?rev=722120&r1=722119&r2=722120&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/python/qmf/console.py (original)
+++ incubator/qpid/trunk/qpid/python/qmf/console.py Mon Dec 1 08:38:54 2008
@@ -558,7 +558,7 @@
self.cv.release()
object = Object(self, broker, schema, codec, prop, stat)
- if pname == "org.apache.qpid.broker" and classKey.getClassName() ==
"agent":
+ if pname == "org.apache.qpid.broker" and classKey.getClassName() ==
"agent" and prop:
broker._updateAgent(object)
try: