summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/hybrid_geo_index_remove_invalid_doc.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/noPassthrough/hybrid_geo_index_remove_invalid_doc.js')
-rw-r--r--jstests/noPassthrough/hybrid_geo_index_remove_invalid_doc.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/jstests/noPassthrough/hybrid_geo_index_remove_invalid_doc.js b/jstests/noPassthrough/hybrid_geo_index_remove_invalid_doc.js
new file mode 100644
index 00000000000..a99533a8bbf
--- /dev/null
+++ b/jstests/noPassthrough/hybrid_geo_index_remove_invalid_doc.js
@@ -0,0 +1,71 @@
+/**
+ * Tests that building geo indexes using the hybrid method handles the unindexing of invalid
+ * geo documents.
+ *
+ * @tags: [requires_document_locking, requires_replication]
+ */
+(function() {
+ 'use strict';
+
+ load('jstests/noPassthrough/libs/index_build.js');
+
+ const rst = new ReplSetTest({
+ nodes: [
+ {},
+ {
+ // Disallow elections on secondary.
+ rsConfig: {
+ priority: 0,
+ votes: 0,
+ },
+ },
+ ]
+ });
+ const nodes = rst.startSet();
+ rst.initiate();
+
+ const primary = rst.getPrimary();
+ const testDB = primary.getDB('test');
+ const coll = testDB.getCollection('test');
+
+ assert.commandWorked(testDB.createCollection(coll.getName()));
+
+ // Insert an invalid geo document that will be removed before the indexer starts a collecton
+ // scan.
+ assert.commandWorked(coll.insert({
+ _id: 0,
+ b: {type: 'invalid_geo_json_type', coordinates: [100, 100]},
+ }));
+
+ // We are using this fail point to pause the index build before it starts the collection scan.
+ // This is important for this test because we are mutating the collection state before the index
+ // builder is able to observe the invalid geo document.
+ // By comparison, IndexBuildTest.pauseIndexBuilds() stalls the index build in the middle of the
+ // collection scan.
+ assert.commandWorked(testDB.adminCommand(
+ {configureFailPoint: 'hangAfterSettingUpIndexBuild', mode: 'alwaysOn'}));
+
+ const createIdx = IndexBuildTest.startIndexBuild(primary, coll.getFullName(), {b: '2dsphere'});
+ IndexBuildTest.waitForIndexBuildToStart(testDB);
+
+ // Insert a valid geo document to initialize the hybrid index builder's side table state.
+ assert.commandWorked(coll.insert({
+ b: {type: 'Polygon', coordinates: [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]]},
+ }));
+
+ // Removing the invalid geo document should not cause any issues for the side table accounting.
+ assert.commandWorked(coll.remove({_id: 0}));
+
+ assert.commandWorked(
+ testDB.adminCommand({configureFailPoint: 'hangAfterSettingUpIndexBuild', mode: 'off'}));
+
+ // Wait for the index build to finish. Since the invalid geo document is removed before the
+ // index build scans the collection, the index should be built successfully.
+ createIdx();
+ IndexBuildTest.assertIndexes(coll, 2, ['_id_', 'b_2dsphere']);
+
+ let res = assert.commandWorked(coll.validate({full: true}));
+ assert(res.valid, 'validation failed on primary: ' + tojson(res));
+
+ rst.stopSet();
+})();