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