summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/Database.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2012-10-08 15:03:46 +0200
committerBenoit Foucher <benoit@zeroc.com>2012-10-08 15:03:46 +0200
commitd36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae (patch)
tree7abffd29e98ff112cec85b658fab404961f8306a /cpp/src/IceGrid/Database.cpp
parentFreeBSD port (diff)
parentWin32 fixes (diff)
downloadice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.tar.bz2
ice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.tar.xz
ice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.zip
Merge branch 'mx' into encoding11
Conflicts: cpp/demo/Freeze/backup/.depend cpp/demo/Freeze/backup/.depend.mak cpp/demo/Freeze/bench/.depend cpp/demo/Freeze/bench/.depend.mak cpp/demo/Freeze/casino/.depend cpp/demo/Freeze/casino/.depend.mak cpp/demo/Freeze/customEvictor/.depend cpp/demo/Freeze/customEvictor/.depend.mak cpp/demo/Freeze/library/.depend cpp/demo/Freeze/library/.depend.mak cpp/demo/Freeze/phonebook/.depend cpp/demo/Freeze/phonebook/.depend.mak cpp/demo/Freeze/transform/.depend cpp/demo/Freeze/transform/.depend.mak cpp/demo/Glacier2/callback/.depend cpp/demo/Glacier2/callback/.depend.mak cpp/demo/Glacier2/chat/.depend cpp/demo/Glacier2/chat/.depend.mak cpp/demo/Ice/async/.depend cpp/demo/Ice/async/.depend.mak cpp/demo/Ice/bidir/.depend cpp/demo/Ice/bidir/.depend.mak cpp/demo/Ice/callback/.depend cpp/demo/Ice/callback/.depend.mak cpp/demo/Ice/converter/.depend cpp/demo/Ice/converter/.depend.mak cpp/demo/Ice/hello/.depend cpp/demo/Ice/hello/.depend.mak cpp/demo/Ice/interleaved/.depend cpp/demo/Ice/interleaved/.depend.mak cpp/demo/Ice/invoke/.depend cpp/demo/Ice/invoke/.depend.mak cpp/demo/Ice/latency/.depend cpp/demo/Ice/latency/.depend.mak cpp/demo/Ice/minimal/.depend cpp/demo/Ice/minimal/.depend.mak cpp/demo/Ice/multicast/.depend cpp/demo/Ice/multicast/.depend.mak cpp/demo/Ice/nested/.depend cpp/demo/Ice/nested/.depend.mak cpp/demo/Ice/nrvo/.depend cpp/demo/Ice/nrvo/.depend.mak cpp/demo/Ice/plugin/.depend cpp/demo/Ice/plugin/.depend.mak cpp/demo/Ice/session/.depend cpp/demo/Ice/session/.depend.mak cpp/demo/Ice/throughput/.depend cpp/demo/Ice/throughput/.depend.mak cpp/demo/Ice/value/.depend cpp/demo/Ice/value/.depend.mak cpp/demo/IceBox/hello/.depend cpp/demo/IceBox/hello/.depend.mak cpp/demo/IceGrid/allocate/.depend cpp/demo/IceGrid/allocate/.depend.mak cpp/demo/IceGrid/icebox/.depend cpp/demo/IceGrid/icebox/.depend.mak cpp/demo/IceGrid/replication/.depend cpp/demo/IceGrid/replication/.depend.mak cpp/demo/IceGrid/secure/.depend cpp/demo/IceGrid/secure/.depend.mak cpp/demo/IceGrid/sessionActivation/.depend cpp/demo/IceGrid/sessionActivation/.depend.mak cpp/demo/IceGrid/simple/.depend cpp/demo/IceGrid/simple/.depend.mak cpp/demo/IceStorm/clock/.depend cpp/demo/IceStorm/clock/.depend.mak cpp/demo/IceStorm/counter/.depend cpp/demo/IceStorm/counter/.depend.mak cpp/demo/IceStorm/replicated/.depend cpp/demo/IceStorm/replicated/.depend.mak cpp/demo/IceStorm/replicated2/.depend cpp/demo/IceStorm/replicated2/.depend.mak cpp/demo/book/evictor_filesystem/.depend cpp/demo/book/evictor_filesystem/.depend.mak cpp/demo/book/lifecycle/.depend cpp/demo/book/lifecycle/.depend.mak cpp/demo/book/map_filesystem/.depend cpp/demo/book/map_filesystem/.depend.mak cpp/demo/book/printer/.depend cpp/demo/book/printer/.depend.mak cpp/demo/book/simple_filesystem/.depend cpp/demo/book/simple_filesystem/.depend.mak cpp/include/Ice/Outgoing.h cpp/include/Ice/OutgoingAsync.h cpp/include/Ice/StreamTraits.h cpp/src/Freeze/.depend cpp/src/Freeze/.depend.mak cpp/src/FreezeScript/.depend cpp/src/FreezeScript/.depend.mak cpp/src/Glacier2/.depend cpp/src/Glacier2/.depend.mak cpp/src/Glacier2Lib/.depend cpp/src/Glacier2Lib/.depend.mak cpp/src/Ice/.depend cpp/src/Ice/.depend.mak cpp/src/IceBox/.depend cpp/src/IceBox/.depend.mak cpp/src/IceDB/.depend cpp/src/IceDB/.depend.mak cpp/src/IceGrid/.depend cpp/src/IceGrid/.depend.mak cpp/src/IceGrid/FreezeDB/.depend cpp/src/IceGrid/FreezeDB/.depend.mak cpp/src/IceGrid/ServerCache.h cpp/src/IceGrid/ServerI.h cpp/src/IceGridLib/.depend cpp/src/IceGridLib/.depend.mak cpp/src/IcePatch2/.depend cpp/src/IcePatch2/.depend.mak cpp/src/IcePatch2Lib/.depend cpp/src/IcePatch2Lib/.depend.mak cpp/src/IceSSL/.depend cpp/src/IceSSL/.depend.mak cpp/src/IceStorm/.depend cpp/src/IceStorm/.depend.mak cpp/src/IceStorm/FreezeDB/.depend cpp/src/IceStorm/FreezeDB/.depend.mak cpp/src/IceStormLib/.depend cpp/src/IceStormLib/.depend.mak cpp/src/slice2cpp/Gen.cpp cpp/test/Freeze/complex/.depend cpp/test/Freeze/complex/.depend.mak cpp/test/Freeze/dbmap/.depend cpp/test/Freeze/dbmap/.depend.mak cpp/test/Freeze/evictor/.depend cpp/test/Freeze/evictor/.depend.mak cpp/test/Freeze/fileLock/.depend cpp/test/Freeze/fileLock/.depend.mak cpp/test/FreezeScript/dbmap/.depend cpp/test/FreezeScript/dbmap/.depend.mak cpp/test/FreezeScript/evictor/.depend cpp/test/FreezeScript/evictor/.depend.mak cpp/test/Glacier2/attack/.depend cpp/test/Glacier2/attack/.depend.mak cpp/test/Glacier2/dynamicFiltering/.depend cpp/test/Glacier2/dynamicFiltering/.depend.mak cpp/test/Glacier2/override/.depend cpp/test/Glacier2/override/.depend.mak cpp/test/Glacier2/router/.depend cpp/test/Glacier2/router/.depend.mak cpp/test/Glacier2/sessionControl/.depend cpp/test/Glacier2/sessionControl/.depend.mak cpp/test/Glacier2/sessionHelper/.depend cpp/test/Glacier2/sessionHelper/.depend.mak cpp/test/Glacier2/ssl/.depend cpp/test/Glacier2/ssl/.depend.mak cpp/test/Glacier2/staticFiltering/.depend cpp/test/Glacier2/staticFiltering/.depend.mak cpp/test/Ice/adapterDeactivation/.depend cpp/test/Ice/adapterDeactivation/.depend.mak cpp/test/Ice/ami/.depend cpp/test/Ice/ami/.depend.mak cpp/test/Ice/background/.depend cpp/test/Ice/background/.depend.mak cpp/test/Ice/binding/.depend cpp/test/Ice/binding/.depend.mak cpp/test/Ice/checksum/.depend cpp/test/Ice/checksum/.depend.mak cpp/test/Ice/checksum/server/.depend cpp/test/Ice/checksum/server/.depend.mak cpp/test/Ice/custom/.depend cpp/test/Ice/custom/.depend.mak cpp/test/Ice/defaultServant/.depend cpp/test/Ice/defaultServant/.depend.mak cpp/test/Ice/defaultValue/.depend cpp/test/Ice/defaultValue/.depend.mak cpp/test/Ice/dispatcher/.depend cpp/test/Ice/dispatcher/.depend.mak cpp/test/Ice/exceptions/.depend cpp/test/Ice/exceptions/.depend.mak cpp/test/Ice/facets/.depend cpp/test/Ice/facets/.depend.mak cpp/test/Ice/faultTolerance/.depend cpp/test/Ice/faultTolerance/.depend.mak cpp/test/Ice/gc/.depend cpp/test/Ice/gc/.depend.mak cpp/test/Ice/hash/.depend cpp/test/Ice/hash/.depend.mak cpp/test/Ice/hold/.depend cpp/test/Ice/hold/.depend.mak cpp/test/Ice/info/.depend cpp/test/Ice/info/.depend.mak cpp/test/Ice/inheritance/.depend cpp/test/Ice/inheritance/.depend.mak cpp/test/Ice/interceptor/.depend cpp/test/Ice/interceptor/.depend.mak cpp/test/Ice/invoke/.depend cpp/test/Ice/invoke/.depend.mak cpp/test/Ice/location/.depend cpp/test/Ice/location/.depend.mak cpp/test/Ice/objects/.depend cpp/test/Ice/objects/.depend.mak cpp/test/Ice/operations/.depend cpp/test/Ice/operations/.depend.mak cpp/test/Ice/plugin/.depend cpp/test/Ice/plugin/.depend.mak cpp/test/Ice/properties/.depend cpp/test/Ice/properties/.depend.mak cpp/test/Ice/proxy/.depend cpp/test/Ice/proxy/.depend.mak cpp/test/Ice/retry/.depend cpp/test/Ice/retry/.depend.mak cpp/test/Ice/servantLocator/.depend cpp/test/Ice/servantLocator/.depend.mak cpp/test/Ice/slicing/exceptions/.depend cpp/test/Ice/slicing/exceptions/.depend.mak cpp/test/Ice/slicing/objects/.depend cpp/test/Ice/slicing/objects/.depend.mak cpp/test/Ice/stream/.depend cpp/test/Ice/stream/.depend.mak cpp/test/Ice/stringConverter/.depend cpp/test/Ice/stringConverter/.depend.mak cpp/test/Ice/threadPoolPriority/.depend cpp/test/Ice/threadPoolPriority/.depend.mak cpp/test/Ice/timeout/.depend cpp/test/Ice/timeout/.depend.mak cpp/test/Ice/udp/.depend cpp/test/Ice/udp/.depend.mak cpp/test/IceBox/configuration/.depend cpp/test/IceBox/configuration/.depend.mak cpp/test/IceGrid/activation/.depend cpp/test/IceGrid/activation/.depend.mak cpp/test/IceGrid/admin/.depend cpp/test/IceGrid/admin/.depend.mak cpp/test/IceGrid/allocation/.depend cpp/test/IceGrid/allocation/.depend.mak cpp/test/IceGrid/deployer/.depend cpp/test/IceGrid/deployer/.depend.mak cpp/test/IceGrid/distribution/.depend cpp/test/IceGrid/distribution/.depend.mak cpp/test/IceGrid/replicaGroup/.depend cpp/test/IceGrid/replicaGroup/.depend.mak cpp/test/IceGrid/replication/.depend cpp/test/IceGrid/replication/.depend.mak cpp/test/IceGrid/session/.depend cpp/test/IceGrid/session/.depend.mak cpp/test/IceGrid/simple/.depend cpp/test/IceGrid/simple/.depend.mak cpp/test/IceGrid/update/.depend cpp/test/IceGrid/update/.depend.mak cpp/test/IceSSL/configuration/.depend cpp/test/IceSSL/configuration/.depend.mak cpp/test/IceStorm/federation/.depend cpp/test/IceStorm/federation/.depend.mak cpp/test/IceStorm/federation2/.depend cpp/test/IceStorm/federation2/.depend.mak cpp/test/IceStorm/rep1/.depend cpp/test/IceStorm/rep1/.depend.mak cpp/test/IceStorm/repgrid/.depend cpp/test/IceStorm/repgrid/.depend.mak cpp/test/IceStorm/repstress/.depend cpp/test/IceStorm/repstress/.depend.mak cpp/test/IceStorm/single/.depend cpp/test/IceStorm/single/.depend.mak cpp/test/IceStorm/stress/.depend cpp/test/IceStorm/stress/.depend.mak cpp/test/Slice/keyword/.depend cpp/test/Slice/keyword/.depend.mak cpp/test/Slice/parser/.depend cpp/test/Slice/parser/.depend.mak cpp/test/Slice/structure/.depend cpp/test/Slice/structure/.depend.mak py/modules/IcePy/.depend py/modules/IcePy/.depend.mak
Diffstat (limited to 'cpp/src/IceGrid/Database.cpp')
-rw-r--r--cpp/src/IceGrid/Database.cpp311
1 files changed, 221 insertions, 90 deletions
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp
index 601a452eb82..3c9f6a004a4 100644
--- a/cpp/src/IceGrid/Database.cpp
+++ b/cpp/src/IceGrid/Database.cpp
@@ -43,30 +43,6 @@ struct ObjectLoadCI : binary_function<pair<Ice::ObjectPrx, float>&, pair<Ice::Ob
}
};
-bool
-isServerUpdated(const ServerInfo& lhs, const ServerInfo& rhs)
-{
- if(lhs.node != rhs.node)
- {
- return true;
- }
-
- IceBoxDescriptorPtr lhsIceBox = IceBoxDescriptorPtr::dynamicCast(lhs.descriptor);
- IceBoxDescriptorPtr rhsIceBox = IceBoxDescriptorPtr::dynamicCast(rhs.descriptor);
- if(lhsIceBox && rhsIceBox)
- {
- return IceBoxHelper(lhsIceBox) != IceBoxHelper(rhsIceBox);
- }
- else if(!lhsIceBox && !rhsIceBox)
- {
- return ServerHelper(lhs.descriptor) != ServerHelper(rhs.descriptor);
- }
- else
- {
- return true;
- }
-}
-
void
halt(const Ice::CommunicatorPtr& com, const DatabaseException& ex)
{
@@ -275,7 +251,7 @@ Database::syncApplications(const ApplicationInfoSeq& newApplications)
{
ApplicationHelper previous(_communicator, q->second.descriptor);
ApplicationHelper helper(_communicator, p->descriptor);
- reload(previous, helper, entries, p->uuid, p->revision);
+ reload(previous, helper, entries, p->uuid, p->revision, false);
}
else
{
@@ -466,12 +442,12 @@ Database::addApplication(const ApplicationInfo& info, AdminSessionI* session)
}
void
-Database::updateApplication(const ApplicationUpdateInfo& updt, AdminSessionI* session)
+Database::updateApplication(const ApplicationUpdateInfo& updt, bool noRestart, AdminSessionI* session)
{
- ServerEntrySeq entries;
ApplicationInfo oldApp;
- ApplicationDescriptor newDesc;
ApplicationUpdateInfo update = updt;
+ auto_ptr<ApplicationHelper> previous;
+ auto_ptr<ApplicationHelper> helper;
try
{
Lock sync(*this);
@@ -495,20 +471,8 @@ Database::updateApplication(const ApplicationUpdateInfo& updt, AdminSessionI* se
update.revision = oldApp.revision + 1;
}
- ApplicationHelper previous(_communicator, oldApp.descriptor);
- ApplicationHelper helper(_communicator, previous.update(update.descriptor), true);
- newDesc = helper.getDefinition();
-
- checkForUpdate(previous, helper, connection);
-
- ApplicationInfo info = oldApp;
- info.updateTime = update.updateTime;
- info.updateUser = update.updateUser;
- info.revision = update.revision;
- info.descriptor = newDesc;
- saveApplication(info, connection);
-
- reload(previous, helper, entries, oldApp.uuid, oldApp.revision + 1);
+ previous.reset(new ApplicationHelper(_communicator, oldApp.descriptor));
+ helper.reset(new ApplicationHelper(_communicator, previous->update(update.descriptor), true));
startUpdating(update.descriptor.name, oldApp.uuid, oldApp.revision + 1);
}
@@ -517,15 +481,16 @@ Database::updateApplication(const ApplicationUpdateInfo& updt, AdminSessionI* se
halt(_communicator, ex);
}
- finishApplicationUpdate(entries, update, oldApp, newDesc, session);
+ finishApplicationUpdate(update, oldApp, *previous, *helper, session, noRestart);
}
void
-Database::syncApplicationDescriptor(const ApplicationDescriptor& newDesc, AdminSessionI* session)
+Database::syncApplicationDescriptor(const ApplicationDescriptor& newDesc, bool noRestart, AdminSessionI* session)
{
- ServerEntrySeq entries;
ApplicationUpdateInfo update;
ApplicationInfo oldApp;
+ auto_ptr<ApplicationHelper> previous;
+ auto_ptr<ApplicationHelper> helper;
try
{
Lock sync(*this);
@@ -544,25 +509,14 @@ Database::syncApplicationDescriptor(const ApplicationDescriptor& newDesc, AdminS
throw ApplicationNotExistException(newDesc.name);
}
- ApplicationHelper previous(_communicator, oldApp.descriptor);
- ApplicationHelper helper(_communicator, newDesc, true);
+ previous.reset(new ApplicationHelper(_communicator, oldApp.descriptor));
+ helper.reset(new ApplicationHelper(_communicator, newDesc, true));
update.updateTime = IceUtil::Time::now().toMilliSeconds();
update.updateUser = _lockUserId;
update.revision = oldApp.revision + 1;
- update.descriptor = helper.diff(previous);
+ update.descriptor = helper->diff(*previous);
- checkForUpdate(previous, helper, connection);
-
- ApplicationInfo info = oldApp;
- info.updateTime = update.updateTime;
- info.updateUser = update.updateUser;
- info.revision = update.revision;
- info.descriptor = newDesc;
- saveApplication(info, connection);
-
- reload(previous, helper, entries, oldApp.uuid, oldApp.revision + 1);
-
startUpdating(update.descriptor.name, oldApp.uuid, oldApp.revision + 1);
}
catch(const DatabaseException& ex)
@@ -570,7 +524,7 @@ Database::syncApplicationDescriptor(const ApplicationDescriptor& newDesc, AdminS
halt(_communicator, ex);
}
- finishApplicationUpdate(entries, update, oldApp, newDesc, session);
+ finishApplicationUpdate(update, oldApp, *previous, *helper, session, noRestart);
}
void
@@ -579,10 +533,10 @@ Database::instantiateServer(const string& application,
const ServerInstanceDescriptor& instance,
AdminSessionI* session)
{
- ServerEntrySeq entries;
ApplicationUpdateInfo update;
ApplicationInfo oldApp;
- ApplicationDescriptor newDesc;
+ auto_ptr<ApplicationHelper> previous;
+ auto_ptr<ApplicationHelper> helper;
try
{
@@ -602,25 +556,13 @@ Database::instantiateServer(const string& application,
throw ApplicationNotExistException(application);
}
- ApplicationHelper previous(_communicator, oldApp.descriptor);
- ApplicationHelper helper(_communicator, previous.instantiateServer(node, instance), true);
- newDesc = helper.getDefinition();
+ previous.reset(new ApplicationHelper(_communicator, oldApp.descriptor));
+ helper.reset(new ApplicationHelper(_communicator, previous->instantiateServer(node, instance), true));
update.updateTime = IceUtil::Time::now().toMilliSeconds();
update.updateUser = _lockUserId;
update.revision = oldApp.revision + 1;
- update.descriptor = helper.diff(previous);
-
- checkForUpdate(previous, helper, connection);
-
- ApplicationInfo info = oldApp;
- info.updateTime = update.updateTime;
- info.updateUser = update.updateUser;
- info.revision = update.revision;
- info.descriptor = newDesc;
- saveApplication(info, connection);
-
- reload(previous, helper, entries, oldApp.uuid, oldApp.revision + 1);
+ update.descriptor = helper->diff(*previous);
startUpdating(update.descriptor.name, oldApp.uuid, oldApp.revision + 1);
}
@@ -629,7 +571,7 @@ Database::instantiateServer(const string& application,
halt(_communicator, ex);
}
- finishApplicationUpdate(entries, update, oldApp, newDesc, session);
+ finishApplicationUpdate(update, oldApp, *previous, *helper, session, true);
}
void
@@ -1034,7 +976,7 @@ Database::getAdapterInfo(const string& id)
// Otherwise, we check the adapter endpoint table -- if there's an
// entry the adapter is managed by the registry itself.
//
- DatabaseConnectionPtr connection = _connectionPool->getConnection();
+ DatabaseConnectionPtr connection = _connectionPool->newConnection();
AdaptersWrapperPtr adaptersWrapper = _connectionPool->getAdapters(connection);
AdapterInfoSeq infos;
try
@@ -1878,7 +1820,7 @@ Database::load(const ApplicationHelper& app, ServerEntrySeq& entries, const stri
map<string, ServerInfo> servers = app.getServerInfos(uuid, revision);
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, false));
}
}
@@ -1914,7 +1856,8 @@ Database::reload(const ApplicationHelper& oldApp,
const ApplicationHelper& newApp,
ServerEntrySeq& entries,
const string& uuid,
- int revision)
+ int revision,
+ bool noRestart)
{
const string application = oldApp.getInstance().name;
@@ -1939,7 +1882,7 @@ Database::reload(const ApplicationHelper& oldApp,
else
{
ServerEntryPtr server = _serverCache.get(p->first);
- server->update(q->second); // Just update the server revision on the node.
+ server->update(q->second, noRestart); // Just update the server revision on the node.
entries.push_back(server);
}
}
@@ -2026,7 +1969,7 @@ Database::reload(const ApplicationHelper& oldApp,
//
for(vector<ServerInfo>::const_iterator q = load.begin(); q != load.end(); ++q)
{
- entries.push_back(_serverCache.add(*q));
+ entries.push_back(_serverCache.add(*q, noRestart));
}
}
@@ -2079,17 +2022,205 @@ Database::removeApplication(const string& name, const DatabaseConnectionPtr& con
}
void
-Database::finishApplicationUpdate(ServerEntrySeq& entries,
- const ApplicationUpdateInfo& update,
- const ApplicationInfo& oldApp,
- const ApplicationDescriptor& newDesc,
- AdminSessionI* session)
+Database::checkUpdate(const ApplicationHelper& oldApp,
+ const ApplicationHelper& newApp,
+ const string& uuid,
+ int revision,
+ bool noRestart)
{
+ const string application = oldApp.getInstance().name;
+
+ map<string, ServerInfo> oldServers = oldApp.getServerInfos(uuid, revision);
+ map<string, ServerInfo> newServers = newApp.getServerInfos(uuid, revision + 1);
+
+ map<string, ServerInfo>::const_iterator p;
+ vector<string> servers;
+ vector<string> reasons;
+ if(noRestart)
+ {
+ for(p = oldServers.begin(); p != oldServers.end(); ++p)
+ {
+ map<string, ServerInfo>::const_iterator q = newServers.find(p->first);
+ if(q == newServers.end())
+ {
+ servers.push_back(p->first);
+ reasons.push_back("server `" + p->first + "' needs to be removed");
+ }
+ }
+ }
+
+ vector<CheckUpdateResultPtr> results;
+ set<string> unreachableNodes;
+ for(p = newServers.begin(); p != newServers.end(); ++p)
+ {
+ map<string, ServerInfo>::const_iterator q = oldServers.find(p->first);
+ if(q != oldServers.end() && isServerUpdated(p->second, q->second))
+ {
+ if(noRestart && isServerUpdated(p->second, q->second, true)) // Ignore properties
+ {
+ //
+ // The updates are not only property updates and noRestart is required, no
+ // need to check the server update on the node, we know already it requires
+ // a restart.
+ //
+ servers.push_back(p->first);
+ reasons.push_back("update requires the server `" + p->first + "' to be stopped");
+ }
+ else
+ {
+ //
+ // Ask the node to check the server update.
+ //
+ try
+ {
+ CheckUpdateResultPtr result = _serverCache.get(p->first)->checkUpdate(p->second, noRestart);
+ if(result)
+ {
+ results.push_back(result);
+ }
+ }
+ catch(const NodeUnreachableException& ex)
+ {
+ unreachableNodes.insert(ex.name);
+ }
+ catch(const DeploymentException& ex)
+ {
+ servers.push_back(p->first);
+ reasons.push_back(ex.reason);
+ }
+
+ }
+ }
+ }
+
+ for(vector<CheckUpdateResultPtr>::const_iterator q = results.begin(); q != results.end(); ++q)
+ {
+ try
+ {
+ (*q)->getResult();
+ }
+ catch(const NodeUnreachableException& ex)
+ {
+ unreachableNodes.insert(ex.name);
+ }
+ catch(const DeploymentException& ex)
+ {
+ servers.push_back((*q)->getServer());
+ reasons.push_back(ex.reason);
+ }
+ }
+
+ if(noRestart)
+ {
+ if(!servers.empty() || !unreachableNodes.empty())
+ {
+ if(_traceLevels->application > 0)
+ {
+ Ice::Trace out(_traceLevels->logger, _traceLevels->applicationCat);
+ out << "check for application `" << application << "' update failed:";
+ if(!unreachableNodes.empty())
+ {
+ Ice::StringSeq nodes(unreachableNodes.begin(), unreachableNodes.end());
+ if(nodes.size() == 1)
+ {
+ out << "\nthe node `" << nodes[0] << "' is down";
+ }
+ else
+ {
+ out << "\nthe nodes `" << toString(nodes, ", ") << "' are down";
+ }
+ }
+ if(!reasons.empty())
+ {
+ for(vector<string>::const_iterator p = reasons.begin(); p != reasons.end(); ++p)
+ {
+ out << "\n" << *p;
+ }
+ }
+ }
+
+ ostringstream os;
+ os << "check for application `" << application << "' update failed:";
+ if(!servers.empty())
+ {
+ if(servers.size() == 1)
+ {
+ os << "\nthe server `" << servers[0] << "' would need to be stopped";
+ }
+ else
+ {
+ os << "\nthe servers `" << toString(servers, ", ") << "' would need to be stopped";
+ }
+ }
+ if(!unreachableNodes.empty())
+ {
+ Ice::StringSeq nodes(unreachableNodes.begin(), unreachableNodes.end());
+ if(nodes.size() == 1)
+ {
+ os << "\nthe node `" << nodes[0] << "' is down";
+ }
+ else
+ {
+ os << "\nthe nodes `" << toString(nodes, ", ") << "' are down";
+ }
+ }
+ throw DeploymentException(os.str());
+ }
+ }
+ else if(!reasons.empty())
+ {
+ ostringstream os;
+ os << "check for application `" << application << "' update failed:";
+ for(vector<string>::const_iterator p = reasons.begin(); p != reasons.end(); ++p)
+ {
+ os << "\n" << *p;
+ }
+ throw DeploymentException(os.str());
+ }
+}
+
+void
+Database::finishApplicationUpdate(const ApplicationUpdateInfo& update,
+ const ApplicationInfo& oldApp,
+ const ApplicationHelper& previous,
+ const ApplicationHelper& helper,
+ AdminSessionI* session,
+ bool noRestart)
+{
+ const ApplicationDescriptor& newDesc = helper.getDefinition();
+ DatabaseConnectionPtr connection = _connectionPool->newConnection();
+
+ ServerEntrySeq entries;
+ try
+ {
+ if(_master)
+ {
+ checkUpdate(previous, helper, oldApp.uuid, oldApp.revision, noRestart);
+ }
+
+ Lock sync(*this);
+ checkForUpdate(previous, helper, connection);
+ reload(previous, helper, entries, oldApp.uuid, oldApp.revision + 1, noRestart);
+ }
+ catch(const DeploymentException&)
+ {
+ finishUpdating(update.descriptor.name);
+ throw;
+ }
+
for_each(entries.begin(), entries.end(), IceUtil::voidMemFun(&ServerEntry::sync));
int serial;
{
Lock sync(*this);
+
+ ApplicationInfo info = oldApp;
+ info.updateTime = update.updateTime;
+ info.updateUser = update.updateUser;
+ info.revision = update.revision;
+ info.descriptor = newDesc;
+ saveApplication(info, connection);
+
++_applicationSerial;
serial = _applicationObserverTopic->applicationUpdated(_applicationSerial, update);
}
@@ -2133,8 +2264,8 @@ Database::finishApplicationUpdate(ServerEntrySeq& entries,
ApplicationInfo info = oldApp;
info.revision = update.revision + 1;
- saveApplication(info, _connectionPool->getConnection());
- reload(previous, helper, entries, info.uuid, info.revision);
+ saveApplication(info, connection);
+ reload(previous, helper, entries, info.uuid, info.revision, noRestart);
newUpdate.updateTime = IceUtil::Time::now().toMilliSeconds();
newUpdate.updateUser = _lockUserId;