summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Milkie <milkie@10gen.com>2015-01-27 14:09:22 -0500
committerEric Milkie <milkie@10gen.com>2015-01-27 14:22:25 -0500
commitc91e229849d0ccae92a51ebed6b7c2849ba2d03b (patch)
treeb6a8bad1355c0c35af9069ca3453d15020243ab9
parentd38932a62ee31f5febab67f37d8aaff323d1e30b (diff)
downloadmongo-c91e229849d0ccae92a51ebed6b7c2849ba2d03b.tar.gz
SERVER-17053 restart transaction on WCE retry
-rw-r--r--src/mongo/db/commands/create_indexes.cpp8
-rw-r--r--src/mongo/db/commands/drop_indexes.cpp2
-rw-r--r--src/mongo/db/concurrency/write_conflict_exception.h6
-rw-r--r--src/mongo/db/dbcommands.cpp10
4 files changed, 11 insertions, 15 deletions
diff --git a/src/mongo/db/commands/create_indexes.cpp b/src/mongo/db/commands/create_indexes.cpp
index 0945e1c0af1..9de937f6ad7 100644
--- a/src/mongo/db/commands/create_indexes.cpp
+++ b/src/mongo/db/commands/create_indexes.cpp
@@ -192,9 +192,7 @@ namespace mongo {
MONGO_WRITE_CONFLICT_RETRY_LOOP_BEGIN {
uassertStatusOK(indexer.init(specs));
- } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn->getCurOp()->debug(),
- "createIndexes",
- ns.ns());
+ } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "createIndexes", ns.ns());
// If we're a background index, replace exclusive db lock with an intent lock, so that
// other readers and writers can proceed during this phase.
@@ -246,9 +244,7 @@ namespace mongo {
}
wunit.commit();
- } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn->getCurOp()->debug(),
- "createIndexes",
- ns.ns());
+ } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "createIndexes", ns.ns());
result.append( "numIndexesAfter", collection->getIndexCatalog()->numIndexesTotal(txn) );
diff --git a/src/mongo/db/commands/drop_indexes.cpp b/src/mongo/db/commands/drop_indexes.cpp
index bb3e1bca954..7aa404cac27 100644
--- a/src/mongo/db/commands/drop_indexes.cpp
+++ b/src/mongo/db/commands/drop_indexes.cpp
@@ -123,7 +123,7 @@ namespace mongo {
repl::logOp(txn, "c",(dbname + ".$cmd").c_str(), jsobj);
}
wunit.commit();
- } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn->getCurOp()->debug(), "dropIndexes", dbname);
+ } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "dropIndexes", dbname);
return true;
}
diff --git a/src/mongo/db/concurrency/write_conflict_exception.h b/src/mongo/db/concurrency/write_conflict_exception.h
index 08847a0b22a..63a4645bffc 100644
--- a/src/mongo/db/concurrency/write_conflict_exception.h
+++ b/src/mongo/db/concurrency/write_conflict_exception.h
@@ -35,11 +35,13 @@
#include "mongo/util/assert_util.h"
#define MONGO_WRITE_CONFLICT_RETRY_LOOP_BEGIN do { int wcr__Attempts = 0; do { try
-#define MONGO_WRITE_CONFLICT_RETRY_LOOP_END(OPDBG, OPSTR, NSSTR) \
+#define MONGO_WRITE_CONFLICT_RETRY_LOOP_END(PTXN, OPSTR, NSSTR) \
catch (const ::mongo::WriteConflictException &wce) { \
- ++(OPDBG).writeConflicts; \
+ const OperationContext* ptxn = (PTXN); \
+ ++ptxn->getCurOp()->debug().writeConflicts; \
wce.logAndBackoff(wcr__Attempts, (OPSTR), (NSSTR)); \
++wcr__Attempts; \
+ ptxn->recoveryUnit()->commitAndRestart(); \
continue; \
} \
break; \
diff --git a/src/mongo/db/dbcommands.cpp b/src/mongo/db/dbcommands.cpp
index 889cf2ee74a..c79329845f3 100644
--- a/src/mongo/db/dbcommands.cpp
+++ b/src/mongo/db/dbcommands.cpp
@@ -216,9 +216,7 @@ namespace mongo {
}
wunit.commit();
- } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn->getCurOp()->debug(),
- "dropDatabase",
- dbname);
+ } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "dropDatabase", dbname);
result.append( "dropped" , dbname );
@@ -522,7 +520,7 @@ namespace mongo {
repl::logOp(txn, "c",(dbname + ".$cmd").c_str(), cmdObj);
}
wunit.commit();
- } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn->getCurOp()->debug(), "drop", nsToDrop);
+ } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "drop", nsToDrop);
return true;
}
} cmdDrop;
@@ -607,7 +605,7 @@ namespace mongo {
}
wunit.commit();
- } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn->getCurOp()->debug(), "create", ns);
+ } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "create", ns);
return true;
}
} cmdCreate;
@@ -748,7 +746,7 @@ namespace mongo {
result.append( "numChunks" , n );
result.append( "md5" , digestToString( d ) );
- } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn->getCurOp()->debug(), "filemd5", dbname);
+ } MONGO_WRITE_CONFLICT_RETRY_LOOP_END(txn, "filemd5", dbname);
return true;
}