summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/Database.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2005-04-29 15:06:42 +0000
committerBenoit Foucher <benoit@zeroc.com>2005-04-29 15:06:42 +0000
commit917b860b9c7f7387d8bf9f507f39fced6d8f7836 (patch)
tree5a0296de28d5a9dca2ef89098ddc8a5ac1bf78c5 /cpp/src/IceGrid/Database.cpp
parentAdded tests for templates. (diff)
downloadice-917b860b9c7f7387d8bf9f507f39fced6d8f7836.tar.bz2
ice-917b860b9c7f7387d8bf9f507f39fced6d8f7836.tar.xz
ice-917b860b9c7f7387d8bf9f507f39fced6d8f7836.zip
Fixed bugs, added method to instantiate a server with the admin interface.
Diffstat (limited to 'cpp/src/IceGrid/Database.cpp')
-rw-r--r--cpp/src/IceGrid/Database.cpp82
1 files changed, 59 insertions, 23 deletions
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp
index f60baa7b414..fd129078e62 100644
--- a/cpp/src/IceGrid/Database.cpp
+++ b/cpp/src/IceGrid/Database.cpp
@@ -1076,7 +1076,14 @@ void
Database::clearServer(const std::string& name)
{
Lock sync(*this);
- _servers.erase(name);
+ map<string, ServerEntryPtr>::iterator p = _servers.find(name);
+ if(p != _servers.end())
+ {
+ if(p->second->canRemove())
+ {
+ _servers.erase(p);
+ }
+ }
}
void
@@ -1244,48 +1251,77 @@ Database::ServerEntry::sync(map<string, AdapterPrx>& adapters)
{
if(destroy)
{
- _database.getNode(destroy->node)->destroyServer(destroy);
+ try
+ {
+ _database.getNode(destroy->node)->destroyServer(destroy);
+ }
+ catch(const NodeNotExistException& ex)
+ {
+ if(!load)
+ {
+ throw NodeUnreachableException();
+ }
+ }
+ catch(Ice::LocalException& ex)
+ {
+ if(!load)
+ {
+ throw NodeUnreachableException();
+ }
+ }
}
+
if(load)
{
- proxy = _database.getNode(load->node)->loadServer(load, adapters);
+ try
+ {
+ proxy = _database.getNode(load->node)->loadServer(load, adapters);
+ }
+ catch(const NodeNotExistException& ex)
+ {
+ throw NodeUnreachableException();
+ }
+ catch(Ice::LocalException& ex)
+ {
+ throw NodeUnreachableException();
+ }
}
}
- catch(const NodeNotExistException& ex)
+ catch(const NodeUnreachableException& ex)
{
- if(!load && destroy)
{
- _database.clearServer(destroy->name);
+ Lock sync(*this);
+ _synchronizing = false;
+ _destroy = 0;
+ notifyAll();
}
- Lock sync(*this);
- _synchronizing = false;
- notifyAll();
- throw NodeUnreachableException();
- }
- catch(Ice::LocalException& ex)
- {
if(!load && destroy)
{
_database.clearServer(destroy->name);
}
+ throw;
+ }
+
+ {
Lock sync(*this);
_synchronizing = false;
+ _loaded = _load;
+ _load = 0;
+ _destroy = 0;
+ _proxy = proxy;
+ _adapters = adapters;
notifyAll();
- throw NodeUnreachableException();
}
-
if(!load && destroy)
{
_database.clearServer(destroy->name);
}
- Lock sync(*this);
- _synchronizing = false;
- _loaded = _load;
- _load = 0;
- _destroy = 0;
- _proxy = proxy;
- _adapters = adapters;
- notifyAll();
return proxy;
}
+bool
+Database::ServerEntry::canRemove()
+{
+ Lock sync(*this);
+ return !_loaded && !_load && !_destroy;
+}