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:


Reply via email to