text: /**
   * Test that a migration will:
   * 1. Ignore multi-statement transaction prepare conflicts in the clone phase, and
   * 2. Pick up the changes for prepared transactions in the transfer mods phase.
   *
   * @tags: [uses_transactions, uses_prepare_transaction]
   */
  
  (function() {
  "use strict";
  load('jstests/libs/chunk_manipulation_util.js');
  load('jstests/sharding/libs/sharded_transactions_helpers.js');
  
  const dbName = "test";
  const collName = "user";
  
  const staticMongod = MongoRunner.runMongod({});  // For startParallelOps.
  
  const st = new ShardingTest({shards: {rs0: {nodes: 1}, rs1: {nodes: 1}}});
  st.adminCommand({enableSharding: 'test'});
  st.ensurePrimaryShard('test', st.shard0.shardName);
  st.adminCommand({shardCollection: 'test.user', key: {_id: 1}});
  
  const session = st.s.startSession({causalConsistency: false});
  const sessionDB = session.getDatabase(dbName);
  const sessionColl = sessionDB.getCollection(collName);
  
  assert.commandWorked(sessionColl.insert({_id: 1}));
  
  const lsid = {
      id: UUID()
  };
  const txnNumber = 0;
  const stmtId = 0;
  
  assert.commandWorked(st.s0.getDB(dbName).runCommand({
      insert: collName,
      documents: [{_id: 2}, {_id: 5}, {_id: 15}],
      lsid: lsid,
      txnNumber: NumberLong(txnNumber),
      stmtId: NumberInt(stmtId),
      startTransaction: true,
      autocommit: false,
  }));
  
  const res = assert.commandWorked(st.shard0.getDB(dbName).adminCommand({
      prepareTransaction: 1,
      lsid: lsid,
      txnNumber: NumberLong(txnNumber),
      autocommit: false,
  }));
  
  const joinMoveChunk =
      moveChunkParallel(staticMongod, st.s.host, {_id: 1}, null, 'test.user', st.shard1.shardName);
  
  // Wait for catchup to verify that the migration has exited the clone phase.
  waitForMigrateStep(st.shard1, migrateStepNames.catchup);
  
  assert.commandWorked(st.shard0.getDB(dbName).adminCommand({
      commitTransaction: 1,
      lsid: lsid,
      txnNumber: NumberLong(txnNumber),
      autocommit: false,
      commitTimestamp: res.prepareTimestamp,
  }));
  
  joinMoveChunk();
  
  assert.eq(sessionColl.find({_id: 2}).count(), 1);
  
  st.stop();
  MongoRunner.stopMongod(staticMongod);
  })();
  