Author: tross
Date: Mon Nov 10 08:53:41 2008
New Revision: 712696

URL: http://svn.apache.org/viewvc?rev=712696&view=rev
Log:
QPID-1446 - Fixed memory leak in management agent affecting broker.
Added debug output to remote agent controllable via env variable.

Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp

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=712696&r1=712695&r2=712696&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.cpp Mon 
Nov 10 08:53:41 2008
@@ -23,6 +23,7 @@
 #include "ManagementAgentImpl.h"
 #include <list>
 #include <string.h>
+#include <stdlib.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <unistd.h>
@@ -80,11 +81,13 @@
     extThread(false), writeFd(-1), readFd(-1),
     connected(false), lastFailure("never connected"),
     clientWasAdded(true), requestedBrokerBank(0), requestedAgentBank(0),
-    assignedBrokerBank(0), assignedAgentBank(0), bootSequence(0),
+    assignedBrokerBank(0), assignedAgentBank(0), bootSequence(0), 
debugLevel(0),
     connThreadBody(*this), connThread(connThreadBody),
     pubThreadBody(*this), pubThread(pubThreadBody)
 {
-    // TODO: Establish system ID
+    char* debug = ::getenv("QMF_DEBUG_LEVEL");
+    if (debug)
+        debugLevel = ::atoi(debug);
 }
 
 ManagementAgentImpl::~ManagementAgentImpl()
@@ -111,6 +114,10 @@
     host         = brokerHost;
     port         = brokerPort;
 
+    if (debugLevel)
+        cout << "QMF Agent Initialized: broker=" << brokerHost << ":" << 
brokerPort <<
+            " interval=" << intervalSeconds << " storeFile=" << _storeFile << 
endl;
+
     // TODO: Abstract the socket calls for portability
     if (extThread) {
         int pair[2];
@@ -692,8 +699,13 @@
     // Delete flagged objects
     for (std::list<ObjectId>::reverse_iterator iter = deleteList.rbegin();
          iter != deleteList.rend();
-         iter++)
-        managementObjects.erase(*iter);
+         iter++) {
+        ManagementObjectMap::iterator miter = managementObjects.find(*iter);
+        if (miter != managementObjects.end()) {
+            delete miter->second;
+            managementObjects.erase(*iter);
+        }
+    }
 
     deleteList.clear();
 }
@@ -712,6 +724,8 @@
     while (true) {
         try {
             if (!agent.host.empty()) {
+                if (agent.debugLevel)
+                    cout << "QMF Agent attempting to connect to the broker..." 
<< endl;
                 connection.open(agent.host.c_str(), agent.port);
                 session = connection.newSession(queueName.str());
                 subscriptions = new client::SubscriptionManager(session);
@@ -721,6 +735,8 @@
                                      arg::bindingKey=queueName.str());
 
                 subscriptions->subscribe(agent, queueName.str(), dest);
+                if (agent.debugLevel)
+                    cout << "    Connection established" << endl;
                 {
                     Mutex::ScopedLock _lock(connLock);
                     operational = true;
@@ -730,6 +746,9 @@
                         subscriptions->run();
                     } catch (std::exception) {}
 
+                    if (agent.debugLevel)
+                        cout << "QMF Agent connection has been lost" << endl;
+
                     operational = false;
                 }
                 delay = delayMin;
@@ -741,6 +760,8 @@
         } catch (std::exception &e) {
             if (delay < delayMax)
                 delay *= delayFactor;
+            if (agent.debugLevel)
+                cout << "    Connection failed: exception=" << e.what() << 
endl;
         }
 
         {

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h?rev=712696&r1=712695&r2=712696&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/agent/ManagementAgentImpl.h Mon Nov 
10 08:53:41 2008
@@ -141,6 +141,7 @@
     uint32_t          assignedBrokerBank;
     uint32_t          assignedAgentBank;
     uint16_t          bootSequence;
+    uint8_t           debugLevel;
 
 #   define MA_BUFFER_SIZE 65536
     char outputBuffer[MA_BUFFER_SIZE];

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=712696&r1=712695&r2=712696&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/management/ManagementBroker.cpp Mon 
Nov 10 08:53:41 2008
@@ -409,8 +409,13 @@
     // Delete flagged objects
     for (std::list<ObjectId>::reverse_iterator iter = deleteList.rbegin ();
          iter != deleteList.rend ();
-         iter++)
-        managementObjects.erase (*iter);
+         iter++) {
+        ManagementObjectMap::iterator miter = managementObjects.find(*iter);
+        if (miter != managementObjects.end()) {
+            delete miter->second;
+            managementObjects.erase(*iter);
+        }
+    }
 
     if (!deleteList.empty()) {
         deleteList.clear();


Reply via email to