summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough
diff options
context:
space:
mode:
authorGregory Wlodarek <gregory.wlodarek@mongodb.com>2020-03-13 17:15:58 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-03-13 21:30:48 +0000
commitdf0272716ae3a6767e33adf98392dddea494e587 (patch)
tree6f15569421a97277b180f902319a549326f86ff9 /jstests/noPassthrough
parent7ce09a820efeceb4f0a3a70140748aaf88309452 (diff)
downloadmongo-df0272716ae3a6767e33adf98392dddea494e587.tar.gz
SERVER-46640 The TTLMonitor should not remove the cached index information from the TTLCollectionCache when a collection is not yet visible
Diffstat (limited to 'jstests/noPassthrough')
-rw-r--r--jstests/noPassthrough/ttl_monitor_does_not_unregister_index_during_collection_creation.js63
1 files changed, 63 insertions, 0 deletions
diff --git a/jstests/noPassthrough/ttl_monitor_does_not_unregister_index_during_collection_creation.js b/jstests/noPassthrough/ttl_monitor_does_not_unregister_index_during_collection_creation.js
new file mode 100644
index 00000000000..fd1f45902bf
--- /dev/null
+++ b/jstests/noPassthrough/ttl_monitor_does_not_unregister_index_during_collection_creation.js
@@ -0,0 +1,63 @@
+/**
+ * Ensures that the TTLMonitor does not remove the cached index information from the
+ * TTLCollectionCache object for a newly created index before the implicitly created collection is
+ * registered and visible in the CollectionCatalog.
+ * Removing this cached index information prevents the TTLMonitor from removing expired documents
+ * for that collection.
+ */
+(function() {
+'use strict';
+
+const conn = MongoRunner.runMongod({setParameter: 'ttlMonitorSleepSecs=1'});
+
+const dbName = "test";
+const collName = "ttlMonitor";
+
+const db = conn.getDB(dbName);
+const coll = db.getCollection(collName);
+
+TestData.dbName = dbName;
+TestData.collName = collName;
+
+coll.drop();
+
+const failPoint = "hangTTLCollectionCacheAfterRegisteringInfo";
+assert.commandWorked(db.adminCommand({configureFailPoint: failPoint, mode: "alwaysOn"}));
+
+// Create an index on a non-existent collection. This will implicitly create the collection.
+let awaitEnsureIndex = startParallelShell(() => {
+ const testDB = db.getSiblingDB(TestData.dbName);
+ assert.commandWorked(
+ testDB.getCollection(TestData.collName).ensureIndex({x: 1}, {expireAfterSeconds: 0}));
+}, db.getMongo().port);
+
+// Wait for the TTL monitor to run and register the index in the TTL collection cache.
+checkLog.containsJson(db.getMongo(), 4664000);
+
+// Let the TTL monitor run once. It should not remove the index from the cached TTL information
+// until the collection is committed.
+let ttlPass = assert.commandWorked(db.serverStatus()).metrics.ttl.passes;
+assert.soon(function() {
+ return coll.getDB().serverStatus().metrics.ttl.passes >= ttlPass + 1;
+}, "TTL monitor didn't run.");
+
+// Finish the index build.
+assert.commandWorked(db.adminCommand({configureFailPoint: failPoint, mode: "off"}));
+awaitEnsureIndex();
+
+// Insert documents, which should expire immediately and be removed on the next TTL pass.
+const now = new Date();
+for (let i = 0; i < 10; i++) {
+ assert.commandWorked(coll.insert({x: now}));
+}
+
+// Let the TTL monitor run once to remove the expired documents.
+ttlPass = assert.commandWorked(db.serverStatus()).metrics.ttl.passes;
+assert.soon(function() {
+ return coll.getDB().serverStatus().metrics.ttl.passes >= ttlPass + 1;
+}, "TTL monitor didn't run.");
+
+assert.eq(0, coll.find({}).count());
+
+MongoRunner.stopMongod(conn);
+}());