diff options
Diffstat (limited to 'src/mongo/db/repl/sync_tail_test.cpp')
-rw-r--r-- | src/mongo/db/repl/sync_tail_test.cpp | 281 |
1 files changed, 184 insertions, 97 deletions
diff --git a/src/mongo/db/repl/sync_tail_test.cpp b/src/mongo/db/repl/sync_tail_test.cpp index 35b07187677..95c981f6ead 100644 --- a/src/mongo/db/repl/sync_tail_test.cpp +++ b/src/mongo/db/repl/sync_tail_test.cpp @@ -406,8 +406,9 @@ DEATH_TEST_F(SyncTailTest, MultiApplyAbortsWhenNoOperationsAreGiven, "!ops.empty getConsistencyMarkers(), getStorageInterface(), noopApplyOperationFn, - writerPool.get()); - syncTail.multiApply(_opCtx.get(), {}, boost::none).getStatus().ignore(); + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); + syncTail.multiApply(_opCtx.get(), {}).getStatus().ignore(); } bool _testOplogEntryIsForCappedCollection(OperationContext* opCtx, @@ -431,9 +432,13 @@ bool _testOplogEntryIsForCappedCollection(OperationContext* opCtx, auto op = makeInsertDocumentOplogEntry({Timestamp(Seconds(1), 0), 1LL}, nss, BSON("a" << 1)); ASSERT_FALSE(op.isForCappedCollection); - SyncTail syncTail( - nullptr, consistencyMarkers, storageInterface, applyOperationFn, writerPool.get()); - auto lastOpTime = unittest::assertGet(syncTail.multiApply(opCtx, {op}, boost::none)); + SyncTail syncTail(nullptr, + consistencyMarkers, + storageInterface, + applyOperationFn, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); + auto lastOpTime = unittest::assertGet(syncTail.multiApply(opCtx, {op})); ASSERT_EQUALS(op.getOpTime(), lastOpTime); ASSERT_EQUALS(1U, operationsApplied.size()); @@ -467,7 +472,12 @@ TEST_F(SyncTailTest, MultiSyncApplyUsesSyncApplyToApplyOperation) { MultiApplier::OperationPtrs ops = {&op}; WorkerMultikeyPathInfo pathInfo; - SyncTail syncTail(nullptr, nullptr, nullptr, {}, nullptr); + SyncTail syncTail(nullptr, + nullptr, + nullptr, + {}, + nullptr, + OplogApplier::Options(OplogApplication::Mode::kSecondary)); ASSERT_OK(multiSyncApply(_opCtx.get(), &ops, &syncTail, &pathInfo)); // Collection should be created after SyncTail::syncApply() processes operation. ASSERT_TRUE(AutoGetCollectionForReadCommand(_opCtx.get(), nss).getCollection()); @@ -590,14 +600,18 @@ private: }; TEST_F(MultiOplogEntrySyncTailTest, MultiApplyUnpreparedTransactionSeparate) { - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, _writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + _writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); // Apply a batch with only the first operation. This should result in the first oplog entry // being put in the oplog and updating the transaction table, but not actually being applied // because they are part of a pending transaction. const auto expectedStartOpTime = _insertOp1->getOpTime(); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp1}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp1})); ASSERT_EQ(1U, oplogDocs().size()); ASSERT_BSONOBJ_EQ(oplogDocs().back(), _insertOp1->getRaw()); ASSERT_TRUE(_insertedDocs[_nss1].empty()); @@ -612,7 +626,7 @@ TEST_F(MultiOplogEntrySyncTailTest, MultiApplyUnpreparedTransactionSeparate) { // Apply a batch with only the second operation. This should result in the second oplog entry // being put in the oplog, but with no effect because the operation is part of a pending // transaction. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp2}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp2})); ASSERT_EQ(2U, oplogDocs().size()); ASSERT_BSONOBJ_EQ(oplogDocs().back(), _insertOp2->getRaw()); ASSERT_TRUE(_insertedDocs[_nss1].empty()); @@ -628,7 +642,7 @@ TEST_F(MultiOplogEntrySyncTailTest, MultiApplyUnpreparedTransactionSeparate) { // Apply a batch with only the commit. This should result in the commit being put in the // oplog, and the two previous entries being applied. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitOp})); ASSERT_EQ(3U, oplogDocs().size()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); ASSERT_EQ(2U, _insertedDocs[_nss2].size()); @@ -644,7 +658,7 @@ TEST_F(MultiOplogEntrySyncTailTest, MultiApplyUnpreparedTransactionSeparate) { TEST_F(MultiOplogEntrySyncTailTest, MultiApplyUnpreparedTransactionAllAtOnce) { // Skipping writes to oplog proves we're testing the code path which does not rely on reading // the oplog. - OplogApplier::Options applierOpts; + OplogApplier::Options applierOpts(OplogApplication::Mode::kSecondary); applierOpts.skipWritesToOplog = true; SyncTail syncTail(nullptr, getConsistencyMarkers(), @@ -655,8 +669,7 @@ TEST_F(MultiOplogEntrySyncTailTest, MultiApplyUnpreparedTransactionAllAtOnce) { // Apply both inserts and the commit in a single batch. We expect no oplog entries to // be inserted (because we've set skipWritesToOplog), and both entries to be committed. - ASSERT_OK( - syncTail.multiApply(_opCtx.get(), {*_insertOp1, *_insertOp2, *_commitOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp1, *_insertOp2, *_commitOp})); ASSERT_EQ(0U, oplogDocs().size()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); ASSERT_EQ(2U, _insertedDocs[_nss2].size()); @@ -704,13 +717,17 @@ TEST_F(MultiOplogEntrySyncTailTest, MultiApplyUnpreparedTransactionTwoBatches) { StmtId(4), insertOps.back().getOpTime()); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, _writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + _writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); // Insert the first entry in its own batch. This should result in the oplog entry being written // but the entry should not be applied as it is part of a pending transaction. const auto expectedStartOpTime = insertOps[0].getOpTime(); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOps[0]}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOps[0]})); ASSERT_EQ(1U, oplogDocs().size()); ASSERT_EQ(0U, _insertedDocs[_nss1].size()); ASSERT_EQ(0U, _insertedDocs[_nss2].size()); @@ -723,8 +740,8 @@ TEST_F(MultiOplogEntrySyncTailTest, MultiApplyUnpreparedTransactionTwoBatches) { // Insert the rest of the entries, including the commit. These entries should be added to the // oplog, and all the entries including the first should be applied. - ASSERT_OK(syncTail.multiApply( - _opCtx.get(), {insertOps[1], insertOps[2], insertOps[3], commitOp}, boost::none)); + ASSERT_OK( + syncTail.multiApply(_opCtx.get(), {insertOps[1], insertOps[2], insertOps[3], commitOp})); ASSERT_EQ(5U, oplogDocs().size()); ASSERT_EQ(3U, _insertedDocs[_nss1].size()); ASSERT_EQ(1U, _insertedDocs[_nss2].size()); @@ -836,8 +853,12 @@ TEST_F(MultiOplogEntrySyncTailTest, MultiApplyTwoTransactionsOneBatch) { StmtId(2), insertOps2.back().getOpTime()); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, _writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + _writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); // Note the insert counter so we can check it later. It is necessary to use opCounters as // inserts are idempotent so we will not detect duplicate inserts just by checking inserts in @@ -847,8 +868,7 @@ TEST_F(MultiOplogEntrySyncTailTest, MultiApplyTwoTransactionsOneBatch) { // once. ASSERT_OK(syncTail.multiApply( _opCtx.get(), - {insertOps1[0], insertOps1[1], commitOp1, insertOps2[0], insertOps2[1], commitOp2}, - boost::none)); + {insertOps1[0], insertOps1[1], commitOp1, insertOps2[0], insertOps2[1], commitOp2})); ASSERT_EQ(6U, oplogDocs().size()); ASSERT_EQ(4, replOpCounters.getInsert()->load() - insertsBefore); ASSERT_EQ(4U, _insertedDocs[_nss1].size()); @@ -950,14 +970,18 @@ private: }; TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionSteadyState) { - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, _writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + _writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); // Apply a batch with the insert operations. This should result in the oplog entries // being put in the oplog and updating the transaction table, but not actually being applied // because they are part of a pending transaction. const auto expectedStartOpTime = _insertOp1->getOpTime(); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp1, *_insertOp2}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp1, *_insertOp2})); ASSERT_EQ(2U, oplogDocs().size()); ASSERT_BSONOBJ_EQ(_insertOp1->getRaw(), oplogDocs()[0]); ASSERT_BSONOBJ_EQ(_insertOp2->getRaw(), oplogDocs()[1]); @@ -973,7 +997,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionStea // Apply a batch with only the prepare. This should result in the prepare being put in the // oplog, and the two previous entries being applied (but in a transaction) along with the // nested insert in the prepare oplog entry. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_prepareWithPrevOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_prepareWithPrevOp})); ASSERT_EQ(3U, oplogDocs().size()); ASSERT_BSONOBJ_EQ(_prepareWithPrevOp->getRaw(), oplogDocs().back()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); @@ -987,7 +1011,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionStea // Apply a batch with only the commit. This should result in the commit being put in the // oplog, and the three previous entries being committed. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitPrepareWithPrevOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitPrepareWithPrevOp})); ASSERT_BSONOBJ_EQ(_commitPrepareWithPrevOp->getRaw(), oplogDocs().back()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); ASSERT_EQ(2U, _insertedDocs[_nss2].size()); @@ -1000,14 +1024,18 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionStea } TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyAbortPreparedTransactionCheckTxnTable) { - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, _writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + _writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); // Apply a batch with the insert operations. This should result in the oplog entries // being put in the oplog and updating the transaction table, but not actually being applied // because they are part of a pending transaction. const auto expectedStartOpTime = _insertOp1->getOpTime(); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp1, *_insertOp2}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp1, *_insertOp2})); checkTxnTable(_lsid, _txnNum, _insertOp1->getOpTime(), @@ -1018,7 +1046,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyAbortPreparedTransactio // Apply a batch with only the prepare. This should result in the prepare being put in the // oplog, and the two previous entries being applied (but in a transaction) along with the // nested insert in the prepare oplog entry. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_prepareWithPrevOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_prepareWithPrevOp})); checkTxnTable(_lsid, _txnNum, _prepareWithPrevOp->getOpTime(), @@ -1028,7 +1056,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyAbortPreparedTransactio // Apply a batch with only the abort. This should result in the abort being put in the // oplog and the transaction table being updated accordingly. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_abortPrepareWithPrevOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_abortPrepareWithPrevOp})); ASSERT_BSONOBJ_EQ(_abortPrepareWithPrevOp->getRaw(), oplogDocs().back()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); ASSERT_EQ(2U, _insertedDocs[_nss2].size()); @@ -1052,8 +1080,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionInit // being put in the oplog and updating the transaction table, but not actually being applied // because they are part of a pending transaction. const auto expectedStartOpTime = _insertOp1->getOpTime(); - ASSERT_OK(syncTail.multiApply( - _opCtx.get(), {*_insertOp1, *_insertOp2}, OplogApplication::Mode::kInitialSync)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp1, *_insertOp2})); ASSERT_EQ(2U, oplogDocs().size()); ASSERT_BSONOBJ_EQ(_insertOp1->getRaw(), oplogDocs()[0]); ASSERT_BSONOBJ_EQ(_insertOp2->getRaw(), oplogDocs()[1]); @@ -1068,8 +1095,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionInit // Apply a batch with only the prepare applyOps. This should result in the prepare being put in // the oplog, but, since this is initial sync, nothing else. - ASSERT_OK(syncTail.multiApply( - _opCtx.get(), {*_prepareWithPrevOp}, OplogApplication::Mode::kInitialSync)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_prepareWithPrevOp})); ASSERT_EQ(3U, oplogDocs().size()); ASSERT_BSONOBJ_EQ(_prepareWithPrevOp->getRaw(), oplogDocs().back()); ASSERT_TRUE(_insertedDocs[_nss1].empty()); @@ -1083,8 +1109,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionInit // Apply a batch with only the commit. This should result in the commit being put in the // oplog, and the three previous entries being applied. - ASSERT_OK(syncTail.multiApply( - _opCtx.get(), {*_commitPrepareWithPrevOp}, OplogApplication::Mode::kInitialSync)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitPrepareWithPrevOp})); ASSERT_BSONOBJ_EQ(_commitPrepareWithPrevOp->getRaw(), oplogDocs().back()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); ASSERT_EQ(2U, _insertedDocs[_nss2].size()); @@ -1119,7 +1144,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionReco // Apply a batch with the insert operations. This should have no effect, because this is // recovery. const auto expectedStartOpTime = _insertOp1->getOpTime(); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp1, *_insertOp2}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_insertOp1, *_insertOp2})); ASSERT_TRUE(oplogDocs().empty()); ASSERT_TRUE(_insertedDocs[_nss1].empty()); ASSERT_TRUE(_insertedDocs[_nss2].empty()); @@ -1132,7 +1157,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionReco // Apply a batch with only the prepare applyOps. This should have no effect, since this is // recovery. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_prepareWithPrevOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_prepareWithPrevOp})); ASSERT_TRUE(oplogDocs().empty()); ASSERT_TRUE(_insertedDocs[_nss1].empty()); ASSERT_TRUE(_insertedDocs[_nss2].empty()); @@ -1145,7 +1170,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionReco // Apply a batch with only the commit. This should result in the the three previous entries // being applied. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitPrepareWithPrevOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitPrepareWithPrevOp})); ASSERT_TRUE(oplogDocs().empty()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); ASSERT_EQ(2U, _insertedDocs[_nss2].size()); @@ -1158,14 +1183,18 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionReco } TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplySingleApplyOpsPreparedTransaction) { - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, _writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + _writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); const auto expectedStartOpTime = _singlePrepareApplyOp->getOpTime(); // Apply a batch with only the prepare applyOps. This should result in the prepare being put in // the oplog, and the nested insert being applied (but in a transaction). - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_singlePrepareApplyOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_singlePrepareApplyOp})); ASSERT_EQ(1U, oplogDocs().size()); ASSERT_BSONOBJ_EQ(_singlePrepareApplyOp->getRaw(), oplogDocs().back()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); @@ -1178,7 +1207,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplySingleApplyOpsPreparedT // Apply a batch with only the commit. This should result in the commit being put in the // oplog, and prepared insert being committed. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitSinglePrepareApplyOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitSinglePrepareApplyOp})); ASSERT_BSONOBJ_EQ(_commitSinglePrepareApplyOp->getRaw(), oplogDocs().back()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); ASSERT_TRUE(_insertedDocs[_nss2].empty()); @@ -1191,8 +1220,12 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplySingleApplyOpsPreparedT } TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyEmptyApplyOpsPreparedTransaction) { - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, _writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + _writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); auto emptyPrepareApplyOp = makeCommandOplogEntryWithSessionInfoAndStmtId( {Timestamp(Seconds(1), 3), 1LL}, @@ -1206,7 +1239,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyEmptyApplyOpsPreparedTr // Apply a batch with only the prepare applyOps. This should result in the prepare being put in // the oplog, and the nested insert being applied (but in a transaction). - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {emptyPrepareApplyOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {emptyPrepareApplyOp})); ASSERT_EQ(1U, oplogDocs().size()); ASSERT_BSONOBJ_EQ(emptyPrepareApplyOp.getRaw(), oplogDocs().back()); ASSERT_TRUE(_insertedDocs[_nss1].empty()); @@ -1219,7 +1252,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyEmptyApplyOpsPreparedTr // Apply a batch with only the commit. This should result in the commit being put in the // oplog, and prepared insert being committed. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitSinglePrepareApplyOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitSinglePrepareApplyOp})); ASSERT_BSONOBJ_EQ(_commitSinglePrepareApplyOp->getRaw(), oplogDocs().back()); ASSERT_TRUE(_insertedDocs[_nss1].empty()); ASSERT_TRUE(_insertedDocs[_nss2].empty()); @@ -1232,13 +1265,17 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyEmptyApplyOpsPreparedTr } TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyAbortSingleApplyOpsPreparedTransaction) { - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, _writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + _writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); const auto expectedStartOpTime = _singlePrepareApplyOp->getOpTime(); // Apply a batch with only the prepare applyOps. This should result in the prepare being put in // the oplog, and the nested insert being applied (but in a transaction). - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_singlePrepareApplyOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_singlePrepareApplyOp})); checkTxnTable(_lsid, _txnNum, _singlePrepareApplyOp->getOpTime(), @@ -1248,7 +1285,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyAbortSingleApplyOpsPrep // Apply a batch with only the abort. This should result in the abort being put in the // oplog and the transaction table being updated accordingly. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_abortSinglePrepareApplyOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_abortSinglePrepareApplyOp})); ASSERT_BSONOBJ_EQ(_abortSinglePrepareApplyOp->getRaw(), oplogDocs().back()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); ASSERT_TRUE(_insertedDocs[_nss2].empty()); @@ -1273,8 +1310,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, // Apply a batch with only the prepare applyOps. This should result in the prepare being put in // the oplog, but, since this is initial sync, nothing else. - ASSERT_OK(syncTail.multiApply( - _opCtx.get(), {*_singlePrepareApplyOp}, OplogApplication::Mode::kInitialSync)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_singlePrepareApplyOp})); ASSERT_EQ(1U, oplogDocs().size()); ASSERT_BSONOBJ_EQ(_singlePrepareApplyOp->getRaw(), oplogDocs().back()); ASSERT_TRUE(_insertedDocs[_nss1].empty()); @@ -1288,8 +1324,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, // Apply a batch with only the commit. This should result in the commit being put in the // oplog, and the previous entry being applied. - ASSERT_OK(syncTail.multiApply( - _opCtx.get(), {*_commitSinglePrepareApplyOp}, OplogApplication::Mode::kInitialSync)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitSinglePrepareApplyOp})); ASSERT_BSONOBJ_EQ(_commitSinglePrepareApplyOp->getRaw(), oplogDocs().back()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); ASSERT_TRUE(_insertedDocs[_nss2].empty()); @@ -1325,7 +1360,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, // Apply a batch with only the prepare applyOps. This should have no effect, since this is // recovery. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_singlePrepareApplyOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_singlePrepareApplyOp})); ASSERT_TRUE(oplogDocs().empty()); ASSERT_TRUE(_insertedDocs[_nss1].empty()); ASSERT_TRUE(_insertedDocs[_nss2].empty()); @@ -1338,7 +1373,7 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, // Apply a batch with only the commit. This should result in the previous entry being // applied. - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitSinglePrepareApplyOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {*_commitSinglePrepareApplyOp})); ASSERT_TRUE(oplogDocs().empty()); ASSERT_EQ(1U, _insertedDocs[_nss1].size()); ASSERT_TRUE(_insertedDocs[_nss2].empty()); @@ -1353,7 +1388,12 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, void testWorkerMultikeyPaths(OperationContext* opCtx, const OplogEntry& op, unsigned long numPaths) { - SyncTail syncTail(nullptr, nullptr, nullptr, {}, nullptr); + SyncTail syncTail(nullptr, + nullptr, + nullptr, + {}, + nullptr, + OplogApplier::Options(OplogApplication::Mode::kSecondary)); WorkerMultikeyPathInfo pathInfo; MultiApplier::OperationPtrs ops = {&op}; ASSERT_OK(multiSyncApply(opCtx, &ops, &syncTail, &pathInfo)); @@ -1409,7 +1449,12 @@ TEST_F(SyncTailTest, MultiSyncApplyAddsMultipleWorkerMultikeyPathInfo) { auto opA = makeInsertDocumentOplogEntry({Timestamp(Seconds(4), 0), 1LL}, nss, docA); auto docB = BSON("_id" << 2 << "b" << BSON_ARRAY(6 << 7)); auto opB = makeInsertDocumentOplogEntry({Timestamp(Seconds(5), 0), 1LL}, nss, docB); - SyncTail syncTail(nullptr, nullptr, nullptr, {}, nullptr); + SyncTail syncTail(nullptr, + nullptr, + nullptr, + {}, + nullptr, + OplogApplier::Options(OplogApplication::Mode::kSecondary)); WorkerMultikeyPathInfo pathInfo; MultiApplier::OperationPtrs ops = {&opA, &opB}; ASSERT_OK(multiSyncApply(_opCtx.get(), &ops, &syncTail, &pathInfo)); @@ -1452,7 +1497,12 @@ TEST_F(SyncTailTest, MultiSyncApplyFailsWhenCollectionCreationTriesToMakeUUID) { NamespaceString nss("foo." + _agent.getSuiteName() + "_" + _agent.getTestName()); auto op = makeCreateCollectionOplogEntry({Timestamp(Seconds(1), 0), 1LL}, nss); - SyncTail syncTail(nullptr, nullptr, nullptr, {}, nullptr); + SyncTail syncTail(nullptr, + nullptr, + nullptr, + {}, + nullptr, + OplogApplier::Options(OplogApplication::Mode::kSecondary)); MultiApplier::OperationPtrs ops = {&op}; ASSERT_EQUALS(ErrorCodes::InvalidOptions, multiSyncApply(_opCtx.get(), &ops, &syncTail, nullptr)); @@ -1936,7 +1986,7 @@ DEATH_TEST_F(SyncTailTest, return Status::OK(); }; auto writerPool = OplogApplier::makeWriterPool(); - OplogApplier::Options options; + OplogApplier::Options options(OplogApplication::Mode::kSecondary); SyncTail syncTail(nullptr, // observer. not required by oplogApplication(). _consistencyMarkers.get(), getStorageInterface(), @@ -2555,9 +2605,13 @@ TEST_F(SyncTailTxnTableTest, SimpleWriteWithTxn) { date); auto writerPool = OplogApplier::makeWriterPool(); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, writerPool.get()); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOp}, boost::none)); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOp})); checkTxnTable(sessionInfo, {Timestamp(1, 0), 1}, date); } @@ -2586,9 +2640,13 @@ TEST_F(SyncTailTxnTableTest, WriteWithTxnMixedWithDirectWriteToTxnTable) { Date_t::now()); auto writerPool = OplogApplier::makeWriterPool(); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, writerPool.get()); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOp, deleteOp}, boost::none)); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOp, deleteOp})); ASSERT_FALSE(docExists( _opCtx.get(), @@ -2630,9 +2688,13 @@ TEST_F(SyncTailTxnTableTest, InterleavedWriteWithTxnMixedWithDirectDeleteToTxnTa date); auto writerPool = OplogApplier::makeWriterPool(); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, writerPool.get()); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOp, deleteOp, insertOp2}, boost::none)); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOp, deleteOp, insertOp2})); checkTxnTable(sessionInfo, {Timestamp(3, 0), 2}, date); } @@ -2662,9 +2724,13 @@ TEST_F(SyncTailTxnTableTest, InterleavedWriteWithTxnMixedWithDirectUpdateToTxnTa Date_t::now()); auto writerPool = OplogApplier::makeWriterPool(); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, writerPool.get()); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOp, updateOp}, boost::none)); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOp, updateOp})); checkTxnTable(sessionInfo, newWriteOpTime, date); } @@ -2722,11 +2788,14 @@ TEST_F(SyncTailTxnTableTest, RetryableWriteThenMultiStatementTxnWriteOnSameSessi txnInsertOpTime); auto writerPool = OplogApplier::makeWriterPool(); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); - ASSERT_OK(syncTail.multiApply( - _opCtx.get(), {retryableInsertOp, txnInsertOp, txnCommitOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {retryableInsertOp, txnInsertOp, txnCommitOp})); repl::checkTxnTable(_opCtx.get(), *sessionInfo.getSessionId(), @@ -2789,11 +2858,14 @@ TEST_F(SyncTailTxnTableTest, MultiStatementTxnWriteThenRetryableWriteOnSameSessi date); auto writerPool = OplogApplier::makeWriterPool(); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); - ASSERT_OK(syncTail.multiApply( - _opCtx.get(), {txnInsertOp, txnCommitOp, retryableInsertOp}, boost::none)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {txnInsertOp, txnCommitOp, retryableInsertOp})); repl::checkTxnTable(_opCtx.get(), *sessionInfo.getSessionId(), @@ -2854,12 +2926,15 @@ TEST_F(SyncTailTxnTableTest, MultiApplyUpdatesTheTransactionTable) { {Timestamp(Seconds(7), 0), 1LL}, ns3, BSON("_id" << 0), info); auto writerPool = OplogApplier::makeWriterPool(); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, writerPool.get()); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); ASSERT_OK(syncTail.multiApply( _opCtx.get(), - {opSingle, opDiffTxnSmaller, opDiffTxnLarger, opSameTxnSooner, opSameTxnLater, opNoTxn}, - boost::none)); + {opSingle, opDiffTxnSmaller, opDiffTxnLarger, opSameTxnSooner, opSameTxnLater, opNoTxn})); // The txnNum and optime of the only write were saved. auto resultSingleDoc = @@ -2929,9 +3004,13 @@ TEST_F(SyncTailTxnTableTest, SessionMigrationNoOpEntriesShouldUpdateTxnTable) { outerInsertDate); auto writerPool = OplogApplier::makeWriterPool(); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, writerPool.get()); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOplog}, boost::none)); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {insertOplog})); checkTxnTable(insertSessionInfo, {Timestamp(40, 0), 1}, outerInsertDate); } @@ -2952,9 +3031,13 @@ TEST_F(SyncTailTxnTableTest, PreImageNoOpEntriesShouldNotUpdateTxnTable) { preImageDate); auto writerPool = OplogApplier::makeWriterPool(); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, writerPool.get()); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {preImageOplog}, boost::none)); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {preImageOplog})); ASSERT_FALSE(docExists(_opCtx.get(), NamespaceString::kSessionTransactionsTableNamespace, @@ -2977,9 +3060,13 @@ TEST_F(SyncTailTxnTableTest, NonMigrateNoOpEntriesShouldNotUpdateTxnTable) { Date_t::now()); auto writerPool = OplogApplier::makeWriterPool(); - SyncTail syncTail( - nullptr, getConsistencyMarkers(), getStorageInterface(), multiSyncApply, writerPool.get()); - ASSERT_OK(syncTail.multiApply(_opCtx.get(), {oplog}, boost::none)); + SyncTail syncTail(nullptr, + getConsistencyMarkers(), + getStorageInterface(), + multiSyncApply, + writerPool.get(), + OplogApplier::Options(OplogApplication::Mode::kSecondary)); + ASSERT_OK(syncTail.multiApply(_opCtx.get(), {oplog})); ASSERT_FALSE(docExists( _opCtx.get(), |