diff options
author | matt dannenberg <matt.dannenberg@10gen.com> | 2015-04-29 12:57:26 -0400 |
---|---|---|
committer | matt dannenberg <matt.dannenberg@10gen.com> | 2015-04-29 13:03:24 -0400 |
commit | 29271e11331d0cefca2330352c496da3c06c095b (patch) | |
tree | 768fd5f7c7db38202f7e7eef40f0e35187bd0775 | |
parent | abc4c40d6859d3594a41135ee20a87982d111fc7 (diff) | |
download | mongo-29271e11331d0cefca2330352c496da3c06c095b.tar.gz |
SERVER-18211 write to disk all documents in a collection when rolling back createCollection
-rw-r--r-- | src/mongo/db/repl/rs_rollback.cpp | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/src/mongo/db/repl/rs_rollback.cpp b/src/mongo/db/repl/rs_rollback.cpp index 00a178dd8d0..7f730b8de50 100644 --- a/src/mongo/db/repl/rs_rollback.cpp +++ b/src/mongo/db/repl/rs_rollback.cpp @@ -34,11 +34,13 @@ #include "mongo/db/client.h" #include "mongo/db/cloner.h" #include "mongo/db/dbhelpers.h" +#include "mongo/db/exec/working_set_common.h" #include "mongo/db/ops/update.h" #include "mongo/db/ops/update_request.h" #include "mongo/db/ops/update_lifecycle_impl.h" #include "mongo/db/ops/delete.h" #include "mongo/db/query/internal_plans.h" +#include "mongo/db/query/runner.h" #include "mongo/db/repl/oplog.h" #include "mongo/db/repl/rs.h" @@ -450,12 +452,38 @@ namespace mongo { sethbmsg("rollback 4.3"); } + map<string,shared_ptr<Helpers::RemoveSaver> > removeSavers; + sethbmsg("rollback 4.6"); /** drop collections to drop before doing individual fixups - that might make things faster below actually if there were subsequent inserts to rollback */ for( set<string>::iterator i = h.toDrop.begin(); i != h.toDrop.end(); i++ ) { Client::Context c(*i); try { log() << "replSet rollback drop: " << *i << rsLog; + shared_ptr<Helpers::RemoveSaver>& removeSaver = removeSavers[*i]; + if (!removeSaver) + removeSaver.reset(new Helpers::RemoveSaver("rollback", "", *i)); + + // perform a collection scan and write all documents in the collection to disk + boost::scoped_ptr<Runner> runner(InternalPlanner::collectionScan(*i)); + BSONObj curObj; + Runner::RunnerState runnerState; + while (Runner::RUNNER_ADVANCED == (runnerState = runner->getNext(&curObj, NULL))) { + removeSaver->goingToDelete(curObj); + } + if (runnerState != Runner::RUNNER_EOF) { + if (runnerState == Runner::RUNNER_ERROR) { + severe() << "rolling back createCollection on " << *i + << " failed with " << WorkingSetCommon::toStatusString(curObj) + << ". A full resync is necessary."; + } + else { + severe() << "rolling back createCollection on " << *i + << " failed. A full resync is necessary."; + } + + throw std::exception(); + } c.db()->dropCollection(*i); } catch(...) { @@ -470,8 +498,6 @@ namespace mongo { str::stream() << "replSet error in rollback can't find " << rsoplog, oplogCollection); - map<string,shared_ptr<Helpers::RemoveSaver> > removeSavers; - unsigned deletes = 0, updates = 0; for( list<pair<DocID,bo> >::iterator i = goodVersions.begin(); i != goodVersions.end(); i++ ) { const DocID& d = i->first; |