Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-42300

listCollections can miss collections

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Critical - P2
    • Resolution: Fixed
    • Affects Version/s: 4.2.0-rc3
    • Fix Version/s: 4.2.0-rc5, 4.3.1
    • Component/s: Catalog, Storage
    • Labels:
      None
    • Backwards Compatibility:
      Fully Compatible
    • Operating System:
      ALL
    • Backport Requested:
      v4.2
    • Steps To Reproduce:
      Hide

      On 28d9deadde968ed2025923d497f4bac9ed6f02bc:

      diff --git a/jstests/concurrency/fsm_workloads/rename_collection_chain.js b/jstests/concurrency/fsm_workloads/rename_collection_chain.js
      index cd6a541c17..cf2f6f4942 100644
      --- a/jstests/concurrency/fsm_workloads/rename_collection_chain.js
      +++ b/jstests/concurrency/fsm_workloads/rename_collection_chain.js
      @@ -9,7 +9,6 @@
        */
       
       var $config = (function() {
      -
           var data = {
               // Use the workload name as a prefix for the collection name,
               // since the workload name is assumed to be unique.
      @@ -17,7 +16,6 @@ var $config = (function() {
           };
       
           var states = (function() {
      -
               function uniqueCollectionName(prefix, tid, num) {
                   return prefix + tid + '_' + num;
               }
      @@ -35,11 +33,30 @@ var $config = (function() {
                   this.fromCollName = toCollName;
               }
       
      -        return {init: init, rename: rename};
      +        function listCollections(db, collName) {
      +            const collectionInfos = db.getCollectionInfos();
      +            if (!this.allCollectionsInitialized) {
      +                if (collectionInfos.length === this.threadCount) {
      +                    this.allCollectionsInitialized = true;
      +                    jsTestLog(`All collections visible to thread ${this.tid}: ${
      +                        tojsononeline(collectionInfos)}`);
      +                }
      +            } else {
      +                const numColls =
      +                    collectionInfos.filter((collInfo) => collInfo.name.startsWith(this.prefix))
      +                        .length;
      +                assertAlways.eq(numColls, this.threadCount, () => tojson(collectionInfos));
      +            }
      +        }
       
      +        return {init: init, rename: rename, listCollections: listCollections};
           })();
       
      -    var transitions = {init: {rename: 1}, rename: {rename: 1}};
      +    var transitions = {
      +        init: {rename: 1},
      +        rename: {rename: 0.9, listCollections: 0.1},
      +        listCollections: {rename: 1},
      +    };
       
           return {
               threadCount: 10,
      @@ -48,5 +65,4 @@ var $config = (function() {
               states: states,
               transitions: transitions,
           };
      -
       })();
      

      Show
      On 28d9deadde968ed2025923d497f4bac9ed6f02bc : diff --git a/jstests/concurrency/fsm_workloads/rename_collection_chain.js b/jstests/concurrency/fsm_workloads/rename_collection_chain.js index cd6a541c17..cf2f6f4942 100644 --- a/jstests/concurrency/fsm_workloads/rename_collection_chain.js +++ b/jstests/concurrency/fsm_workloads/rename_collection_chain.js @@ -9,7 +9,6 @@ */ var $config = (function() { - var data = { // Use the workload name as a prefix for the collection name, // since the workload name is assumed to be unique. @@ -17,7 +16,6 @@ var $config = (function() { }; var states = (function() { - function uniqueCollectionName(prefix, tid, num) { return prefix + tid + '_' + num; } @@ -35,11 +33,30 @@ var $config = (function() { this.fromCollName = toCollName; } - return {init: init, rename: rename}; + function listCollections(db, collName) { + const collectionInfos = db.getCollectionInfos(); + if (!this.allCollectionsInitialized) { + if (collectionInfos.length === this.threadCount) { + this.allCollectionsInitialized = true; + jsTestLog(`All collections visible to thread ${this.tid}: ${ + tojsononeline(collectionInfos)}`); + } + } else { + const numColls = + collectionInfos.filter((collInfo) => collInfo.name.startsWith(this.prefix)) + .length; + assertAlways.eq(numColls, this.threadCount, () => tojson(collectionInfos)); + } + } + return {init: init, rename: rename, listCollections: listCollections}; })(); - var transitions = {init: {rename: 1}, rename: {rename: 1}}; + var transitions = { + init: {rename: 1}, + rename: {rename: 0.9, listCollections: 0.1}, + listCollections: {rename: 1}, + }; return { threadCount: 10, @@ -48,5 +65,4 @@ var $config = (function() { states: states, transitions: transitions, }; - })();
    • Sprint:
      Execution Team 2019-07-15, Execution Team 2019-07-29
    • Linked BF Score:
      54

      Description

      listCollections may not see all active UUIDs. This breaks a key invariant required for initial sync.

        Attachments

          Issue Links

            Activity

              People

              • Votes:
                0 Vote for this issue
                Watchers:
                8 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: