From 5d81abc69044aa62241524fa3e7ee3c9aed2fbb1 Mon Sep 17 00:00:00 2001 From: Eliot Horowitz Date: Fri, 3 Apr 2009 13:52:06 -0400 Subject: cleaning moveshard --- s/commands.cpp | 48 +----------------------------------------------- s/shard.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ s/shard.h | 2 ++ 3 files changed, 57 insertions(+), 47 deletions(-) diff --git a/s/commands.cpp b/s/commands.cpp index 80c64272372..3b58628606d 100644 --- a/s/commands.cpp +++ b/s/commands.cpp @@ -408,54 +408,8 @@ namespace mongo { return false; } - log() << "ns: " << ns << " moving shard: " << s << " to: " << to << endl; - - // copyCollection - ScopedDbConnection toconn( to ); - BSONObj cloneRes; - - - BSONObj filter; - { - BSONObjBuilder b; - s.getFilter( b ); - filter = b.obj(); - } - - bool worked = toconn->runCommand( config->getName().c_str() , - BSON( "cloneCollection" << ns << - "from" << from << - "query" << filter - ) , - cloneRes - ); - - toconn.done(); - if ( ! worked ){ - errmsg = (string)"cloneCollection failed: " + cloneRes.toString(); + if ( ! s.moveAndCommit( to , errmsg ) ) return false; - } - - // update config db - s.setServer( to ); - - // need to increment version # for old server - Shard * randomShardOnOldServer = info->findShardOnServer( from ); - if ( randomShardOnOldServer ) - randomShardOnOldServer->_markModified(); - - info->save(); - - // delete old data - ScopedDbConnection fromconn( from ); - fromconn->remove( ns.c_str() , filter ); - string removeerror = fromconn->getLastError(); - fromconn.done(); - if ( removeerror.size() ){ - errmsg = (string)"error removing old data:" + removeerror; - return false; - } - result << "ok" << 1; return true; diff --git a/s/shard.cpp b/s/shard.cpp index 0ea0e906ca5..27c44f3727c 100644 --- a/s/shard.cpp +++ b/s/shard.cpp @@ -120,6 +120,60 @@ namespace mongo { return s; } + + bool Shard::moveAndCommit( const string& to , string& errmsg ){ + log() << "moving shard ns: " << _ns << " moving shard: " << toString() << " " << _server << " -> " << to << endl; + + string from = _server; + + // copyCollection + ScopedDbConnection toconn( to ); + BSONObj cloneRes; + + + BSONObj filter; + { + BSONObjBuilder b; + getFilter( b ); + filter = b.obj(); + } + + bool worked = toconn->runCommand( _manager->_config->getName().c_str() , + BSON( "cloneCollection" << _ns << + "from" << from << + "query" << filter + ) , + cloneRes + ); + + toconn.done(); + if ( ! worked ){ + errmsg = (string)"cloneCollection failed: " + cloneRes.toString(); + return false; + } + + // update config db + setServer( to ); + + // need to increment version # for old server + Shard * randomShardOnOldServer = _manager->findShardOnServer( from ); + if ( randomShardOnOldServer ) + randomShardOnOldServer->_markModified(); + + _manager->save(); + + // delete old data + ScopedDbConnection fromconn( from ); + fromconn->remove( _ns.c_str() , filter ); + string removeerror = fromconn->getLastError(); + fromconn.done(); + if ( removeerror.size() ){ + errmsg = (string)"error removing old data:" + removeerror; + return false; + } + + return true; + } bool Shard::operator==( const Shard& s ){ return diff --git a/s/shard.h b/s/shard.h index 8aaca9b5c29..1c6aca70f4d 100644 --- a/s/shard.h +++ b/s/shard.h @@ -74,6 +74,8 @@ namespace mongo { BSONObj pickSplitPoint(); Shard * split(); Shard * split( const BSONObj& middle ); + + bool moveAndCommit( const string& to , string& errmsg ); virtual const char * getNS(){ return "config.shard"; } virtual void serialize(BSONObjBuilder& to); -- cgit v1.2.1