From c91e229849d0ccae92a51ebed6b7c2849ba2d03b Mon Sep 17 00:00:00 2001 From: Eric Milkie Date: Tue, 27 Jan 2015 14:09:22 -0500 Subject: SERVER-17053 restart transaction on WCE retry --- src/mongo/db/commands/create_indexes.cpp | 8 ++------ src/mongo/db/commands/drop_indexes.cpp | 2 +- src/mongo/db/concurrency/write_conflict_exception.h | 6 ++++-- src/mongo/db/dbcommands.cpp | 10 ++++------ 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; } -- cgit v1.2.1