diff options
author | Xiangyu Yao <xiangyu.yao@mongodb.com> | 2017-11-01 10:52:26 -0400 |
---|---|---|
committer | Xiangyu Yao <xiangyu.yao@mongodb.com> | 2018-01-30 14:24:29 -0500 |
commit | 97fbe83558a3d018b89eaff2d1ff74df1e67782d (patch) | |
tree | 3cca206a03a017221ebf8a812d2476f0b384c9c9 | |
parent | e6783ca2cac1e5d16b822e1508a1c025cdbded81 (diff) | |
download | mongo-97fbe83558a3d018b89eaff2d1ff74df1e67782d.tar.gz |
SERVER-31462 Register Database::AddCollectionChange in the correct order
The wrong order leads to the rollback of CollectionImpl happening after
the rollback of KVCollectionCatalogEntry. This means the Collection destructor
would call setCappedCallback() on an already destroyed RecordStore.
(cherry picked from commit f9e38f099a892964a09d4a80aafd8edfef21594d)
-rw-r--r-- | src/mongo/db/catalog/database.cpp | 2 | ||||
-rw-r--r-- | src/mongo/dbtests/rollbacktests.cpp | 12 |
2 files changed, 8 insertions, 6 deletions
diff --git a/src/mongo/db/catalog/database.cpp b/src/mongo/db/catalog/database.cpp index 9e24afd5ffb..23fdfb84e95 100644 --- a/src/mongo/db/catalog/database.cpp +++ b/src/mongo/db/catalog/database.cpp @@ -475,8 +475,8 @@ Status Database::renameCollection(OperationContext* txn, Top::get(txn->getClient()->getServiceContext()).collectionDropped(fromNS.toString()); } - txn->recoveryUnit()->registerChange(new AddCollectionChange(txn, this, toNS)); Status s = _dbEntry->renameCollection(txn, fromNS, toNS, stayTemp); + txn->recoveryUnit()->registerChange(new AddCollectionChange(txn, this, toNS)); _collections[toNS] = _getOrCreateCollectionInstance(txn, toNS); return s; } diff --git a/src/mongo/dbtests/rollbacktests.cpp b/src/mongo/dbtests/rollbacktests.cpp index b842eb5a9bc..300d3f46aed 100644 --- a/src/mongo/dbtests/rollbacktests.cpp +++ b/src/mongo/dbtests/rollbacktests.cpp @@ -216,7 +216,7 @@ public: } }; -template <bool rollback, bool defaultIndexes> +template <bool rollback, bool defaultIndexes, bool capped> class RenameCollection { public: void run() { @@ -236,7 +236,8 @@ public: WriteUnitOfWork uow(&txn); ASSERT(!collectionExists(&ctx, source.ns())); ASSERT(!collectionExists(&ctx, target.ns())); - ASSERT_OK(userCreateNS(&txn, ctx.db(), source.ns(), BSONObj(), defaultIndexes)); + auto options = capped ? BSON("capped" << true << "size" << 1000) : BSONObj(); + ASSERT_OK(userCreateNS(&txn, ctx.db(), source.ns(), options, defaultIndexes)); uow.commit(); } ASSERT(collectionExists(&ctx, source.ns())); @@ -263,7 +264,7 @@ public: } }; -template <bool rollback, bool defaultIndexes> +template <bool rollback, bool defaultIndexes, bool capped> class RenameDropTargetCollection { public: void run() { @@ -288,8 +289,9 @@ public: WriteUnitOfWork uow(&txn); ASSERT(!collectionExists(&ctx, source.ns())); ASSERT(!collectionExists(&ctx, target.ns())); - ASSERT_OK(userCreateNS(&txn, ctx.db(), source.ns(), BSONObj(), defaultIndexes)); - ASSERT_OK(userCreateNS(&txn, ctx.db(), target.ns(), BSONObj(), defaultIndexes)); + auto options = capped ? BSON("capped" << true << "size" << 1000) : BSONObj(); + ASSERT_OK(userCreateNS(&txn, ctx.db(), source.ns(), options, defaultIndexes)); + ASSERT_OK(userCreateNS(&txn, ctx.db(), target.ns(), options, defaultIndexes)); insertRecord(&txn, source, sourceDoc); insertRecord(&txn, target, targetDoc); |