From 1c970f7c593cfe5ffd3a8ed29cee51ef0a3dffe5 Mon Sep 17 00:00:00 2001 From: Benety Goh Date: Sat, 27 Aug 2022 07:59:58 -0400 Subject: SERVER-68477 TTL monitor skips indexes with NaN expireAfterSeconds (cherry-picked from commit 14c07b53186ee88497abd0ba492d2d9157891718) (cherry picked from commit 7d76329f8915ec80ba07c07e4a0adbc7fd187107) (cherry picked from commit 0f56fdb4c92f6728a8560469e66f4432fabc468d) --- jstests/noPassthrough/ttl_expire_nan.js | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 jstests/noPassthrough/ttl_expire_nan.js (limited to 'jstests') diff --git a/jstests/noPassthrough/ttl_expire_nan.js b/jstests/noPassthrough/ttl_expire_nan.js new file mode 100644 index 00000000000..5d26b214487 --- /dev/null +++ b/jstests/noPassthrough/ttl_expire_nan.js @@ -0,0 +1,45 @@ +/** + * Tests TTL indexes with NaN for 'expireAfterSeconds'. + * + * Existing TTL indexes from older versions of the server may contain a NaN for the duration. + * Newer server versions (5.0+) normalize the TTL duration to 0. + * + * @tags: [ + * requires_replication, + * ] + */ +(function() { +'use strict'; + +const rst = new ReplSetTest({ + nodes: [{}, {rsConfig: {votes: 0, priority: 0}}], + nodeOptions: {setParameter: {ttlMonitorSleepSecs: 5}}, +}); +rst.startSet(); +rst.initiate(); + +let primary = rst.getPrimary(); +const db = primary.getDB('test'); +const coll = db.t; + +assert.commandWorked(coll.createIndex({t: 1}, {expireAfterSeconds: NaN})); +assert.commandWorked(coll.insert({_id: 0, t: ISODate()})); + +// Wait for "TTL indexes require the expire field to be numeric, skipping TTL job" log message. +checkLog.containsJson(primary, 22542, {ns: coll.getFullName()}); + +// TTL index should be replicated to the secondary with a NaN 'expireAfterSeconds'. +const secondary = rst.getSecondary(); +checkLog.containsJson(secondary, 20384, { + namespace: coll.getFullName(), + properties: (spec) => { + jsTestLog('TTL index on secondary: ' + tojson(spec)); + return isNaN(spec.expireAfterSeconds); + } +}); + +assert.eq( + coll.countDocuments({}), 1, 'ttl index with NaN duration should not remove any documents.'); + +rst.stopSet(); +})(); -- cgit v1.2.1