summaryrefslogtreecommitdiff
path: root/jstests/replsets/initial_sync_uuid_not_found.js
blob: 2e2911ee6ddda36e11fa86a8823f7c01df034ff6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/**
 * Test dropping collections during initial sync, before using the 'find' and 'count'
 * commands using UUIDs instead of namespaces. This verifies initial sync behavior in
 * cases where using UUIDs results in NamespaceNotFound while using namespace strings
 * results in an empty result or zero count.
 */
(function() {
'use strict';

load("jstests/libs/fail_point_util.js");

const basename = 'initial_sync_rename_collection';

jsTestLog('Bring up set');
const rst = new ReplSetTest(
    {name: basename, nodes: [{}, {rsConfig: {priority: 0}}, {rsConfig: {priority: 0}}]});
rst.startSet();
rst.initiate();

const primary = rst.getPrimary();
const primaryDB = primary.getDB('d');
const primaryColl = primaryDB.coll;

jsTestLog('Create a collection (with a UUID) and insert a document.');
assert.commandWorked(primaryColl.insert({_id: 0}));

const collInfo = primaryDB.getCollectionInfos({name: primaryColl.getName()})[0];
assert(collInfo.info.uuid, 'newly created collection expected to have a UUID: ' + tojson(collInfo));

jsTestLog('Make sure synced');
rst.awaitReplication();

jsTestLog('Resync the secondary enabling failpoint');
function ResyncWithFailpoint(failpointName, failpointData) {
    let setParameter = {numInitialSyncAttempts: 1};
    setParameter['failpoint.' + failpointName] = tojson({mode: 'alwaysOn', data: failpointData});
    rst.restart(1, {startClean: true, setParameter});
    const secondary = rst.nodes[1];
    assert.eq(primary, rst.getPrimary(), 'Primary changed after reconfig');

    jsTestLog('Wait for new node to start cloning');
    secondary.setSecondaryOk();
    const secondaryDB = secondary.getDB(primaryDB.getName());
    const secondaryColl = secondaryDB[primaryColl.getName()];

    rst.reInitiate();
    assert.commandWorked(secondary.adminCommand({
        waitForFailPoint: failpointName,
        timesEntered: 1,
        maxTimeMS: kDefaultWaitForFailPointTimeout
    }));

    jsTestLog('Remove collection on the primary and insert a new document, recreating it.');
    assert(primaryColl.drop());
    assert.commandWorked(primaryColl.insert({_id: 0}, {writeConcern: {w: 'majority'}}));
    const newCollInfo = primaryDB.getCollectionInfos({name: primaryColl.getName()})[0];
    assert(collInfo.info.uuid, 'recreated collection expected to have a UUID: ' + tojson(collInfo));
    assert.neq(collInfo.info.uuid,
               newCollInfo.info.uuid,
               'recreated collection expected to have different UUID');

    jsTestLog('Disable failpoint and resume initial sync');
    assert.commandWorked(secondary.adminCommand({configureFailPoint: failpointName, mode: 'off'}));

    jsTestLog('Wait for both nodes to be up-to-date');
    rst.awaitSecondaryNodes();
    rst.awaitReplication();

    jsTestLog('Check consistency and shut down replica-set');
    rst.checkReplicatedDataHashes();
}
ResyncWithFailpoint(
    'hangBeforeClonerStage',
    {cloner: 'CollectionCloner', stage: 'count', namespace: primaryColl.getFullName()});
ResyncWithFailpoint(
    'hangAfterClonerStage',
    {cloner: 'DatabaseCloner', stage: 'listCollections', database: primaryDB.getName()});
rst.stopSet();
})();