summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp/slice/IceGrid/Admin.ice39
-rw-r--r--cpp/slice/IceGrid/Observer.ice6
-rw-r--r--cpp/src/IceGrid/Database.cpp151
-rw-r--r--cpp/src/IceGrid/Database.h16
-rw-r--r--cpp/src/IceGrid/Makefile12
-rw-r--r--cpp/src/IceGrid/NodeCache.cpp2
-rw-r--r--cpp/src/IceGrid/NodeCache.h2
-rw-r--r--cpp/src/IceGrid/ReplicaSessionManager.cpp10
-rw-r--r--cpp/src/IceGrid/ServerCache.cpp26
-rw-r--r--cpp/src/IceGrid/ServerCache.h5
-rw-r--r--cpp/src/IceGrid/SessionManager.h5
-rw-r--r--cpp/src/IceGrid/Topics.cpp29
-rw-r--r--cpp/src/IceGrid/Topics.h8
-rw-r--r--cpp/test/IceGrid/session/AllTests.cpp36
-rwxr-xr-xjava/src/IceGridGUI/RegistryObserverI.java17
15 files changed, 225 insertions, 139 deletions
diff --git a/cpp/slice/IceGrid/Admin.ice b/cpp/slice/IceGrid/Admin.ice
index e63ec19c8ae..29caa883154 100644
--- a/cpp/slice/IceGrid/Admin.ice
+++ b/cpp/slice/IceGrid/Admin.ice
@@ -248,6 +248,45 @@ struct LoadInfo
float avg15;
};
+struct ApplicationInfo
+{
+ /** The creation time. */
+ long createTime;
+
+ /** The user who created the application. */
+ string createUser;
+
+ /** The update time. */
+ long updateTime;
+
+ /** The user who updated the application. */
+ string updateUser;
+
+ /** The application revision number. */
+ int revision;
+
+ /** The application descriptor */
+ ApplicationDescriptor descriptor;
+
+};
+["java:type:{java.util.LinkedList}"] sequence<ApplicationInfo> ApplicationInfoSeq;
+
+struct ApplicationUpdateInfo
+{
+ /** The update time. */
+ long updateTime;
+
+ /** The user who updated the application. */
+ string updateUser;
+
+ /** The application revision number. */
+ int revision;
+
+ /** The update descriptor. */
+ ApplicationUpdateDescriptor descriptor;
+};
+
+
/**
*
* The &IceGrid; administrative interface. <warning><para>Allowing
diff --git a/cpp/slice/IceGrid/Observer.ice b/cpp/slice/IceGrid/Observer.ice
index ed6f9ce9cec..07d1307a344 100644
--- a/cpp/slice/IceGrid/Observer.ice
+++ b/cpp/slice/IceGrid/Observer.ice
@@ -227,7 +227,7 @@ interface RegistryObserver
* interface (not through the deployment mechanism).
*
**/
- ["ami"] void init(int serial, ApplicationDescriptorSeq applications, AdapterInfoSeq adpts, ObjectInfoSeq objects);
+ ["ami"] void init(int serial, ApplicationInfoSeq applications, AdapterInfoSeq adpts, ObjectInfoSeq objects);
/**
*
@@ -239,7 +239,7 @@ interface RegistryObserver
* @param desc The descriptor of the new application.
*
**/
- void applicationAdded(int serial, ApplicationDescriptor desc);
+ void applicationAdded(int serial, ApplicationInfo desc);
/**
*
@@ -263,7 +263,7 @@ interface RegistryObserver
* @param desc The descriptor of the update.
*
**/
- void applicationUpdated(int serial, ApplicationUpdateDescriptor desc);
+ void applicationUpdated(int serial, ApplicationUpdateInfo desc);
/**
*
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp
index aa683e5344b..3154b07f74b 100644
--- a/cpp/src/IceGrid/Database.cpp
+++ b/cpp/src/IceGrid/Database.cpp
@@ -26,7 +26,7 @@
using namespace std;
using namespace IceGrid;
-const string Database::_descriptorDbName = "applications";
+const string Database::_applicationDbName = "applications";
const string Database::_adapterDbName = "adapters";
const string Database::_objectDbName = "objects";
@@ -135,18 +135,18 @@ Database::Database(const Ice::ObjectAdapterPtr& registryAdapter,
_clientProxy(_communicator->stringToProxy("dummy")),
_serverProxy(_communicator->stringToProxy("dummy")),
_connection(Freeze::createConnection(registryAdapter->getCommunicator(), _envName)),
- _descriptors(_connection, _descriptorDbName),
+ _applications(_connection, _applicationDbName),
_objects(_connection, _objectDbName),
_adapters(_connection, _adapterDbName),
_lock(0),
_serial(-1)
{
ServerEntrySeq entries;
- for(StringApplicationDescriptorDict::const_iterator p = _descriptors.begin(); p != _descriptors.end(); ++p)
+ for(StringApplicationInfoDict::const_iterator p = _applications.begin(); p != _applications.end(); ++p)
{
try
{
- load(ApplicationHelper(_communicator, p->second), entries);
+ load(ApplicationHelper(_communicator, p->second.descriptor), entries, p->second.revision);
}
catch(const DeploymentException& ex)
{
@@ -269,8 +269,8 @@ Database::initMaster()
_registryObserverTopic = new RegistryObserverTopic(_internalAdapter, _topicManager);
_serial = 0;
- ApplicationDescriptorSeq applications;
- for(StringApplicationDescriptorDict::const_iterator p = _descriptors.begin(); p != _descriptors.end(); ++p)
+ ApplicationInfoSeq applications;
+ for(StringApplicationInfoDict::const_iterator p = _applications.begin(); p != _applications.end(); ++p)
{
applications.push_back(p->second);
}
@@ -289,7 +289,7 @@ Database::initMaster()
void
Database::initReplica(int masterSerial,
- const ApplicationDescriptorSeq& applications,
+ const ApplicationInfoSeq& applications,
const AdapterInfoSeq& adapters,
const ObjectInfoSeq& objects)
{
@@ -299,35 +299,37 @@ Database::initReplica(int masterSerial,
ServerEntrySeq entries;
set<string> names;
- for(ApplicationDescriptorSeq::const_iterator p = applications.begin(); p != applications.end(); ++p)
+ for(ApplicationInfoSeq::const_iterator p = applications.begin(); p != applications.end(); ++p)
{
try
{
- StringApplicationDescriptorDict::const_iterator s = _descriptors.find(p->name);
- if(s != _descriptors.end())
+ StringApplicationInfoDict::const_iterator s = _applications.find(p->descriptor.name);
+ if(s != _applications.end())
{
- reload(ApplicationHelper(_communicator, s->second), ApplicationHelper(_communicator, *p), entries);
+ ApplicationHelper previous(_communicator, s->second.descriptor);
+ ApplicationHelper helper(_communicator, p->descriptor);
+ reload(previous, helper, entries, p->revision);
}
else
{
- load(ApplicationHelper(_communicator, *p), entries);
+ load(ApplicationHelper(_communicator, p->descriptor), entries, p->revision);
}
}
catch(const DeploymentException& ex)
{
Ice::Warning warn(_traceLevels->logger);
- warn << "invalid application `" << p->name << "':\n" << ex.reason;
+ warn << "invalid application `" << p->descriptor.name << "':\n" << ex.reason;
}
- _descriptors.put(StringApplicationDescriptorDict::value_type(p->name, *p));
- names.insert(p->name);
+ _applications.put(StringApplicationInfoDict::value_type(p->descriptor.name, *p));
+ names.insert(p->descriptor.name);
}
- StringApplicationDescriptorDict::iterator s = _descriptors.begin();
- while(s != _descriptors.end())
+ StringApplicationInfoDict::iterator s = _applications.begin();
+ while(s != _applications.end())
{
if(names.find(s->first) == names.end())
{
- unload(ApplicationHelper(_communicator, s->second), entries);
- _descriptors.erase(s++);
+ unload(ApplicationHelper(_communicator, s->second.descriptor), entries);
+ _applications.erase(s++);
}
else
{
@@ -402,14 +404,14 @@ Database::addApplicationDescriptor(AdminSessionI* session, const ApplicationDesc
wait();
}
- if(_descriptors.find(desc.name) != _descriptors.end())
+ if(_applications.find(desc.name) != _applications.end())
{
throw DeploymentException("application `" + desc.name + "' already exists");
}
ApplicationHelper helper(_communicator, desc);
checkForAddition(helper);
- load(helper, entries);
+ load(helper, entries, 1);
_updating.insert(desc.name);
}
@@ -445,9 +447,17 @@ Database::addApplicationDescriptor(AdminSessionI* session, const ApplicationDesc
// Save the application descriptor.
//
int serial;
+ ApplicationInfo info;
{
Lock sync(*this);
- _descriptors.put(StringApplicationDescriptorDict::value_type(desc.name, desc));
+
+ info.createTime = info.updateTime = IceUtil::Time::now().toMilliSeconds();
+ info.createUser = info.updateUser = _lockUserId;
+ info.descriptor = desc;
+ info.revision = 1;
+
+ _applications.put(StringApplicationInfoDict::value_type(desc.name, info));
+
serial = ++_serial;
_updating.erase(desc.name);
notifyAll();
@@ -458,7 +468,7 @@ Database::addApplicationDescriptor(AdminSessionI* session, const ApplicationDesc
//
if(_registryObserverTopic)
{
- _registryObserverTopic->getPublisher()->applicationAdded(serial, desc);
+ _registryObserverTopic->getPublisher()->applicationAdded(serial, info);
}
if(_traceLevels->application > 0)
@@ -469,11 +479,12 @@ Database::addApplicationDescriptor(AdminSessionI* session, const ApplicationDesc
}
void
-Database::updateApplicationDescriptor(AdminSessionI* session, const ApplicationUpdateDescriptor& update,
+Database::updateApplicationDescriptor(AdminSessionI* session,
+ const ApplicationUpdateDescriptor& update,
int masterSerial)
{
ServerEntrySeq entries;
- ApplicationDescriptor oldDesc;
+ ApplicationInfo oldApp;
ApplicationDescriptor newDesc;
{
Lock sync(*this);
@@ -484,25 +495,25 @@ Database::updateApplicationDescriptor(AdminSessionI* session, const ApplicationU
wait();
}
- StringApplicationDescriptorDict::const_iterator p = _descriptors.find(update.name);
- if(p == _descriptors.end())
+ StringApplicationInfoDict::const_iterator p = _applications.find(update.name);
+ if(p == _applications.end())
{
throw ApplicationNotExistException(update.name);
}
+ oldApp = p->second;
- ApplicationHelper previous(_communicator, p->second);
+ ApplicationHelper previous(_communicator, oldApp.descriptor);
ApplicationHelper helper(_communicator, previous.update(update));
checkForUpdate(previous, helper);
- reload(previous, helper, entries);
+ reload(previous, helper, entries, oldApp.revision + 1);
- oldDesc = previous.getDefinition();
newDesc = helper.getDefinition();
_updating.insert(update.name);
}
- finishUpdate(entries, update, oldDesc, newDesc);
+ finishUpdate(entries, update, oldApp, newDesc);
}
void
@@ -510,7 +521,7 @@ Database::syncApplicationDescriptor(AdminSessionI* session, const ApplicationDes
{
ServerEntrySeq entries;
ApplicationUpdateDescriptor update;
- ApplicationDescriptor oldDesc;
+ ApplicationInfo oldApp;
{
Lock sync(*this);
checkSessionLock(session);
@@ -520,25 +531,24 @@ Database::syncApplicationDescriptor(AdminSessionI* session, const ApplicationDes
wait();
}
- StringApplicationDescriptorDict::const_iterator p = _descriptors.find(newDesc.name);
- if(p == _descriptors.end())
+ StringApplicationInfoDict::const_iterator p = _applications.find(newDesc.name);
+ if(p == _applications.end())
{
throw ApplicationNotExistException(newDesc.name);
}
+ oldApp = p->second;
- ApplicationHelper previous(_communicator, p->second);
+ ApplicationHelper previous(_communicator, oldApp.descriptor);
ApplicationHelper helper(_communicator, newDesc);
update = helper.diff(previous);
checkForUpdate(previous, helper);
- reload(previous, helper, entries);
-
- oldDesc = previous.getDefinition();
+ reload(previous, helper, entries, oldApp.revision + 1);
_updating.insert(update.name);
}
- finishUpdate(entries, update, oldDesc, newDesc);
+ finishUpdate(entries, update, oldApp, newDesc);
}
void
@@ -549,7 +559,7 @@ Database::instantiateServer(AdminSessionI* session,
{
ServerEntrySeq entries;
ApplicationUpdateDescriptor update;
- ApplicationDescriptor oldDesc;
+ ApplicationInfo oldApp;
ApplicationDescriptor newDesc;
{
Lock sync(*this);
@@ -560,26 +570,26 @@ Database::instantiateServer(AdminSessionI* session,
wait();
}
- StringApplicationDescriptorDict::const_iterator p = _descriptors.find(application);
- if(p == _descriptors.end())
+ StringApplicationInfoDict::const_iterator p = _applications.find(application);
+ if(p == _applications.end())
{
throw ApplicationNotExistException(application);
}
+ oldApp = p->second;
- ApplicationHelper previous(_communicator, p->second);
+ ApplicationHelper previous(_communicator, oldApp.descriptor);
ApplicationHelper helper(_communicator, previous.instantiateServer(node, instance));
update = helper.diff(previous);
checkForUpdate(previous, helper);
- reload(previous, helper, entries);
+ reload(previous, helper, entries, oldApp.revision + 1);
- oldDesc = previous.getDefinition();
newDesc = helper.getDefinition();
_updating.insert(update.name);
}
- finishUpdate(entries, update, oldDesc, newDesc);
+ finishUpdate(entries, update, oldApp, newDesc);
}
void
@@ -596,15 +606,15 @@ Database::removeApplicationDescriptor(AdminSessionI* session, const std::string&
wait();
}
- StringApplicationDescriptorDict::iterator p = _descriptors.find(name);
- if(p == _descriptors.end())
+ StringApplicationInfoDict::iterator p = _applications.find(name);
+ if(p == _applications.end())
{
throw ApplicationNotExistException(name);
}
try
{
- ApplicationHelper helper(_communicator, p->second);
+ ApplicationHelper helper(_communicator, p->second.descriptor);
unload(helper, entries);
}
catch(const DeploymentException&)
@@ -616,7 +626,7 @@ Database::removeApplicationDescriptor(AdminSessionI* session, const std::string&
//
}
- _descriptors.erase(p);
+ _applications.erase(p);
serial = ++_serial;
}
@@ -642,23 +652,23 @@ ApplicationDescriptor
Database::getApplicationDescriptor(const std::string& name)
{
Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName);
- StringApplicationDescriptorDict descriptors(connection, _descriptorDbName);
+ StringApplicationInfoDict descriptors(connection, _applicationDbName);
- StringApplicationDescriptorDict::const_iterator p = descriptors.find(name);
+ StringApplicationInfoDict::const_iterator p = descriptors.find(name);
if(p == descriptors.end())
{
throw ApplicationNotExistException(name);
}
- return p->second;
+ return p->second.descriptor;
}
Ice::StringSeq
Database::getAllApplications(const string& expression)
{
Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName);
- StringApplicationDescriptorDict descriptors(connection, _descriptorDbName);
- return getMatchingKeys<StringApplicationDescriptorDict>(descriptors, expression);
+ StringApplicationInfoDict descriptors(connection, _applicationDbName);
+ return getMatchingKeys<StringApplicationInfoDict>(descriptors, expression);
}
void
@@ -883,7 +893,7 @@ Database::removeAdapter(const string& adapterId)
throw ex;
}
- Freeze::TransactionHolder txHolder(_connection);
+ Freeze::TransactionHolder txHolder(_connection); // Required because of the iterator
StringAdapterInfoDict::iterator p = _adapters.find(adapterId);
if(p != _adapters.end())
@@ -1466,7 +1476,7 @@ Database::checkObjectForAddition(const Ice::Identity& objectId)
}
void
-Database::load(const ApplicationHelper& app, ServerEntrySeq& entries)
+Database::load(const ApplicationHelper& app, ServerEntrySeq& entries, int rev)
{
const NodeDescriptorDict& nodes = app.getInstance().nodes;
const string application = app.getInstance().name;
@@ -1492,7 +1502,7 @@ Database::load(const ApplicationHelper& app, ServerEntrySeq& entries)
map<string, ServerInfo> servers = app.getServerInfos();
for(map<string, ServerInfo>::const_iterator p = servers.begin(); p != servers.end(); ++p)
{
- entries.push_back(_serverCache.add(p->second));
+ entries.push_back(_serverCache.add(p->second, rev));
}
}
@@ -1524,7 +1534,7 @@ Database::unload(const ApplicationHelper& app, ServerEntrySeq& entries)
}
void
-Database::reload(const ApplicationHelper& oldApp, const ApplicationHelper& newApp, ServerEntrySeq& entries)
+Database::reload(const ApplicationHelper& oldApp, const ApplicationHelper& newApp, ServerEntrySeq& entries, int rev)
{
const string application = oldApp.getInstance().name;
@@ -1632,14 +1642,14 @@ Database::reload(const ApplicationHelper& oldApp, const ApplicationHelper& newAp
//
for(vector<ServerInfo>::const_iterator q = load.begin(); q != load.end(); ++q)
{
- entries.push_back(_serverCache.add(*q));
+ entries.push_back(_serverCache.add(*q, rev));
}
}
void
Database::finishUpdate(ServerEntrySeq& entries,
const ApplicationUpdateDescriptor& update,
- const ApplicationDescriptor& oldDesc,
+ const ApplicationInfo& oldApp,
const ApplicationDescriptor& newDesc)
{
@@ -1657,8 +1667,8 @@ Database::finishUpdate(ServerEntrySeq& entries,
Lock sync(*this);
entries.clear();
ApplicationHelper previous(_communicator, newDesc);
- ApplicationHelper helper(_communicator, oldDesc);
- reload(previous, helper, entries);
+ ApplicationHelper helper(_communicator, oldApp.descriptor);
+ reload(previous, helper, entries, oldApp.revision);
_updating.erase(newDesc.name);
notifyAll();
}
@@ -1677,20 +1687,29 @@ Database::finishUpdate(ServerEntrySeq& entries,
// Save the application descriptor.
//
int serial;
+ ApplicationUpdateInfo updateInfo;
{
Lock sync(*this);
- _descriptors.put(StringApplicationDescriptorDict::value_type(update.name, newDesc));
+
+ ApplicationInfo info = oldApp;
+ info.updateTime = updateInfo.updateTime = IceUtil::Time::now().toMilliSeconds();
+ info.updateUser = updateInfo.updateUser = _lockUserId;
+ info.revision = updateInfo.revision = oldApp.revision + 1;
+ info.descriptor = newDesc;
+ updateInfo.descriptor = update;
+
+ _applications.put(StringApplicationInfoDict::value_type(update.name, info));
serial = ++_serial;
_updating.erase(update.name);
notifyAll();
- }
+ }
//
// Notify the observers.
//
if(_registryObserverTopic)
{
- _registryObserverTopic->getPublisher()->applicationUpdated(serial, update);
+ _registryObserverTopic->getPublisher()->applicationUpdated(serial, updateInfo);
}
if(_traceLevels->application > 0)
diff --git a/cpp/src/IceGrid/Database.h b/cpp/src/IceGrid/Database.h
index 7a2c1b3c775..054d54ce99f 100644
--- a/cpp/src/IceGrid/Database.h
+++ b/cpp/src/IceGrid/Database.h
@@ -16,7 +16,7 @@
#include <Ice/CommunicatorF.h>
#include <IceGrid/Admin.h>
#include <IceGrid/Internal.h>
-#include <IceGrid/StringApplicationDescriptorDict.h>
+#include <IceGrid/StringApplicationInfoDict.h>
#include <IceGrid/IdentityObjectInfoDict.h>
#include <IceGrid/StringAdapterInfoDict.h>
#include <IceGrid/ServerCache.h>
@@ -76,7 +76,7 @@ public:
void init(int serial);
void initMaster();
- void initReplica(int, const ApplicationDescriptorSeq&, const AdapterInfoSeq&, const ObjectInfoSeq&);
+ void initReplica(int, const ApplicationInfoSeq&, const AdapterInfoSeq&, const ObjectInfoSeq&);
void setClientProxy(const Ice::ObjectPrx&);
void setServerProxy(const Ice::ObjectPrx&);
@@ -141,17 +141,17 @@ private:
void checkAdapterForAddition(const std::string&);
void checkObjectForAddition(const Ice::Identity&);
- void load(const ApplicationHelper&, ServerEntrySeq&);
+ void load(const ApplicationHelper&, ServerEntrySeq&, int);
void unload(const ApplicationHelper&, ServerEntrySeq&);
- void reload(const ApplicationHelper&, const ApplicationHelper&, ServerEntrySeq&);
- void finishUpdate(ServerEntrySeq&, const ApplicationUpdateDescriptor&, const ApplicationDescriptor&,
+ void reload(const ApplicationHelper&, const ApplicationHelper&, ServerEntrySeq&, int);
+ void finishUpdate(ServerEntrySeq&, const ApplicationUpdateDescriptor&, const ApplicationInfo&,
const ApplicationDescriptor&);
void checkSessionLock(AdminSessionI*);
friend struct AddComponent;
- static const std::string _descriptorDbName;
+ static const std::string _applicationDbName;
static const std::string _objectDbName;
static const std::string _adapterDbName;
static const std::string _replicaGroupDbName;
@@ -177,10 +177,8 @@ private:
Ice::ObjectPrx _clientProxy;
Ice::ObjectPrx _serverProxy;
- std::map<std::string, std::string> _applicationsByServerName;
-
Freeze::ConnectionPtr _connection;
- StringApplicationDescriptorDict _descriptors;
+ StringApplicationInfoDict _applications;
IdentityObjectInfoDict _objects;
StringAdapterInfoDict _adapters;
diff --git a/cpp/src/IceGrid/Makefile b/cpp/src/IceGrid/Makefile
index c9685258785..669ede90dc7 100644
--- a/cpp/src/IceGrid/Makefile
+++ b/cpp/src/IceGrid/Makefile
@@ -55,7 +55,7 @@ NODE_OBJS = NodeI.o \
REGISTRY_OBJS = RegistryI.o \
InternalRegistryI.o \
- StringApplicationDescriptorDict.o \
+ StringApplicationInfoDict.o \
IdentityObjectInfoDict.o \
StringAdapterInfoDict.o \
Database.o \
@@ -156,13 +156,13 @@ $(LOCAL_HDIR)/%.h %.cpp: $(SDIR)/%.ice $(SLICE2CPP)
rm -f $(HDIR)/$(*F).h $(*F).cpp
$(SLICE2CPP) $(SLICE2CPPFLAGS) $(SDIR)/$(*F).ice
-$(LOCAL_HDIR)/StringApplicationDescriptorDict.h StringApplicationDescriptorDict.cpp: $(SLICE2FREEZE)
- rm -f StringApplicationDescriptorDict.h StringApplicationDescriptorDict.cpp
- $(SLICE2FREEZECMD) --dict IceGrid::StringApplicationDescriptorDict,string,IceGrid::ApplicationDescriptor \
- StringApplicationDescriptorDict ../../slice/IceGrid/Admin.ice
+$(LOCAL_HDIR)/StringApplicationInfoDict.h StringApplicationInfoDict.cpp: $(SLICE2FREEZE)
+ rm -f StringApplicationInfoDict.h StringApplicationInfoDict.cpp
+ $(SLICE2FREEZECMD) --dict IceGrid::StringApplicationInfoDict,string,IceGrid::ApplicationInfo \
+ StringApplicationInfoDict $(LOCAL_SDIR)/Internal.ice
clean::
- rm -f StringApplicationDescriptorDict.h StringApplicationDescriptorDict.cpp
+ rm -f StringApplicationInfoDict.h StringApplicationInfoDict.cpp
$(LOCAL_HDIR)/IdentityObjectInfoDict.h IdentityObjectInfoDict.cpp: $(SLICE2FREEZE)
rm -f IdentityObjectInfoDict.h IdentityObjectInfoDict.cpp
diff --git a/cpp/src/IceGrid/NodeCache.cpp b/cpp/src/IceGrid/NodeCache.cpp
index f7ba2115a3f..9b8ede8039c 100644
--- a/cpp/src/IceGrid/NodeCache.cpp
+++ b/cpp/src/IceGrid/NodeCache.cpp
@@ -399,7 +399,7 @@ NodeEntry::canRemove()
}
void
-NodeEntry::loadServer(const ServerEntryPtr& entry, const ServerInfo& server, const SessionIPtr& session)
+NodeEntry::loadServer(const ServerEntryPtr& entry, const ServerInfo& server, const SessionIPtr& session, int revision)
{
try
{
diff --git a/cpp/src/IceGrid/NodeCache.h b/cpp/src/IceGrid/NodeCache.h
index e6ab55a8827..86989d237c9 100644
--- a/cpp/src/IceGrid/NodeCache.h
+++ b/cpp/src/IceGrid/NodeCache.h
@@ -51,7 +51,7 @@ public:
bool canRemove();
- void loadServer(const ServerEntryPtr&, const ServerInfo&, const SessionIPtr&);
+ void loadServer(const ServerEntryPtr&, const ServerInfo&, const SessionIPtr&, int);
void destroyServer(const ServerEntryPtr&, const std::string&);
ServerInfo getServerInfo(const ServerInfo&, const SessionIPtr&);
diff --git a/cpp/src/IceGrid/ReplicaSessionManager.cpp b/cpp/src/IceGrid/ReplicaSessionManager.cpp
index 4311ac3c531..9b02f2f35df 100644
--- a/cpp/src/IceGrid/ReplicaSessionManager.cpp
+++ b/cpp/src/IceGrid/ReplicaSessionManager.cpp
@@ -28,7 +28,7 @@ public:
virtual void
init(int serial,
- const ApplicationDescriptorSeq& applications,
+ const ApplicationInfoSeq& applications,
const AdapterInfoSeq& adapters,
const ObjectInfoSeq& objects,
const Ice::Current&)
@@ -37,9 +37,9 @@ public:
}
virtual void
- applicationAdded(int serial, const ApplicationDescriptor& application, const Ice::Current&)
+ applicationAdded(int serial, const ApplicationInfo& application, const Ice::Current&)
{
- _database->addApplicationDescriptor(0, application, serial);
+ _database->addApplicationDescriptor(0, application.descriptor, serial);
}
virtual void
@@ -49,9 +49,9 @@ public:
}
virtual void
- applicationUpdated(int serial, const ApplicationUpdateDescriptor& update, const Ice::Current&)
+ applicationUpdated(int serial, const ApplicationUpdateInfo& update, const Ice::Current&)
{
- _database->updateApplicationDescriptor(0, update, serial);
+ _database->updateApplicationDescriptor(0, update.descriptor, serial);
}
virtual void
diff --git a/cpp/src/IceGrid/ServerCache.cpp b/cpp/src/IceGrid/ServerCache.cpp
index bc09d395656..fc92a16e8c5 100644
--- a/cpp/src/IceGrid/ServerCache.cpp
+++ b/cpp/src/IceGrid/ServerCache.cpp
@@ -75,7 +75,7 @@ ServerCache::ServerCache(const Ice::CommunicatorPtr& communicator,
}
ServerEntryPtr
-ServerCache::add(const ServerInfo& info)
+ServerCache::add(const ServerInfo& info, int rev)
{
Lock sync(*this);
@@ -85,7 +85,7 @@ ServerCache::add(const ServerInfo& info)
entry = new ServerEntry(*this, info.descriptor->id);
addImpl(info.descriptor->id, entry);
}
- entry->update(info);
+ entry->update(info, rev);
_nodeCache.get(info.node, true)->addServer(entry);
forEachCommunicator(AddCommunicator(*this, entry))(info.descriptor);
@@ -222,7 +222,7 @@ ServerEntry::sync()
}
void
-ServerEntry::update(const ServerInfo& info)
+ServerEntry::update(const ServerInfo& info, int revision)
{
Lock sync(*this);
@@ -252,6 +252,7 @@ ServerEntry::update(const ServerInfo& info)
// Update the allocatable flag.
//
const_cast<bool&>(_allocatable) = info.descriptor->allocatable || info.descriptor->activation == "session";
+ _revision = revision;
}
void
@@ -505,6 +506,7 @@ void
ServerEntry::syncImpl(bool waitForUpdate)
{
ServerInfo load;
+ int revision;
SessionIPtr session;
ServerInfo destroy;
@@ -543,6 +545,7 @@ ServerEntry::syncImpl(bool waitForUpdate)
{
load = *_load;
session = _session;
+ revision = _revision;
}
else
{
@@ -567,7 +570,7 @@ ServerEntry::syncImpl(bool waitForUpdate)
{
try
{
- _cache.getNodeCache().get(load.node)->loadServer(this, load, session);
+ _cache.getNodeCache().get(load.node)->loadServer(this, load, session, revision);
}
catch(NodeNotExistException&)
{
@@ -611,7 +614,9 @@ ServerEntry::loadCallback(const ServerPrx& proxy, const AdapterPrxDict& adpts, i
{
ServerInfo load;
SessionIPtr session;
+ int revision;
ServerInfo destroy;
+
{
Lock sync(*this);
if(!_updated)
@@ -652,6 +657,7 @@ ServerEntry::loadCallback(const ServerPrx& proxy, const AdapterPrxDict& adpts, i
{
load = *_load;
session = _session;
+ revision = _revision;
}
}
}
@@ -672,7 +678,7 @@ ServerEntry::loadCallback(const ServerPrx& proxy, const AdapterPrxDict& adpts, i
{
try
{
- _cache.getNodeCache().get(load.node)->loadServer(this, load, session);
+ _cache.getNodeCache().get(load.node)->loadServer(this, load, session, revision);
}
catch(NodeNotExistException&)
{
@@ -686,6 +692,8 @@ ServerEntry::destroyCallback()
{
ServerInfo load;
SessionIPtr session;
+ int revision;
+
{
Lock sync(*this);
_destroy.reset(0);
@@ -701,6 +709,7 @@ ServerEntry::destroyCallback()
_updated = false;
load = *_load;
session = _session;
+ revision = _revision;
}
}
@@ -708,7 +717,7 @@ ServerEntry::destroyCallback()
{
try
{
- _cache.getNodeCache().get(load.node)->loadServer(this, load, session);
+ _cache.getNodeCache().get(load.node)->loadServer(this, load, session, revision);
}
catch(NodeNotExistException&)
{
@@ -726,7 +735,9 @@ ServerEntry::exception(const Ice::Exception& ex)
{
ServerInfo load;
SessionIPtr session;
+ int revision;
bool remove = false;
+
{
Lock sync(*this);
if((_destroy.get() && !_load.get()) || (!_destroy.get() && !_updated))
@@ -743,6 +754,7 @@ ServerEntry::exception(const Ice::Exception& ex)
_updated = false;
load = *_load.get();
session = _session;
+ revision = _revision;
}
}
@@ -750,7 +762,7 @@ ServerEntry::exception(const Ice::Exception& ex)
{
try
{
- _cache.getNodeCache().get(load.node)->loadServer(this, load, session);
+ _cache.getNodeCache().get(load.node)->loadServer(this, load, session, revision);
}
catch(NodeNotExistException&)
{
diff --git a/cpp/src/IceGrid/ServerCache.h b/cpp/src/IceGrid/ServerCache.h
index 288579a5020..2348326614a 100644
--- a/cpp/src/IceGrid/ServerCache.h
+++ b/cpp/src/IceGrid/ServerCache.h
@@ -37,7 +37,7 @@ public:
ServerEntry(ServerCache&, const std::string&);
void sync();
- void update(const ServerInfo&);
+ void update(const ServerInfo&, int);
void destroy();
ServerInfo getServerInfo(bool = false) const;
@@ -80,6 +80,7 @@ private:
std::auto_ptr<Ice::Exception> _exception;
SessionIPtr _session;
+ int _revision;
};
typedef IceUtil::Handle<ServerEntry> ServerEntryPtr;
typedef std::vector<ServerEntryPtr> ServerEntrySeq;
@@ -90,7 +91,7 @@ public:
ServerCache(const Ice::CommunicatorPtr&, NodeCache&, AdapterCache&, ObjectCache&, AllocatableObjectCache&, int);
- ServerEntryPtr add(const ServerInfo&);
+ ServerEntryPtr add(const ServerInfo&, int);
ServerEntryPtr get(const std::string&) const;
bool has(const std::string&) const;
ServerEntryPtr remove(const std::string&, bool = true);
diff --git a/cpp/src/IceGrid/SessionManager.h b/cpp/src/IceGrid/SessionManager.h
index 576e4aabe38..d29df322354 100644
--- a/cpp/src/IceGrid/SessionManager.h
+++ b/cpp/src/IceGrid/SessionManager.h
@@ -72,7 +72,10 @@ public:
if(updateState)
{
Lock sync(*this);
- _state = session ? Connected : Disconnected;
+ if(_state != Destroyed)
+ {
+ _state = session ? Connected : Disconnected;
+ }
_session = session;
notifyAll();
}
diff --git a/cpp/src/IceGrid/Topics.cpp b/cpp/src/IceGrid/Topics.cpp
index 8ebedee368c..df673f08813 100644
--- a/cpp/src/IceGrid/Topics.cpp
+++ b/cpp/src/IceGrid/Topics.cpp
@@ -295,7 +295,7 @@ RegistryObserverTopic::RegistryObserverTopic(const Ice::ObjectAdapterPtr& adapte
void
RegistryObserverTopic::init(int serial,
- const ApplicationDescriptorSeq& apps,
+ const ApplicationInfoSeq& apps,
const AdapterInfoSeq& adpts,
const ObjectInfoSeq& objects,
const Ice::Current&)
@@ -304,9 +304,9 @@ RegistryObserverTopic::init(int serial,
_serial = serial;
- for(ApplicationDescriptorSeq::const_iterator p = apps.begin(); p != apps.end(); ++p)
+ for(ApplicationInfoSeq::const_iterator p = apps.begin(); p != apps.end(); ++p)
{
- _applications.insert(make_pair(p->name, *p));
+ _applications.insert(make_pair(p->descriptor.name, *p));
}
for(AdapterInfoSeq::const_iterator q = adpts.begin(); q != adpts.end(); ++q)
{
@@ -321,15 +321,15 @@ RegistryObserverTopic::init(int serial,
}
void
-RegistryObserverTopic::applicationAdded(int serial, const ApplicationDescriptor& desc, const Ice::Current&)
+RegistryObserverTopic::applicationAdded(int serial, const ApplicationInfo& info, const Ice::Current&)
{
Lock sync(*this);
updateSerial(serial);
- _applications.insert(make_pair(desc.name, desc));
+ _applications.insert(make_pair(info.descriptor.name, info));
- _internalPublisher->applicationAdded(serial, desc);
+ _internalPublisher->applicationAdded(serial, info);
}
void
@@ -345,18 +345,21 @@ RegistryObserverTopic::applicationRemoved(int serial, const string& name, const
}
void
-RegistryObserverTopic::applicationUpdated(int serial, const ApplicationUpdateDescriptor& desc, const Ice::Current& c)
+RegistryObserverTopic::applicationUpdated(int serial, const ApplicationUpdateInfo& info, const Ice::Current& c)
{
Lock sync(*this);
updateSerial(serial);
try
{
- map<string, ApplicationDescriptor>::iterator p = _applications.find(desc.name);
+ map<string, ApplicationInfo>::iterator p = _applications.find(info.descriptor.name);
if(p != _applications.end())
{
- ApplicationHelper helper(c.adapter->getCommunicator(), p->second);
- p->second = helper.update(desc);
+ ApplicationHelper helper(c.adapter->getCommunicator(), p->second.descriptor);
+ p->second.descriptor = helper.update(info.descriptor);
+ p->second.updateTime = info.updateTime;
+ p->second.updateUser = info.updateUser;
+ p->second.revision = info.revision;
}
}
catch(const DeploymentException& ex)
@@ -379,7 +382,7 @@ RegistryObserverTopic::applicationUpdated(int serial, const ApplicationUpdateDes
assert(false);
}
- _internalPublisher->applicationUpdated(serial, desc);
+ _internalPublisher->applicationUpdated(serial, info);
}
void
@@ -461,7 +464,7 @@ RegistryObserverTopic::subscribe(const RegistryObserverPrx& observer, int serial
{
if(serial == -1)
{
- ApplicationDescriptorSeq applications;
+ ApplicationInfoSeq applications;
AdapterInfoSeq adapters;
ObjectInfoSeq objects;
{
@@ -469,7 +472,7 @@ RegistryObserverTopic::subscribe(const RegistryObserverPrx& observer, int serial
assert(_serial != -1);
serial = _serial;
- map<string, ApplicationDescriptor>::const_iterator p;
+ map<string, ApplicationInfo>::const_iterator p;
for(p = _applications.begin(); p != _applications.end(); ++p)
{
applications.push_back(p->second);
diff --git a/cpp/src/IceGrid/Topics.h b/cpp/src/IceGrid/Topics.h
index 2101fa41c4a..90924b4fea7 100644
--- a/cpp/src/IceGrid/Topics.h
+++ b/cpp/src/IceGrid/Topics.h
@@ -53,12 +53,12 @@ class RegistryObserverTopic : public RegistryObserver, public IceUtil::Monitor<I
public:
RegistryObserverTopic(const Ice::ObjectAdapterPtr&, const IceStorm::TopicManagerPrx&);
- virtual void init(int, const ApplicationDescriptorSeq&, const AdapterInfoSeq&, const ObjectInfoSeq&,
+ virtual void init(int, const ApplicationInfoSeq&, const AdapterInfoSeq&, const ObjectInfoSeq&,
const Ice::Current&);
- virtual void applicationAdded(int, const ApplicationDescriptor&, const Ice::Current&);
+ virtual void applicationAdded(int, const ApplicationInfo&, const Ice::Current&);
virtual void applicationRemoved(int, const std::string&, const Ice::Current&);
- virtual void applicationUpdated(int, const ApplicationUpdateDescriptor&, const Ice::Current&);
+ virtual void applicationUpdated(int, const ApplicationUpdateInfo&, const Ice::Current&);
virtual void adapterAdded(int, const AdapterInfo&, const Ice::Current&);
virtual void adapterUpdated(int, const AdapterInfo&, const Ice::Current&);
@@ -81,7 +81,7 @@ private:
const RegistryObserverPrx _publisher;
int _serial;
- std::map<std::string, ApplicationDescriptor> _applications;
+ std::map<std::string, ApplicationInfo> _applications;
std::map<std::string, AdapterInfo> _adapters;
std::map<Ice::Identity, ObjectInfo> _objects;
};
diff --git a/cpp/test/IceGrid/session/AllTests.cpp b/cpp/test/IceGrid/session/AllTests.cpp
index d467f205f69..2250e6951e0 100644
--- a/cpp/test/IceGrid/session/AllTests.cpp
+++ b/cpp/test/IceGrid/session/AllTests.cpp
@@ -148,15 +148,18 @@ public:
}
virtual void
- init(int serial, const ApplicationDescriptorSeq& apps, const AdapterInfoSeq& adapters,
- const ObjectInfoSeq& objects, const Ice::Current&)
+ init(int serial,
+ const ApplicationInfoSeq& apps,
+ const AdapterInfoSeq& adapters,
+ const ObjectInfoSeq& objects,
+ const Ice::Current&)
{
Lock sync(*this);
- for(ApplicationDescriptorSeq::const_iterator p = apps.begin(); p != apps.end(); ++p)
+ for(ApplicationInfoSeq::const_iterator p = apps.begin(); p != apps.end(); ++p)
{
- if(p->name != "Test") // Ignore the test application from application.xml!
+ if(p->descriptor.name != "Test") // Ignore the test application from application.xml!
{
- this->applications.insert(make_pair(p->name, *p));
+ this->applications.insert(make_pair(p->descriptor.name, *p));
}
}
for(AdapterInfoSeq::const_iterator q = adapters.begin(); q != adapters.end(); ++q)
@@ -171,11 +174,11 @@ public:
}
virtual void
- applicationAdded(int serial, const ApplicationDescriptor& app, const Ice::Current&)
+ applicationAdded(int serial, const ApplicationInfo& app, const Ice::Current&)
{
Lock sync(*this);
- this->applications.insert(make_pair(app.name, app));
- updated(serial, "application added `" + app.name + "'");
+ this->applications.insert(make_pair(app.descriptor.name, app));
+ updated(serial, "application added `" + app.descriptor.name + "'");
}
virtual void
@@ -187,16 +190,17 @@ public:
}
virtual void
- applicationUpdated(int serial, const ApplicationUpdateDescriptor& desc, const Ice::Current&)
+ applicationUpdated(int serial, const ApplicationUpdateInfo& info, const Ice::Current&)
{
Lock sync(*this);
+ const ApplicationUpdateDescriptor& desc = info.descriptor;
for(Ice::StringSeq::const_iterator q = desc.removeVariables.begin(); q != desc.removeVariables.end(); ++q)
{
- this->applications[desc.name].variables.erase(*q);
+ this->applications[desc.name].descriptor.variables.erase(*q);
}
for(map<string, string>::const_iterator p = desc.variables.begin(); p != desc.variables.end(); ++p)
{
- this->applications[desc.name].variables[p->first] = p->second;
+ this->applications[desc.name].descriptor.variables[p->first] = p->second;
}
updated(serial, "application updated `" + desc.name + "'");
}
@@ -271,7 +275,7 @@ public:
}
int serial;
- map<string, ApplicationDescriptor> applications;
+ map<string, ApplicationInfo> applications;
map<string, AdapterInfo> adapters;
map<Ice::Identity, ObjectInfo> objects;
@@ -1386,7 +1390,7 @@ allTests(const Ice::CommunicatorPtr& communicator)
admin1->updateApplication(update);
regObs1->waitForUpdate(__FILE__, __LINE__);
test(regObs1->applications.find("Application") != regObs1->applications.end());
- test(regObs1->applications["Application"].variables["test"] == "test");
+ test(regObs1->applications["Application"].descriptor.variables["test"] == "test");
test(++serial == regObs1->serial);
}
catch(const Ice::UserException& ex)
@@ -1398,14 +1402,14 @@ allTests(const Ice::CommunicatorPtr& communicator)
try
{
ApplicationDescriptor app;
- app = regObs1->applications["Application"];
+ app = regObs1->applications["Application"].descriptor;
app.variables.clear();
app.variables["test1"] = "test";
admin1->syncApplication(app);
regObs1->waitForUpdate(__FILE__, __LINE__);
test(regObs1->applications.find("Application") != regObs1->applications.end());
- test(regObs1->applications["Application"].variables.size() == 1);
- test(regObs1->applications["Application"].variables["test1"] == "test");
+ test(regObs1->applications["Application"].descriptor.variables.size() == 1);
+ test(regObs1->applications["Application"].descriptor.variables["test1"] == "test");
test(++serial == regObs1->serial);
}
catch(const Ice::UserException& ex)
diff --git a/java/src/IceGridGUI/RegistryObserverI.java b/java/src/IceGridGUI/RegistryObserverI.java
index e050bc81820..5918ae5dcfe 100755
--- a/java/src/IceGridGUI/RegistryObserverI.java
+++ b/java/src/IceGridGUI/RegistryObserverI.java
@@ -65,20 +65,27 @@ class RegistryObserverI extends _RegistryObserverDisp
{
_initialized = true;
_serial = serial;
- _applications = applications;
+
+ _applications = new java.util.LinkedList();
+ java.util.Iterator p = applications.iterator();
+ while(p.hasNext())
+ {
+ _applications.add(((ApplicationInfo)p.next()).descriptor); // TODO: Use ApplicationInfo directly.
+ }
+
_adapters = adapters;
_objects = objects;
notify();
}
- public void applicationAdded(final int serial, final ApplicationDescriptor desc,
+ public void applicationAdded(final int serial, final ApplicationInfo info,
Ice.Current current)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
- _coordinator.applicationAdded(serial, desc);
+ _coordinator.applicationAdded(serial, info.descriptor); // TODO: Use ApplicationInfo directly.
}
});
}
@@ -95,14 +102,14 @@ class RegistryObserverI extends _RegistryObserverDisp
});
}
- public void applicationUpdated(final int serial, final ApplicationUpdateDescriptor desc,
+ public void applicationUpdated(final int serial, final ApplicationUpdateInfo info,
Ice.Current current)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
- _coordinator.applicationUpdated(serial, desc);
+ _coordinator.applicationUpdated(serial, info.descriptor); // TODO: Use ApplicationUpdateInfo
}
});
}