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

ReshardingOplogSessionApplication clones retryable applyOps session info with admin.$cmd as affectedNamespace

    • Type: Icon: Bug Bug
    • Resolution: Fixed
    • Priority: Icon: Major - P3 Major - P3
    • 8.1.0-rc0, 8.0.4
    • Affects Version/s: None
    • Component/s: None
    • None
    • Cluster Scalability
    • Fully Compatible
    • ALL
    • v8.0
    • 200

      When resharding clones the retryable write session info to a recipient, the TransactionParticipant's affectedNamespaces is cloned over as "admin.$cmd", rather than the actual collection name that received the write.

      The following is observed:
      1. Resharding starts
      2. A batched insert (with featureFlagReplicateVectoredInsertsTransactionally enabled) to the donor shard produces the following opLog entry:

      {
          lsid: {
            id: new UUID("b1cc56c0-5e8e-4d2b-8214-b57862671656"),
            uid: Binary(Buffer.from("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "hex"), 0)
          },
          txnNumber: Long("0"),
          op: 'c',
          ns: 'admin.$cmd',
          o: {
            applyOps: [
              {
                op: 'i',
                ns: 'test.foo',
                ui: new UUID("e261a21a-d619-4a2a-bdda-8ab97a704abc"),
                o: { _id: ObjectId("6708f8bfeca9cf5157b53d81"), a: 1, x: -1 },
                o2: { x: -1, _id: ObjectId("6708f8bfeca9cf5157b53d81") },
                destinedRecipient: 'repro-bf-35320-2-rs1',
                stmtId: 0
              },
              {
                op: 'i',
                ns: 'test.foo',
                ui: new UUID("e261a21a-d619-4a2a-bdda-8ab97a704abc"),
                o: { _id: ObjectId("6708f8bfeca9cf5157b53d82"), a: 2, x: -1 },
                o2: { x: -1, _id: ObjectId("6708f8bfeca9cf5157b53d82") },
                destinedRecipient: 'repro-bf-35320-2-rs1',
                stmtId: 1
              }
            ]
          },
          ts: Timestamp({ t: 1728641215, i: 5 }),
          t: Long("1"),
          v: Long("2"),
          wall: ISODate("2024-10-11T10:06:55.618Z"),
          prevOpTime: { ts: Timestamp({ t: 0, i: 0 }), t: Long("-1") },
          multiOpType: 1
        }
      

      3. Resharding clones this session info to the recipient and produces the following oplog entry (notice the o2.ns field is "admin.$cmd") :

      {
          lsid: {
            id: new UUID("b1cc56c0-5e8e-4d2b-8214-b57862671656"),
            uid: Binary(Buffer.from("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "hex"), 0)
          },
          txnNumber: Long("0"),
          op: 'n',
          ns: 'admin.$cmd',
          o: { '$sessionMigrateInfo': 1 },
          o2: {
            lsid: {
              id: new UUID("b1cc56c0-5e8e-4d2b-8214-b57862671656"),
              uid: Binary(Buffer.from("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "hex"), 0)
            },
            txnNumber: Long("0"),
            op: 'c',
            ns: 'admin.$cmd',
            o: {
              applyOps: [
                {
                  op: 'i',
                  ns: 'test.foo',
                  ui: new UUID("e261a21a-d619-4a2a-bdda-8ab97a704abc"),
                  o: { _id: ObjectId("6708f8bfeca9cf5157b53d81"), a: 1, x: -1 },
                  o2: { x: -1, _id: ObjectId("6708f8bfeca9cf5157b53d81") },
                  destinedRecipient: 'repro-bf-35320-2-rs1',
                  stmtId: 0
                },
                {
                  op: 'i',
                  ns: 'test.foo',
                  ui: new UUID("e261a21a-d619-4a2a-bdda-8ab97a704abc"),
                  o: { _id: ObjectId("6708f8bfeca9cf5157b53d82"), a: 2, x: -1 },
                  o2: { x: -1, _id: ObjectId("6708f8bfeca9cf5157b53d82") },
                  destinedRecipient: 'repro-bf-35320-2-rs1',
                  stmtId: 1
                }
              ]
            },
            ts: Timestamp({ t: 1728641215, i: 5 }),
            t: Long("1"),
            v: Long("2"),
            wall: ISODate("2024-10-11T10:06:55.618Z"),
            prevOpTime: { ts: Timestamp({ t: 0, i: 0 }), t: Long("-1") },
            multiOpType: 1,
            _id: {
              clusterTime: Timestamp({ t: 1728641215, i: 5 }),
              ts: Timestamp({ t: 1728641215, i: 5 })
            }
          },
          stmtId: [ 0, 1 ],
          fromMigrate: true,
          ts: Timestamp({ t: 1728641216, i: 8 }),
          t: Long("1"),
          v: Long("2"),
          wall: ISODate("2024-10-11T10:06:56.298Z"),
          prevOpTime: { ts: Timestamp({ t: 0, i: 0 }), t: Long("-1") }
        }
      

      4. If at a later time the recipient shard needs to follow this session's oplog chain to reconstruct a TransactionParticipant's state, it will add "admin.$cmd" as affectedNamespace, instead of the original namespace (test.foo in this case). This is because when TransactionParticipant processes the entry in (3), it will observe that entry.getNss() (o2.ns) is "admin.$cmd".

            Assignee:
            jack.mulrow@mongodb.com Jack Mulrow
            Reporter:
            jordi.serra-torrens@mongodb.com Jordi Serra Torrens
            Votes:
            0 Vote for this issue
            Watchers:
            14 Start watching this issue

              Created:
              Updated:
              Resolved: