summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatt dannenberg <matt.dannenberg@10gen.com>2015-04-29 12:57:26 -0400
committermatt dannenberg <matt.dannenberg@10gen.com>2015-04-29 13:03:24 -0400
commit29271e11331d0cefca2330352c496da3c06c095b (patch)
tree768fd5f7c7db38202f7e7eef40f0e35187bd0775
parentabc4c40d6859d3594a41135ee20a87982d111fc7 (diff)
downloadmongo-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.cpp30
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;