[SERVER-30935] dbCheck command assumes all collections have a UUID and causes the server to crash if they don't Created: 03/Sep/17  Updated: 30/Oct/23  Resolved: 08/Sep/17

Status: Closed
Project: Core Server
Component/s: Storage
Affects Version/s: None
Fix Version/s: 3.5.13

Type: Bug Priority: Major - P3
Reporter: Max Hirschhorn Assignee: Louis Williams
Resolution: Fixed Votes: 0
Labels: neweng
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Depends
Backwards Compatibility: Fully Compatible
Operating System: ALL
Steps To Reproduce:

python buildscripts/resmoke.py repro_server30935.js --storageEngine mmapv1

repro_server30935.js

(function() {
    "use strict";
 
    assert.commandWorked(db.runCommand({create: "mycoll"}));
    assert.commandWorked(db.runCommand({drop: "mycoll"}));
    assert.commandWorked(db.runCommand({dbCheck: 1}));
})();

Sprint: Storage 2017-09-11, Storage 2017-10-02
Participants:
Linked BF Score: 0

 Description   

Not every collection has a UUID even when the server is in featureCompatibilityVersion=3.6. For example, as part of SERVER-30500, the "system.indexes" collection on a database won't have a UUID. This means that calls to Collection::uuid() in DbCheckJob::_getCollectionMetadata() may attempt to get the value from an uninitialized boost::optional, leading to a segmentation fault.

auto collection = agd.getDb()->getCollection(opCtx, info.nss);
 
if (!collection) {
    return false;
}
 
auto prev = UUIDCatalog::get(opCtx).prev(_dbName, *collection->uuid());
auto next = UUIDCatalog::get(opCtx).next(_dbName, *collection->uuid());

Note: Due to how updateUUIDSchemaVersion() is only called with upgrade=true when the "setFeatureCompatibilityVersion" version command is run, if we manually modify the featureCompatibilityVersion document, then we can make a scenario where the server wouldn't have UUIDs for its collections while still being in featureCompatibilityVersion=3.6 even when running with the WiredTiger storage engine.



 Comments   
Comment by Githook User [ 15/Sep/17 ]

Author:

{'username': 'GeertBosch', 'name': 'Geert Bosch', 'email': 'geert@mongodb.com'}

Message: SERVER-30935 Fix UUID catalog prev/next with non-existent UUIDs
Branch: master
https://github.com/mongodb/mongo/commit/340b87ead6e5b0b6f0a369e89105c32852a64c18

Comment by Louis Williams [ 08/Sep/17 ]

Because I forgot to include the SERVER ticket in the commit... https://github.com/mongodb/mongo/commit/955dfb45f2f67d2f4570912dbcddecbf3e7bb116

Generated at Thu Feb 08 04:25:29 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.