summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiangyu Yao <xiangyu.yao@mongodb.com>2017-11-01 10:52:26 -0400
committerXiangyu Yao <xiangyu.yao@mongodb.com>2018-01-30 12:44:45 -0500
commitbdb080651afe340a10f1fb55dcc89fd767b28003 (patch)
treed06477d83df100d1a3b6e79df17f2df012794432
parentaaa17b1ce626b47666dc585f52326ac9c124e3a1 (diff)
downloadmongo-bdb080651afe340a10f1fb55dcc89fd767b28003.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.cpp2
-rw-r--r--src/mongo/dbtests/rollbacktests.cpp12
2 files changed, 8 insertions, 6 deletions
diff --git a/src/mongo/db/catalog/database.cpp b/src/mongo/db/catalog/database.cpp
index 13b4b7faa01..a09402cb607 100644
--- a/src/mongo/db/catalog/database.cpp
+++ b/src/mongo/db/catalog/database.cpp
@@ -445,8 +445,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 26933d167db..66b01c3772c 100644
--- a/src/mongo/dbtests/rollbacktests.cpp
+++ b/src/mongo/dbtests/rollbacktests.cpp
@@ -209,7 +209,7 @@ public:
}
};
-template <bool rollback, bool defaultIndexes>
+template <bool rollback, bool defaultIndexes, bool capped>
class RenameCollection {
public:
void run() {
@@ -228,7 +228,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()));
@@ -255,7 +256,7 @@ public:
}
};
-template <bool rollback, bool defaultIndexes>
+template <bool rollback, bool defaultIndexes, bool capped>
class RenameDropTargetCollection {
public:
void run() {
@@ -279,8 +280,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);