summaryrefslogtreecommitdiff
path: root/jstests/serial_run/index_multi.js
blob: 5ba9b277357ef16518fbc91ec9f150889532feed (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Attempt to build 63 indexes simultaneously

Random.setRandomSeed();

var coll = db.index_multi;
coll.drop();
db.results.drop();

var bulk = coll.initializeUnorderedBulkOp();
print("Populate the collection with random data");
for (var i = 0; i < 1e4; i++) {
    var doc = {"_id": i};

    for (var j = 0; j < 100; j++) {
        // Skip some of the fields
        if (Random.rand() < .1) {
            continue;
        }
        // Make 0, 10, etc. multikey indexes
        else if (j % 10 == 0) {
            doc["field" + j] = [Random.rand(), Random.rand(), Random.rand()];
        } else {
            doc["field" + j] = Random.rand();
        }
    }

    bulk.insert(doc);
}
assert.commandWorked(bulk.execute());

// Array of all index specs
var specs = [];
var multikey = [];

var setupDBStr = "var conn = null;" +
    "assert.soon(function() {" +
    "  try {" +
    "    conn = new Mongo(\"" + db.getMongo().host + "\");" +
    "    return conn;" +
    "  } catch (x) {" +
    "    return false;" +
    "  }" +
    "}, 'Timed out waiting for temporary connection to connect', 30000, 5000);" +
    "var db = conn.getDB('" + db.getName() + "');";

var indexJobs = [];
print("Create 3 triple indexes");
for (var i = 90; i < 93; i++) {
    var spec = {};
    spec["field" + i] = 1;
    spec["field" + (i + 1)] = 1;
    spec["field" + (i + 2)] = 1;
    indexJobs.push(startParallelShell(
        setupDBStr + "printjson(db.index_multi.createIndex(" + tojson(spec) + "," +
            "{ background: true }));" +
            "db.results.insert(Object.extend(" +
            "db.runCommand({ getlasterror: 1 }), " + tojson(spec) + ") );",
        null,    // port
        true));  // noconnect
    specs.push(spec);
    multikey.push(i % 10 == 0 || (i + 1) % 10 == 0 || (i + 2) % 10 == 0);
}

print("Create 30 compound indexes");
for (var i = 30; i < 90; i += 2) {
    var spec = {};
    spec["field" + i] = 1;
    spec["field" + (i + 1)] = 1;
    indexJobs.push(startParallelShell(
        setupDBStr + "printjson(db.index_multi.createIndex(" + tojson(spec) + ", " +
            "{ background: true }));" +
            "db.results.insert(Object.extend(" +
            "db.runCommand({ getlasterror: 1 }), " + tojson(spec) + ") );",
        null,    // port
        true));  // noconnect
    specs.push(spec);
    multikey.push(i % 10 == 0 || (i + 1) % 10 == 0);
}

print("Create 30 indexes");
for (var i = 0; i < 30; i++) {
    var spec = {};
    spec["field" + i] = 1;
    indexJobs.push(startParallelShell(
        setupDBStr + "printjson(db.index_multi.createIndex(" + tojson(spec) + ", " +
            "{ background: true }));" +
            "db.results.insert(Object.extend(" +
            "db.runCommand({ getlasterror: 1 }), " + tojson(spec) + ") );",
        null,    // port
        true));  // noconnect
    specs.push(spec);
    multikey.push(i % 10 == 0);
}

print("Do some sets and unsets");
bulk = coll.initializeUnorderedBulkOp();
for (i = 0; i < 1e4; i++) {
    var criteria = {_id: Random.randInt(1e5)};
    var mod = {};
    if (Random.rand() < .5) {
        mod['$set'] = {};
        mod['$set']['field' + Random.randInt(100)] = Random.rand();
    } else {
        mod['$unset'] = {};
        mod['$unset']['field' + Random.randInt(100)] = true;
    }

    bulk.find(criteria).update(mod);
}
assert.commandWorked(bulk.execute());

indexJobs.forEach(function(join) {
    join();
});

printjson(db.results.find().toArray());
// assert.eq(coll.getIndexes().length, 64, "didn't see 64 indexes");

print("Make sure we end up with 64 indexes");
for (var i in specs) {
    var explain = coll.find().hint(specs[i]).explain();
    assert("queryPlanner" in explain, tojson(explain));
}

print("SUCCESS!");