diff options
author | Alan Conway <aconway@apache.org> | 2008-01-07 16:28:07 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2008-01-07 16:28:07 +0000 |
commit | 4f8ef84a5ee39d3b3f622cbaf7f7d88c02c51c4c (patch) | |
tree | ce9e258984b46e09dbfce7b30aa003a73be49272 /cpp/src | |
parent | 0baaa143e71d6f28ac7c58ad76dfb3445e7bf2b7 (diff) | |
download | qpid-python-4f8ef84a5ee39d3b3f622cbaf7f7d88c02c51c4c.tar.gz |
Patch from https://issues.apache.org/jira/browse/QPID-722 by Ted Ross:
Two changes in this patch:
1) Management object IDs are now persistent for persistent (durable) objects. This is required to provide continuity of historical management data across broker restarts. The format of object IDs now indicates whether they are transient or persistent. The upper bit (bit 63) is 0 for transient IDs and 1 for persistent IDs.
2) Changes have been made to the management code generator in preparation for allowing it to be used by outside projects that wish to use the broker Plugin API for management access.
File-by-file notes:
M python/mgmt-cli/managementdata.py
Enhanced user-friendly display of 64-bit object IDs to
differentiate between persistent IDs and non-persistent IDs.
M cpp/src/Makefile.am
Changed command line format for call to the management code
generator.
M cpp/src/qpid/broker/Broker.cpp
M cpp/src/qpid/broker/Vhost.cpp
M cpp/src/qpid/broker/Queue.cpp
Updated calls to ManagementAgent::addObject to use the new support
for persistent IDs, ensuring that the management object IDs for
persistent objects are themselves persistent.
M cpp/src/qpid/management/ManagementAgent.h
M cpp/src/qpid/management/ManagementAgent.cpp
Added support (using defaulted arguments) to
ManagementAgent::addObject for persistent object IDs
M cpp/managementgen/generate.py
M cpp/managementgen/schema.py
M cpp/managementgen/main.py
Added the ability for templates to set variables to be used during
code generation.
Makefile fragment is now generated using a template rather than
hard-code. This was done to help non-qpid code to use the code
generator for management-via-qpid support.
M cpp/managementgen/templates/Args.h
M cpp/managementgen/templates/Class.cpp
M cpp/managementgen/templates/Class.h
Use a generator variable to define the comment prefix.
A cpp/managementgen/templates/Makefile.mk
New template for the qpid makefile fragment.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@609672 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Makefile.am | 8 | ||||
-rw-r--r-- | cpp/src/qpid/broker/Broker.cpp | 2 | ||||
-rw-r--r-- | cpp/src/qpid/broker/Queue.cpp | 13 | ||||
-rw-r--r-- | cpp/src/qpid/broker/Vhost.cpp | 2 | ||||
-rw-r--r-- | cpp/src/qpid/management/ManagementAgent.cpp | 11 | ||||
-rw-r--r-- | cpp/src/qpid/management/ManagementAgent.h | 4 |
6 files changed, 29 insertions, 11 deletions
diff --git a/cpp/src/Makefile.am b/cpp/src/Makefile.am index 2efad2d116..d663bbf9f0 100644 --- a/cpp/src/Makefile.am +++ b/cpp/src/Makefile.am @@ -22,10 +22,10 @@ rgen_cmd=ruby -I $(rgen_dir) $(rgen_dir)/generate $(srcdir)/gen $(specs) all $(s # Management generator. mgen_dir=$(top_srcdir)/managementgen -mgen_cmd=$(mgen_dir)/main.py -o $(srcdir)/gen/qpid/management \ - -t $(top_srcdir)/../specs/management-types.xml \ - -s $(top_srcdir)/../specs/management-schema.xml \ - -i $(mgen_dir)/templates -m $(srcdir)/managementgen.mk +mgen_cmd=$(mgen_dir)/main.py -m $(srcdir)/managementgen.mk \ + $(top_srcdir)/../specs/management-schema.xml \ + $(top_srcdir)/../specs/management-types.xml \ + $(mgen_dir)/templates $(srcdir)/gen/qpid/management endif # GENERATE diff --git a/cpp/src/qpid/broker/Broker.cpp b/cpp/src/qpid/broker/Broker.cpp index 5607d22498..c4a83b05e7 100644 --- a/cpp/src/qpid/broker/Broker.cpp +++ b/cpp/src/qpid/broker/Broker.cpp @@ -146,7 +146,7 @@ Broker::Broker(const Broker::Options& conf) : mgmtObject->set_clusterName (""); mgmtObject->set_version (PACKAGE_VERSION); - managementAgent->addObject (mgmtObject); + managementAgent->addObject (mgmtObject, 1, 0); // Since there is currently no support for virtual hosts, a placeholder object // representing the implied single virtual host is added here to keep the diff --git a/cpp/src/qpid/broker/Queue.cpp b/cpp/src/qpid/broker/Queue.cpp index f753e7ef75..c7dd656a4e 100644 --- a/cpp/src/qpid/broker/Queue.cpp +++ b/cpp/src/qpid/broker/Queue.cpp @@ -65,7 +65,11 @@ Queue::Queue(const string& _name, bool _autodelete, { mgmtObject = management::Queue::shared_ptr (new management::Queue (this, parent, _name, _store != 0, _autodelete, 0)); - agent->addObject (mgmtObject); + + // Add the object to the management agent only if this queue is not durable. + // If it's durable, we will add it later when the queue is assigned a persistenceId. + if (store == 0) + agent->addObject (mgmtObject); } } } @@ -519,7 +523,12 @@ uint64_t Queue::getPersistenceId() const void Queue::setPersistenceId(uint64_t _persistenceId) const { - persistenceId = _persistenceId; + if (mgmtObject != 0 && persistenceId == 0) + { + ManagementAgent::shared_ptr agent = ManagementAgent::getAgent (); + agent->addObject (mgmtObject, _persistenceId); + } + persistenceId = _persistenceId; } void Queue::encode(framing::Buffer& buffer) const diff --git a/cpp/src/qpid/broker/Vhost.cpp b/cpp/src/qpid/broker/Vhost.cpp index 537d2abf0e..06a8c8eca3 100644 --- a/cpp/src/qpid/broker/Vhost.cpp +++ b/cpp/src/qpid/broker/Vhost.cpp @@ -33,7 +33,7 @@ Vhost::Vhost (management::Manageable* parentBroker) { mgmtObject = management::Vhost::shared_ptr (new management::Vhost (this, parentBroker, "/")); - agent->addObject (mgmtObject); + agent->addObject (mgmtObject, 2, 0); } } } diff --git a/cpp/src/qpid/management/ManagementAgent.cpp b/cpp/src/qpid/management/ManagementAgent.cpp index d3c5d7c266..39fab270af 100644 --- a/cpp/src/qpid/management/ManagementAgent.cpp +++ b/cpp/src/qpid/management/ManagementAgent.cpp @@ -73,10 +73,17 @@ void ManagementAgent::setExchange (broker::Exchange::shared_ptr _mexchange, dExchange = _dexchange; } -void ManagementAgent::addObject (ManagementObject::shared_ptr object) +void ManagementAgent::addObject (ManagementObject::shared_ptr object, + uint64_t persistenceId, + uint64_t idOffset) { RWlock::ScopedWlock writeLock (userLock); - uint64_t objectId = nextObjectId++; + uint64_t objectId; + + if (persistenceId == 0) + objectId = nextObjectId++; + else + objectId = 0x8000000000000000ULL | (persistenceId + idOffset); object->setObjectId (objectId); managementObjects[objectId] = object; diff --git a/cpp/src/qpid/management/ManagementAgent.h b/cpp/src/qpid/management/ManagementAgent.h index 36ba1f0542..30b8857c27 100644 --- a/cpp/src/qpid/management/ManagementAgent.h +++ b/cpp/src/qpid/management/ManagementAgent.h @@ -51,7 +51,9 @@ class ManagementAgent void setInterval (uint16_t _interval) { interval = _interval; } void setExchange (broker::Exchange::shared_ptr mgmtExchange, broker::Exchange::shared_ptr directExchange); - void addObject (ManagementObject::shared_ptr object); + void addObject (ManagementObject::shared_ptr object, + uint64_t persistenceId = 0, + uint64_t idOffset = 10); void clientAdded (void); void dispatchCommand (broker::Deliverable& msg, const std::string& routingKey, |