summaryrefslogtreecommitdiff
path: root/jstests/core/startup_log.js
blob: f905e4a34e0c9acf4f75d54bea2e3b464236208b (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
/**
 * This test attempts to read from the "local.startup_log" collection and assert that it has an
 * entry matching the server's response from the "getCmdLineOpts" command. The former operation may
 * be routed to a secondary in the replica set, whereas the latter must be routed to the primary.
 *
 * @tags: [
 *  assumes_read_preference_unchanged,
 *  requires_collstats,
 *  requires_capped,
 * ]
 */

load('jstests/aggregation/extras/utils.js');

(function() {
'use strict';

// Check that smallArray is entirely contained by largeArray
// returns false if a member of smallArray is not in largeArray
function arrayIsSubset(smallArray, largeArray) {
    for (var i = 0; i < smallArray.length; i++) {
        if (!Array.contains(largeArray, smallArray[i])) {
            print("Could not find " + smallArray[i] + " in largeArray");
            return false;
        }
    }

    return true;
}

// Test startup_log
var stats = db.getSiblingDB("local").startup_log.stats();
assert(stats.capped);

var latestStartUpLog =
    db.getSiblingDB("local").startup_log.find().sort({$natural: -1}).limit(1).next();
var serverStatus = db._adminCommand("serverStatus");
var cmdLine = db._adminCommand("getCmdLineOpts").parsed;

// Test that the startup log has the expected keys
var verbose = false;
var expectedKeys =
    ["_id", "hostname", "startTime", "startTimeLocal", "cmdLine", "pid", "buildinfo"];
var keys = Object.keySet(latestStartUpLog);
assert(arrayEq(expectedKeys, keys, verbose), 'startup_log keys failed');

// Tests _id implicitly - should be comprised of host-timestamp
// Setup expected startTime and startTimeLocal from the supplied timestamp
var _id = latestStartUpLog._id.split('-');  // _id should consist of host-timestamp
var _idUptime = _id.pop();
var _idHost = _id.join('-');
var uptimeSinceEpochRounded = Math.floor(_idUptime / 1000) * 1000;
var startTime = new Date(uptimeSinceEpochRounded);  // Expected startTime

assert.eq(_idHost, latestStartUpLog.hostname, "Hostname doesn't match one from _id");
assert.eq(serverStatus.host.split(':')[0],
          latestStartUpLog.hostname,
          "Hostname doesn't match one in server status");
assert.closeWithinMS(startTime,
                     latestStartUpLog.startTime,
                     "StartTime doesn't match one from _id",
                     2000);  // Expect less than 2 sec delta
assert.eq(cmdLine, latestStartUpLog.cmdLine, "cmdLine doesn't match that from getCmdLineOpts");
assert.eq(serverStatus.pid, latestStartUpLog.pid, "pid doesn't match that from serverStatus");

// Test buildinfo
var buildinfo = db.runCommand("buildinfo");
delete buildinfo.ok;                   // Delete extra meta info not in startup_log
delete buildinfo.operationTime;        // Delete extra meta info not in startup_log
delete buildinfo.$clusterTime;         // Delete extra meta info not in startup_log
delete buildinfo.lastCommittedOpTime;  // Delete extra meta info not in startup_log (only returned
                                       // by shardsvrs)
var hello = db._adminCommand("hello");

// Test buildinfo has the expected keys
var expectedKeys = [
    "version",
    "gitVersion",
    "allocator",
    "versionArray",
    "javascriptEngine",
    "openssl",
    "buildEnvironment",
    "debug",
    "maxBsonObjectSize",
    "bits",
    "modules"
];

var keys = Object.keySet(latestStartUpLog.buildinfo);
// Disabled to check
assert(arrayIsSubset(expectedKeys, keys),
       "buildinfo keys failed! \n expected:\t" + expectedKeys + "\n actual:\t" + keys);
assert.eq(
    buildinfo, latestStartUpLog.buildinfo, "buildinfo doesn't match that from buildinfo command");

// Test version and version Array
var version = latestStartUpLog.buildinfo.version.split('-')[0];
var versionArray = latestStartUpLog.buildinfo.versionArray;
var versionArrayCleaned = versionArray.slice(0, 3);
if (versionArray[3] == -100) {
    versionArrayCleaned[2] -= 1;
}

assert.eq(serverStatus.version,
          latestStartUpLog.buildinfo.version,
          "Mongo version doesn't match that from ServerStatus");
assert.eq(
    version, versionArrayCleaned.join('.'), "version doesn't match that from the versionArray");
var jsEngine = latestStartUpLog.buildinfo.javascriptEngine;
assert((jsEngine == "none") || jsEngine.startsWith("mozjs"));
assert.eq(hello.maxBsonObjectSize,
          latestStartUpLog.buildinfo.maxBsonObjectSize,
          "maxBsonObjectSize doesn't match one from hello");
})();