summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/management
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2009-01-23 21:55:15 +0000
committerGordon Sim <gsim@apache.org>2009-01-23 21:55:15 +0000
commitb849efb083c88de6c1932d0f7a87a7c500dbd3d6 (patch)
tree727bdbdb8c3701d90a0d31e2f3e42b26d10c9f9d /cpp/src/qpid/management
parent85428cec6a090c58c34453dee8b38ac20a619a96 (diff)
downloadqpid-python-b849efb083c88de6c1932d0f7a87a7c500dbd3d6.tar.gz
Use special management ids for objects used in state transfer to new members. This prevents the ids getting out of sync across the cluster and allows management methods to be used reliably.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@737203 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/management')
-rw-r--r--cpp/src/qpid/management/IdAllocator.h42
-rw-r--r--cpp/src/qpid/management/ManagementBroker.cpp14
-rw-r--r--cpp/src/qpid/management/ManagementBroker.h8
3 files changed, 63 insertions, 1 deletions
diff --git a/cpp/src/qpid/management/IdAllocator.h b/cpp/src/qpid/management/IdAllocator.h
new file mode 100644
index 0000000000..6fbc99afff
--- /dev/null
+++ b/cpp/src/qpid/management/IdAllocator.h
@@ -0,0 +1,42 @@
+#ifndef QPID_MANAGEMENT_IDALLOCATOR_H
+#define QPID_MANAGEMENT_IDALLOCATOR_H
+
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "Manageable.h"
+
+namespace qpid {
+namespace management {
+
+/**
+ * Interface through which plugins etc can control the mgmt object id
+ * allocation for special cases
+ */
+struct IdAllocator
+{
+ virtual uint64_t getIdFor(Manageable* object) = 0;
+ virtual ~IdAllocator() {}
+};
+
+}} // namespace qpid::management
+
+#endif /*!QPID_MANAGEMENT_IDALLOCATOR_H*/
diff --git a/cpp/src/qpid/management/ManagementBroker.cpp b/cpp/src/qpid/management/ManagementBroker.cpp
index 2175bc4676..0f96e97fb0 100644
--- a/cpp/src/qpid/management/ManagementBroker.cpp
+++ b/cpp/src/qpid/management/ManagementBroker.cpp
@@ -20,6 +20,7 @@
*/
#include "ManagementBroker.h"
+#include "IdAllocator.h"
#include "qpid/broker/DeliverableMessage.h"
#include "qpid/log/Statement.h"
#include <qpid/broker/Message.h>
@@ -1135,3 +1136,16 @@ size_t ManagementBroker::validateEventSchema(Buffer& inBuffer)
inBuffer.restore(); // restore original position
return end - start;
}
+
+void ManagementBroker::setAllocator(std::auto_ptr<IdAllocator> a)
+{
+ Mutex::ScopedLock lock (addLock);
+ allocator = a;
+}
+
+uint64_t ManagementBroker::allocateId(Manageable* object)
+{
+ Mutex::ScopedLock lock (addLock);
+ if (allocator.get()) return allocator->getIdFor(object);
+ return 0;
+}
diff --git a/cpp/src/qpid/management/ManagementBroker.h b/cpp/src/qpid/management/ManagementBroker.h
index 59dfb98596..f65d6a345e 100644
--- a/cpp/src/qpid/management/ManagementBroker.h
+++ b/cpp/src/qpid/management/ManagementBroker.h
@@ -32,10 +32,13 @@
#include "Manageable.h"
#include "qmf/org/apache/qpid/broker/Agent.h"
#include <qpid/framing/AMQFrame.h>
+#include <memory>
namespace qpid {
namespace management {
+struct IdAllocator;
+
class ManagementBroker : public ManagementAgent
{
private:
@@ -43,7 +46,6 @@ private:
int threadPoolSize;
public:
-
ManagementBroker ();
virtual ~ManagementBroker ();
@@ -78,6 +80,8 @@ public:
uint32_t pollCallbacks (uint32_t) { assert(0); return 0; }
int getSignalFd () { assert(0); return -1; }
+ void setAllocator(std::auto_ptr<IdAllocator> allocator);
+ uint64_t allocateId(Manageable* object);
private:
friend class ManagementAgent;
@@ -179,6 +183,8 @@ private:
uint32_t nextRequestSequence;
bool clientWasAdded;
+ std::auto_ptr<IdAllocator> allocator;
+
# define MA_BUFFER_SIZE 65536
char inputBuffer[MA_BUFFER_SIZE];
char outputBuffer[MA_BUFFER_SIZE];