86 lines
2.8 KiB
JavaScript
86 lines
2.8 KiB
JavaScript
/**
|
|
* Tests that session information are properly transferred to the destination shard while
|
|
* new writes are being sent to the source shard.
|
|
*/
|
|
|
|
load('./jstests/libs/chunk_manipulation_util.js');
|
|
|
|
/**
|
|
* Test outline:
|
|
* 1. Pause migration.
|
|
* 2. Perform writes and allow it to be capture via OpObserver
|
|
* 3. Unpause migration.
|
|
* 4. Retry writes and confirm that writes are not duplicated.
|
|
*/
|
|
(function() {
|
|
"use strict";
|
|
|
|
load("jstests/libs/retryable_writes_util.js");
|
|
|
|
if (!RetryableWritesUtil.storageEngineSupportsRetryableWrites(jsTest.options().storageEngine)) {
|
|
jsTestLog("Retryable writes are not supported, skipping test");
|
|
return;
|
|
}
|
|
|
|
var staticMongod = MongoRunner.runMongod({}); // For startParallelOps.
|
|
|
|
var 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: {x: 1}});
|
|
|
|
pauseMoveChunkAtStep(st.shard0, moveChunkStepNames.reachedSteadyState);
|
|
var joinMoveChunk =
|
|
moveChunkParallel(staticMongod, st.s.host, {x: 0}, null, 'test.user', st.shard1.shardName);
|
|
|
|
waitForMoveChunkStep(st.shard0, moveChunkStepNames.reachedSteadyState);
|
|
|
|
var insertCmd = {
|
|
insert: 'user',
|
|
documents: [{x: 10}, {x: 30}],
|
|
ordered: false,
|
|
lsid: {id: UUID()},
|
|
txnNumber: NumberLong(34),
|
|
};
|
|
|
|
var testDB = st.getDB('test');
|
|
var insertResult = assert.commandWorked(testDB.runCommand(insertCmd));
|
|
|
|
var findAndModCmd = {
|
|
findAndModify: 'user',
|
|
query: {x: 30},
|
|
update: {$inc: {y: 1}},
|
|
new: true,
|
|
upsert: true,
|
|
lsid: {id: UUID()},
|
|
txnNumber: NumberLong(37),
|
|
};
|
|
|
|
var findAndModifyResult = assert.commandWorked(testDB.runCommand(findAndModCmd));
|
|
|
|
unpauseMoveChunkAtStep(st.shard0, moveChunkStepNames.reachedSteadyState);
|
|
joinMoveChunk();
|
|
|
|
var insertRetryResult = assert.commandWorked(testDB.runCommand(insertCmd));
|
|
|
|
assert.eq(insertResult.ok, insertRetryResult.ok);
|
|
assert.eq(insertResult.n, insertRetryResult.n);
|
|
assert.eq(insertResult.writeErrors, insertRetryResult.writeErrors);
|
|
assert.eq(insertResult.writeConcernErrors, insertRetryResult.writeConcernErrors);
|
|
|
|
assert.eq(1, testDB.user.find({x: 10}).itcount());
|
|
assert.eq(1, testDB.user.find({x: 30}).itcount());
|
|
|
|
var findAndModifyRetryResult = assert.commandWorked(testDB.runCommand(findAndModCmd));
|
|
|
|
assert.eq(findAndModifyResult.ok, findAndModifyRetryResult.ok);
|
|
assert.eq(findAndModifyResult.value, findAndModifyRetryResult.value);
|
|
assert.eq(findAndModifyResult.lastErrorObject, findAndModifyRetryResult.lastErrorObject);
|
|
|
|
assert.eq(1, testDB.user.findOne({x: 30}).y);
|
|
|
|
st.stop();
|
|
|
|
MongoRunner.stopMongod(staticMongod);
|
|
})();
|