summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/NodeI.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2008-02-25 16:49:12 +0100
committerBenoit Foucher <benoit@zeroc.com>2008-02-25 16:49:12 +0100
commit1d9fbeaa07f2c1a1e657197a65ec158cb1779ccc (patch)
treec227933846718c54786c05ffd51c8b8b384f8ebe /cpp/src/IceGrid/NodeI.cpp
parentFixed GCC 4.3 build failures (diff)
downloadice-1d9fbeaa07f2c1a1e657197a65ec158cb1779ccc.tar.bz2
ice-1d9fbeaa07f2c1a1e657197a65ec158cb1779ccc.tar.xz
ice-1d9fbeaa07f2c1a1e657197a65ec158cb1779ccc.zip
Changed the IceGrid node to be more conservative when removing server directories
Diffstat (limited to 'cpp/src/IceGrid/NodeI.cpp')
-rw-r--r--cpp/src/IceGrid/NodeI.cpp109
1 files changed, 37 insertions, 72 deletions
diff --git a/cpp/src/IceGrid/NodeI.cpp b/cpp/src/IceGrid/NodeI.cpp
index fad3df4afcc..63471ae03b4 100644
--- a/cpp/src/IceGrid/NodeI.cpp
+++ b/cpp/src/IceGrid/NodeI.cpp
@@ -212,7 +212,8 @@ NodeI::NodeI(const Ice::ObjectAdapterPtr& adapter,
_userAccountMapper(mapper),
_platform("IceGrid.Node", _communicator, _traceLevels),
_fileCache(new FileCache(_communicator)),
- _serial(1)
+ _serial(1),
+ _consistencyCheckDone(false)
{
Ice::PropertiesPtr props = _communicator->getProperties();
@@ -790,6 +791,16 @@ void
NodeI::checkConsistency(const NodeSessionPrx& session)
{
//
+ // Only do the consistency check on the startup. This ensures that servers can't
+ // be removed by a bogus master when the master session is re-established.
+ //
+ if(_consistencyCheckDone)
+ {
+ return;
+ }
+ _consistencyCheckDone = true;
+
+ //
// We use a serial number to keep track of the concurrent changes
// on the node. When a server is loaded/destroyed the serial is
// incremented. This allows to ensure that the list of servers
@@ -1085,6 +1096,7 @@ NodeI::checkConsistencyNoSync(const Ice::StringSeq& servers)
out << "removing server directory `" << _serversDir << "/" << *p << "' failed:\n" << msg;
}
+ *p = _serversDir + "/" + *p;
++p;
}
}
@@ -1097,68 +1109,12 @@ NodeI::checkConsistencyNoSync(const Ice::StringSeq& servers)
return commands;
}
- if(remove.empty())
- {
- return commands;
- }
-
- //
- // If there's server that couldn't be removed we move them to the
- // temporary backup directory. First, we rotate the temporary
- // backup directories.
- //
- try
- {
- contents.clear();
- contents = readDirectory(_tmpDir);
- }
- catch(const string& msg)
- {
- Ice::Error out(_traceLevels->logger);
- out << "couldn't read directory `" << _tmpDir << "':\n" << msg;
- return commands;
- }
-
- if(contents.size() < 10)
- {
- ostringstream os;
- os << "servers-" << contents.size();
- contents.push_back(os.str());
- sort(contents.begin(), contents.end(), greater<string>());
- }
- else if(contents.size() == 10)
- {
- sort(contents.begin(), contents.end(), greater<string>());
- try
- {
- removeRecursive(_tmpDir + "/" + *contents.begin());
- }
- catch(const string& msg)
- {
- Ice::Warning out(_traceLevels->logger);
- out << msg;
- }
- }
-
- try
- {
- Ice::StringSeq::const_iterator p;
- for(p = contents.begin(); p != (contents.end() - 1); ++p)
- {
- rename(_tmpDir + "/" + *(p + 1), _tmpDir + "/" + *p);
- }
- createDirectoryRecursive(_tmpDir + "/servers-0");
- for(p = remove.begin(); p != remove.end(); ++p)
- {
- rename(_serversDir + "/" + *p, _tmpDir + "/servers-0/" + *p);
- }
- }
- catch(const string& msg)
+ if(!remove.empty())
{
Ice::Warning out(_traceLevels->logger);
- out << "rotation failed: " << msg;
+ out << "server directories containing data not created or written by IceGrid were not removed:\n";
+ out << toString(remove);
}
-
return commands;
}
@@ -1174,19 +1130,21 @@ NodeI::canRemoveServerDirectory(const string& name)
//
// Check if there's files which we didn't create.
//
- Ice::StringSeq contents = readDirectory(_serversDir + "/" + name);
- remove(contents.begin(), contents.end(), "dbs");
- remove(contents.begin(), contents.end(), "config");
- remove(contents.begin(), contents.end(), "distrib");
+ Ice::StringSeq c = readDirectory(_serversDir + "/" + name);
+ set<string> contents(c.begin(), c.end());
+ contents.erase("dbs");
+ contents.erase("dbs");
+ contents.erase("config");
+ contents.erase("distrib");
+ contents.erase("revision");
if(!contents.empty())
{
return false;
}
- contents = readDirectory(_serversDir + "/" + name + "/config");
-
+ c = readDirectory(_serversDir + "/" + name + "/config");
Ice::StringSeq::const_iterator p;
- for(p = contents.begin() ; p != contents.end(); ++p)
+ for(p = c.begin() ; p != c.end(); ++p)
{
if(p->find("config") != 0)
{
@@ -1194,12 +1152,19 @@ NodeI::canRemoveServerDirectory(const string& name)
}
}
- contents = readDirectory(_serversDir + "/" + name + "/dbs");
- for(p = contents.begin() ; p != contents.end(); ++p)
+ c = readDirectory(_serversDir + "/" + name + "/dbs");
+ for(p = c.begin() ; p != c.end(); ++p)
{
- Ice::StringSeq files = readDirectory(_serversDir + "/" + name + "/dbs/" + *p);
- remove(files.begin(), files.end(), "DB_CONFIG");
- if(!files.empty())
+ try
+ {
+ Ice::StringSeq files = readDirectory(_serversDir + "/" + name + "/dbs/" + *p);
+ files.erase(remove(files.begin(), files.end(), "DB_CONFIG"), files.end());
+ if(!files.empty())
+ {
+ return false;
+ }
+ }
+ catch(const string&)
{
return false;
}