summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2008-11-10 16:53:41 +0000
committerTed Ross <tross@apache.org>2008-11-10 16:53:41 +0000
commitc238bdf224cb3ba37c5fb2de06da7f41e98545a2 (patch)
treee409e15180c6c8c7e5641d74e810427a9491b266 /cpp
parent23dac5548075ceae8e85799db4b43359682ae50c (diff)
downloadqpid-python-c238bdf224cb3ba37c5fb2de06da7f41e98545a2.tar.gz
QPID-1446 - Fixed memory leak in management agent affecting broker.
Added debug output to remote agent controllable via env variable. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@712696 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/qpid/agent/ManagementAgentImpl.cpp29
-rw-r--r--cpp/src/qpid/agent/ManagementAgentImpl.h1
-rw-r--r--cpp/src/qpid/management/ManagementBroker.cpp9
3 files changed, 33 insertions, 6 deletions
diff --git a/cpp/src/qpid/agent/ManagementAgentImpl.cpp b/cpp/src/qpid/agent/ManagementAgentImpl.cpp
index 257d6f6999..a21a4cd492 100644
--- a/cpp/src/qpid/agent/ManagementAgentImpl.cpp
+++ b/cpp/src/qpid/agent/ManagementAgentImpl.cpp
@@ -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 @@ ManagementAgentImpl::ManagementAgentImpl() :
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 @@ void ManagementAgentImpl::init(string brokerHost,
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 @@ void ManagementAgentImpl::periodicProcessing()
// 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 @@ void ManagementAgentImpl::ConnectionThread::run()
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 @@ void ManagementAgentImpl::ConnectionThread::run()
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 @@ void ManagementAgentImpl::ConnectionThread::run()
subscriptions->run();
} catch (std::exception) {}
+ if (agent.debugLevel)
+ cout << "QMF Agent connection has been lost" << endl;
+
operational = false;
}
delay = delayMin;
@@ -741,6 +760,8 @@ void ManagementAgentImpl::ConnectionThread::run()
} catch (std::exception &e) {
if (delay < delayMax)
delay *= delayFactor;
+ if (agent.debugLevel)
+ cout << " Connection failed: exception=" << e.what() << endl;
}
{
diff --git a/cpp/src/qpid/agent/ManagementAgentImpl.h b/cpp/src/qpid/agent/ManagementAgentImpl.h
index 28fbb72f6f..5b6437944f 100644
--- a/cpp/src/qpid/agent/ManagementAgentImpl.h
+++ b/cpp/src/qpid/agent/ManagementAgentImpl.h
@@ -141,6 +141,7 @@ class ManagementAgentImpl : public ManagementAgent, public client::MessageListen
uint32_t assignedBrokerBank;
uint32_t assignedAgentBank;
uint16_t bootSequence;
+ uint8_t debugLevel;
# define MA_BUFFER_SIZE 65536
char outputBuffer[MA_BUFFER_SIZE];
diff --git a/cpp/src/qpid/management/ManagementBroker.cpp b/cpp/src/qpid/management/ManagementBroker.cpp
index 1b89be18d9..a9c67ff1b9 100644
--- a/cpp/src/qpid/management/ManagementBroker.cpp
+++ b/cpp/src/qpid/management/ManagementBroker.cpp
@@ -409,8 +409,13 @@ void ManagementBroker::periodicProcessing (void)
// 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();