summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/slice/IceGrid/Observer.ice17
-rw-r--r--cpp/src/IceGrid/Database.cpp8
-rw-r--r--cpp/src/IceGrid/Database.h5
-rw-r--r--cpp/src/IceGrid/ObserverSessionI.cpp14
-rw-r--r--cpp/src/IceGrid/ObserverSessionI.h2
-rw-r--r--cpp/src/IceGrid/RegistryI.cpp14
-rw-r--r--cpp/test/IceGrid/session/AllTests.cpp11
7 files changed, 63 insertions, 8 deletions
diff --git a/cpp/slice/IceGrid/Observer.ice b/cpp/slice/IceGrid/Observer.ice
index dbd08e65612..1661bd307fa 100644
--- a/cpp/slice/IceGrid/Observer.ice
+++ b/cpp/slice/IceGrid/Observer.ice
@@ -260,6 +260,9 @@ interface RegistryObserver
void applicationUpdated(int serial, ApplicationUpdateDescriptor desc);
};
+interface Query;
+interface Admin;
+
interface Session extends Glacier2::Session
{
/**
@@ -279,6 +282,20 @@ interface Session extends Glacier2::Session
/**
*
+ * Get the query interface.
+ *
+ **/
+ nonmutating Query* getQuery();
+
+ /**
+ *
+ * Get the admin interface.
+ *
+ **/
+ nonmutating Admin* getAdmin();
+
+ /**
+ *
* Set the proxies of the observer objects that will receive
* notifications from the servers when the state of the registry
* or nodes changes.
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp
index 1d696680561..6af3f3dc253 100644
--- a/cpp/src/IceGrid/Database.cpp
+++ b/cpp/src/IceGrid/Database.cpp
@@ -115,11 +115,13 @@ struct ObjectLoadCI : binary_function<pair<Ice::ObjectPrx, float>&, pair<Ice::Ob
Database::Database(const Ice::ObjectAdapterPtr& adapter,
const string& envName,
+ const string& instanceName,
int nodeSessionTimeout,
const TraceLevelsPtr& traceLevels) :
_communicator(adapter->getCommunicator()),
_internalAdapter(adapter),
_envName(envName),
+ _instanceName(instanceName),
_traceLevels(traceLevels),
_nodeCache(nodeSessionTimeout),
_objectCache(_communicator),
@@ -164,6 +166,12 @@ Database::~Database()
{
}
+std::string
+Database::getInstanceName() const
+{
+ return _instanceName;
+}
+
void
Database::setObservers(const RegistryObserverPrx& registryObserver, const NodeObserverPrx& nodeObserver)
{
diff --git a/cpp/src/IceGrid/Database.h b/cpp/src/IceGrid/Database.h
index cc9e8cd0ae2..e5c74fffed0 100644
--- a/cpp/src/IceGrid/Database.h
+++ b/cpp/src/IceGrid/Database.h
@@ -45,9 +45,11 @@ class Database : public IceUtil::Shared, public IceUtil::Mutex
{
public:
- Database(const Ice::ObjectAdapterPtr&, const std::string&, int, const TraceLevelsPtr&);
+ Database(const Ice::ObjectAdapterPtr&, const std::string&, const std::string&, int, const TraceLevelsPtr&);
virtual ~Database();
+ std::string getInstanceName() const;
+
void setObservers(const RegistryObserverPrx&, const NodeObserverPrx&);
int lock(ObserverSessionI*, const std::string&);
@@ -118,6 +120,7 @@ private:
const Ice::CommunicatorPtr _communicator;
const Ice::ObjectAdapterPtr _internalAdapter;
const std::string _envName;
+ const std::string _instanceName;
const TraceLevelsPtr _traceLevels;
NodeCache _nodeCache;
diff --git a/cpp/src/IceGrid/ObserverSessionI.cpp b/cpp/src/IceGrid/ObserverSessionI.cpp
index 14594c85206..c265fd1d6d1 100644
--- a/cpp/src/IceGrid/ObserverSessionI.cpp
+++ b/cpp/src/IceGrid/ObserverSessionI.cpp
@@ -45,6 +45,20 @@ ObserverSessionI::getTimeout(const Ice::Current&) const
return _timeout;
}
+QueryPrx
+ObserverSessionI::getQuery(const Ice::Current& current) const
+{
+ return QueryPrx::uncheckedCast(
+ current.adapter->getCommunicator()->stringToProxy(_database->getInstanceName() + "/Query"));
+}
+
+AdminPrx
+ObserverSessionI::getAdmin(const Ice::Current& current) const
+{
+ return AdminPrx::uncheckedCast(
+ current.adapter->getCommunicator()->stringToProxy(_database->getInstanceName() + "/Admin"));
+}
+
void
ObserverSessionI::setObservers(const RegistryObserverPrx& registryObserver,
const NodeObserverPrx& nodeObserver,
diff --git a/cpp/src/IceGrid/ObserverSessionI.h b/cpp/src/IceGrid/ObserverSessionI.h
index 3feacbb9864..d40811ac9e2 100644
--- a/cpp/src/IceGrid/ObserverSessionI.h
+++ b/cpp/src/IceGrid/ObserverSessionI.h
@@ -33,6 +33,8 @@ public:
virtual ~ObserverSessionI();
virtual int getTimeout(const Ice::Current&) const;
+ virtual QueryPrx getQuery(const Ice::Current&) const;
+ virtual AdminPrx getAdmin(const Ice::Current&) const;
virtual void setObservers(const RegistryObserverPrx&, const NodeObserverPrx&, const Ice::Current&);
virtual void setObserversByIdentity(const Ice::Identity&, const Ice::Identity&, const Ice::Current&);
diff --git a/cpp/src/IceGrid/RegistryI.cpp b/cpp/src/IceGrid/RegistryI.cpp
index d37efab7549..637bc619ca9 100644
--- a/cpp/src/IceGrid/RegistryI.cpp
+++ b/cpp/src/IceGrid/RegistryI.cpp
@@ -242,19 +242,19 @@ RegistryI::start(bool nowarn)
}
//
- // Create the internal registries (node, server, adapter, object).
- //
- const string envName = "Registry";
- properties->setProperty("Freeze.DbEnv.Registry.DbHome", dbPath);
- _database = new Database(registryAdapter, envName, _nodeSessionTimeout, traceLevels);
-
- //
// Get the instance name
//
const string instanceNameProperty = "IceGrid.InstanceName";
string instanceName = properties->getPropertyWithDefault(instanceNameProperty, "IceGrid");
//
+ // Create the internal registries (node, server, adapter, object).
+ //
+ const string envName = "Registry";
+ properties->setProperty("Freeze.DbEnv.Registry.DbHome", dbPath);
+ _database = new Database(registryAdapter, envName, instanceName, _nodeSessionTimeout, traceLevels);
+
+ //
// Create the locator registry and locator interfaces.
//
bool dynamicReg = properties->getPropertyAsInt("IceGrid.Registry.DynamicRegistration") > 0;
diff --git a/cpp/test/IceGrid/session/AllTests.cpp b/cpp/test/IceGrid/session/AllTests.cpp
index fd5eb590a4d..ae5a2c212f0 100644
--- a/cpp/test/IceGrid/session/AllTests.cpp
+++ b/cpp/test/IceGrid/session/AllTests.cpp
@@ -10,6 +10,7 @@
#include <IceUtil/Thread.h>
#include <Ice/Ice.h>
#include <IceGrid/Observer.h>
+#include <IceGrid/Query.h>
#include <IceGrid/Admin.h>
#include <TestCommon.h>
@@ -333,6 +334,16 @@ allTests(const Ice::CommunicatorPtr& communicator)
try
{
+ session1->getQuery()->ice_ping();
+ session1->getAdmin()->ice_ping();
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ try
+ {
int s = session1->startUpdate();
test(s != serial + 1);
}