You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2010/10/27 20:46:22 UTC

svn commit: r1028066 - in /qpid/trunk/qpid/cpp/src/qmf: AgentImpl.h ConsoleSession.cpp ConsoleSessionImpl.h

Author: tross
Date: Wed Oct 27 18:46:21 2010
New Revision: 1028066

URL: http://svn.apache.org/viewvc?rev=1028066&view=rev
Log:
1) Fix a bug where AGENT_RESTART is repeatedly reported when detected once.
2) ConsoleSession::getAgents now lists only agents in the agent-filter.
   If the connected broker agent does not match the filter, it is removed from the list
   though it is still accessible using ConsoleSession::getConnectedBrokerAgent.

Modified:
    qpid/trunk/qpid/cpp/src/qmf/AgentImpl.h
    qpid/trunk/qpid/cpp/src/qmf/ConsoleSession.cpp
    qpid/trunk/qpid/cpp/src/qmf/ConsoleSessionImpl.h

Modified: qpid/trunk/qpid/cpp/src/qmf/AgentImpl.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qmf/AgentImpl.h?rev=1028066&r1=1028065&r2=1028066&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qmf/AgentImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qmf/AgentImpl.h Wed Oct 27 18:46:21 2010
@@ -57,6 +57,7 @@ namespace qmf {
         //
         const std::string& getName() const { return name; }
         uint32_t getEpoch() const { return epoch; }
+        void setEpoch(uint32_t e) { epoch = e; }
         std::string getVendor() const { return getAttribute("_vendor").asString(); }
         std::string getProduct() const { return getAttribute("_product").asString(); }
         std::string getInstance() const { return getAttribute("_instance").asString(); }

Modified: qpid/trunk/qpid/cpp/src/qmf/ConsoleSession.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qmf/ConsoleSession.cpp?rev=1028066&r1=1028065&r2=1028066&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qmf/ConsoleSession.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qmf/ConsoleSession.cpp Wed Oct 27 18:46:21 2010
@@ -59,7 +59,7 @@ Agent ConsoleSession::getConnectedBroker
 ConsoleSessionImpl::ConsoleSessionImpl(Connection& c, const string& options) :
     connection(c), domain("default"), maxAgentAgeMinutes(5), opened(false),
     thread(0), threadCanceled(false),
-    lastVisit(0), lastAgePass(0), schemaCache(new SchemaCache())
+    lastVisit(0), lastAgePass(0), connectedBrokerInAgentList(false), schemaCache(new SchemaCache())
 {
     if (!options.empty()) {
         qpid::messaging::AddressParser parser(options);
@@ -97,9 +97,10 @@ void ConsoleSessionImpl::setAgentFilter(
         qpid::sys::Mutex::ScopedLock l(lock);
         map<string, Agent> toDelete;
         for (map<string, Agent>::iterator iter = agents.begin(); iter != agents.end(); iter++)
-            if ((iter->second.getName() != connectedBrokerAgent.getName()) &&
-                (!agentQuery.matchesPredicate(iter->second.getAttributes()))) {
+            if (!agentQuery.matchesPredicate(iter->second.getAttributes())) {
                 toDelete[iter->first] = iter->second;
+                if (iter->second.getName() == connectedBrokerAgent.getName())
+                    connectedBrokerInAgentList = false;
             }
 
         for (map<string, Agent>::iterator iter = toDelete.begin(); iter != toDelete.end(); iter++) {
@@ -108,6 +109,11 @@ void ConsoleSessionImpl::setAgentFilter(
             eventImpl->setAgent(iter->second);
             enqueueEventLH(eventImpl.release());
         }
+
+        if (!connectedBrokerInAgentList && agentQuery.matchesPredicate(connectedBrokerAgent.getAttributes())) {
+            agents[connectedBrokerAgent.getName()] = connectedBrokerAgent;
+            connectedBrokerInAgentList = true;
+        }
     }
 
     //
@@ -376,19 +382,30 @@ void ConsoleSessionImpl::handleAgentUpda
         return;
     Variant::Map attrs(iter->second.asMap());
 
+    iter = attrs.find("epoch");
+    if (iter != attrs.end())
+        epoch = iter->second.asUint32();
+
+    if (cid == "broker-locate") {
+        qpid::sys::Mutex::ScopedLock l(lock);
+        agent = Agent(new AgentImpl(agentName, epoch, *this));
+        connectedBrokerAgent = agent;
+        if (!agentQuery || agentQuery.matchesPredicate(attrs)) {
+            connectedBrokerInAgentList = true;
+            agents[agentName] = agent;
+        }
+        return;
+    }
+
     //
     // Check this agent against the agent filter.  Exit if it doesn't match.
     // (only if this isn't the connected broker agent)
     //
-    if ((cid != "broker-locate") && agentQuery && (!agentQuery.matchesPredicate(attrs)))
+    if (agentQuery && (!agentQuery.matchesPredicate(attrs)))
         return;
 
     QPID_LOG(trace, "RCVD AgentHeartbeat from an agent matching our filter: " << agentName);
 
-    iter = attrs.find("epoch");
-    if (iter != attrs.end())
-        epoch = iter->second.asUint32();
-
     {
         qpid::sys::Mutex::ScopedLock l(lock);
         map<string, Agent>::iterator aIter = agents.find(agentName);
@@ -421,6 +438,7 @@ void ConsoleSessionImpl::handleAgentUpda
                 // The agent has restarted since the last time we heard from it.
                 // Enqueue a notification.
                 //
+                impl.setEpoch(epoch);
                 auto_ptr<ConsoleEventImpl> eventImpl(new ConsoleEventImpl(CONSOLE_AGENT_RESTART));
                 eventImpl->setAgent(agent);
                 enqueueEventLH(ConsoleEvent(eventImpl.release()));
@@ -440,9 +458,6 @@ void ConsoleSessionImpl::handleAgentUpda
                 }
             }
         }
-
-        if (cid == "broker-locate")
-            connectedBrokerAgent = agent;
     }
 }
 

Modified: qpid/trunk/qpid/cpp/src/qmf/ConsoleSessionImpl.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qmf/ConsoleSessionImpl.h?rev=1028066&r1=1028065&r2=1028066&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qmf/ConsoleSessionImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qmf/ConsoleSessionImpl.h Wed Oct 27 18:46:21 2010
@@ -80,6 +80,7 @@ namespace qmf {
         uint64_t lastAgePass;
         std::map<std::string, Agent> agents;
         Agent connectedBrokerAgent;
+        bool connectedBrokerInAgentList;
         qpid::messaging::Address replyAddress;
         std::string directBase;
         std::string topicBase;



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org