Skip to content

Commit 8ecb0d8

Browse files
moustafamaherEvergreen Agent
authored andcommitted
SERVER-80363 server default writeConcern is not honored when wtimeout is set
1 parent e1298b7 commit 8ecb0d8

20 files changed

+630
-222
lines changed

jstests/noPassthrough/server_write_concern_metrics.js

Lines changed: 83 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
// Tests writeConcern metrics in the serverStatus output.
1+
// Tests writeConcern metrics in the serverStatus output for a replica set.
22
// @tags: [
33
// requires_persistence,
44
// requires_replication,
55
// ]
66
// Verifies that the server status response has the fields that we expect.
7-
function verifyServerStatusFields(serverStatusResponse) {
7+
export function verifyServerStatusFields(serverStatusResponse) {
88
assert(serverStatusResponse.hasOwnProperty("opWriteConcernCounters"),
99
"Expected the serverStatus response to have a 'opWriteConcernCounters' field\n" +
1010
tojson(serverStatusResponse));
@@ -21,7 +21,7 @@ function verifyServerStatusFields(serverStatusResponse) {
2121

2222
// Verifies that the given path of the server status response is incremented in the way we
2323
// expect, and no other changes occurred. This function modifies its inputs.
24-
function verifyServerStatusChange(initialStats, newStats, paths, expectedIncrement) {
24+
export function verifyServerStatusChange(initialStats, newStats, paths, expectedIncrement) {
2525
paths.forEach(path => {
2626
// Traverse to the parent of the changed element.
2727
let pathComponents = path.split(".");
@@ -66,6 +66,16 @@ function verifyServerStatusChange(initialStats, newStats, paths, expectedIncreme
6666
", initialStats: " + tojson(initialStats) + ", newStats: " + tojson(newStats));
6767
}
6868

69+
// Generate commands that will be using default write concern.
70+
export function generateCmdsWithNoWCProvided(cmd) {
71+
return [
72+
cmd,
73+
// Missing 'w' field will be filled with default write concern.
74+
Object.assign(Object.assign({}, cmd), {writeConcern: {j: true}}),
75+
Object.assign(Object.assign({}, cmd), {writeConcern: {wtimeout: 2000}})
76+
];
77+
}
78+
6979
let rst;
7080
let primary;
7181
let secondary;
@@ -104,23 +114,28 @@ function resetCollection(setupCommand) {
104114
}
105115

106116
function testWriteConcernMetrics(cmd, opName, inc, isPSASet, setupCommand) {
117+
jsTestLog("Testing " + opName + " - IsPSA: " + isPSASet);
107118
initializeReplicaSet(isPSASet);
108119

109120
// Run command with no writeConcern and no CWWC set.
110121
resetCollection(setupCommand);
111-
let serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
112-
verifyServerStatusFields(serverStatus);
113-
assert.commandWorked(testDB.runCommand(cmd));
114-
let newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
115-
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
116-
newStatus.opWriteConcernCounters,
117-
[
118-
opName +
119-
(isPSASet ? ".noneInfo.implicitDefault.wnum.1"
120-
: ".noneInfo.implicitDefault.wmajority"),
121-
opName + ".none"
122-
],
123-
inc);
122+
const cmdsWithNoWCProvided = generateCmdsWithNoWCProvided(cmd);
123+
let serverStatus, newStatus;
124+
cmdsWithNoWCProvided.forEach(cmd => {
125+
serverStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
126+
verifyServerStatusFields(serverStatus);
127+
assert.commandWorked(testDB.runCommand(cmd));
128+
newStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
129+
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
130+
newStatus.opWriteConcernCounters,
131+
[
132+
opName +
133+
(isPSASet ? ".noneInfo.implicitDefault.wnum.1"
134+
: ".noneInfo.implicitDefault.wmajority"),
135+
opName + ".none"
136+
],
137+
inc);
138+
});
124139

125140
// Run command with no writeConcern with CWWC set to majority.
126141
resetCollection(setupCommand);
@@ -129,40 +144,31 @@ function testWriteConcernMetrics(cmd, opName, inc, isPSASet, setupCommand) {
129144
defaultWriteConcern: {w: "majority"},
130145
writeConcern: {w: "majority"}
131146
}));
132-
serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
133-
verifyServerStatusFields(serverStatus);
134-
assert.commandWorked(testDB.runCommand(cmd));
135-
newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
136-
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
137-
newStatus.opWriteConcernCounters,
138-
[opName + ".noneInfo.CWWC.wmajority", opName + ".none"],
139-
inc);
147+
cmdsWithNoWCProvided.forEach(cmd => {
148+
serverStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
149+
verifyServerStatusFields(serverStatus);
150+
assert.commandWorked(testDB.runCommand(cmd));
151+
newStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
152+
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
153+
newStatus.opWriteConcernCounters,
154+
[opName + ".noneInfo.CWWC.wmajority", opName + ".none"],
155+
inc);
156+
});
140157

141158
// Run command with no writeConcern with CWWC set to w:1.
142159
resetCollection(setupCommand);
143160
assert.commandWorked(primary.adminCommand(
144161
{setDefaultRWConcern: 1, defaultWriteConcern: {w: 1}, writeConcern: {w: "majority"}}));
145-
serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
146-
verifyServerStatusFields(serverStatus);
147-
assert.commandWorked(testDB.runCommand(cmd));
148-
newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
149-
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
150-
newStatus.opWriteConcernCounters,
151-
[opName + ".noneInfo.CWWC.wnum.1", opName + ".none"],
152-
inc);
153-
154-
// Run command with no writeConcern and with CWWC set to j:true.
155-
resetCollection(setupCommand);
156-
assert.commandWorked(primary.adminCommand(
157-
{setDefaultRWConcern: 1, defaultWriteConcern: {j: true}, writeConcern: {w: "majority"}}));
158-
serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
159-
verifyServerStatusFields(serverStatus);
160-
assert.commandWorked(testDB.runCommand(cmd));
161-
newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
162-
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
163-
newStatus.opWriteConcernCounters,
164-
[opName + ".noneInfo.CWWC.wnum.1", opName + ".none"],
165-
inc);
162+
cmdsWithNoWCProvided.forEach(cmd => {
163+
serverStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
164+
verifyServerStatusFields(serverStatus);
165+
assert.commandWorked(testDB.runCommand(cmd));
166+
newStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
167+
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
168+
newStatus.opWriteConcernCounters,
169+
[opName + ".noneInfo.CWWC.wnum.1", opName + ".none"],
170+
inc);
171+
});
166172

167173
// Run command with no writeConcern and with CWWC set with (w: "myTag").
168174
resetCollection(setupCommand);
@@ -171,82 +177,79 @@ function testWriteConcernMetrics(cmd, opName, inc, isPSASet, setupCommand) {
171177
defaultWriteConcern: {w: "myTag"},
172178
writeConcern: {w: "majority"}
173179
}));
174-
serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
175-
verifyServerStatusFields(serverStatus);
176-
assert.commandWorked(testDB.runCommand(cmd));
177-
newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
178-
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
179-
newStatus.opWriteConcernCounters,
180-
[opName + ".noneInfo.CWWC.wtag.myTag", opName + ".none"],
181-
inc);
182-
183-
// Run command with writeConcern {j: true}. This should be counted as having no 'w' value.
184-
resetCollection(setupCommand);
185-
serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
186-
verifyServerStatusFields(serverStatus);
187-
assert.commandWorked(
188-
testDB.runCommand(Object.assign(Object.assign({}, cmd), {writeConcern: {j: true}})));
189-
newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
190-
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
191-
newStatus.opWriteConcernCounters,
192-
[opName + ".noneInfo.implicitDefault.wnum.1", opName + ".none"],
193-
inc);
180+
cmdsWithNoWCProvided.forEach(cmd => {
181+
serverStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
182+
verifyServerStatusFields(serverStatus);
183+
assert.commandWorked(testDB.runCommand(cmd));
184+
newStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
185+
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
186+
newStatus.opWriteConcernCounters,
187+
[opName + ".noneInfo.CWWC.wtag.myTag", opName + ".none"],
188+
inc);
189+
});
194190

195191
// Run command with writeConcern {w: "majority"}.
196192
resetCollection(setupCommand);
197-
serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
193+
serverStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
198194
verifyServerStatusFields(serverStatus);
199195
assert.commandWorked(
200196
testDB.runCommand(Object.assign(Object.assign({}, cmd), {writeConcern: {w: "majority"}})));
201-
newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
197+
newStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
202198
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
203199
newStatus.opWriteConcernCounters,
204200
[opName + ".wmajority"],
205201
inc);
206202

207203
// Run command with writeConcern {w: 0}.
208204
resetCollection(setupCommand);
209-
serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
205+
serverStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
210206
verifyServerStatusFields(serverStatus);
211207
assert.commandWorked(
212208
testDB.runCommand(Object.assign(Object.assign({}, cmd), {writeConcern: {w: 0}})));
213-
newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
214-
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
215-
newStatus.opWriteConcernCounters,
216-
[opName + ".wnum.0"],
217-
inc);
209+
assert.soon(() => {
210+
newStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
211+
try {
212+
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
213+
newStatus.opWriteConcernCounters,
214+
[opName + ".wnum.0"],
215+
inc);
216+
} catch (e) {
217+
return false;
218+
}
219+
return true;
220+
});
218221

219222
// Run command with writeConcern {w: 1}.
220223
resetCollection(setupCommand);
221-
serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
224+
serverStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
222225
verifyServerStatusFields(serverStatus);
223226
assert.commandWorked(
224227
testDB.runCommand(Object.assign(Object.assign({}, cmd), {writeConcern: {w: 1}})));
225-
newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
228+
newStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
226229
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
227230
newStatus.opWriteConcernCounters,
228231
[opName + ".wnum.1"],
229232
inc);
230233

231234
// Run command with writeConcern {w: 2}.
232235
resetCollection(setupCommand);
233-
serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
236+
serverStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
234237
verifyServerStatusFields(serverStatus);
235238
assert.commandWorked(
236239
testDB.runCommand(Object.assign(Object.assign({}, cmd), {writeConcern: {w: 2}})));
237-
newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
240+
newStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
238241
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
239242
newStatus.opWriteConcernCounters,
240243
[opName + ".wnum.2"],
241244
inc);
242245

243246
// Run command with writeConcern {w: "myTag"}.
244247
resetCollection(setupCommand);
245-
serverStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
248+
serverStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
246249
verifyServerStatusFields(serverStatus);
247250
assert.commandWorked(
248251
testDB.runCommand(Object.assign(Object.assign({}, cmd), {writeConcern: {w: "myTag"}})));
249-
newStatus = assert.commandWorked(testDB.adminCommand({serverStatus: 1}));
252+
newStatus = assert.commandWorked(primary.adminCommand({serverStatus: 1}));
250253
verifyServerStatusChange(serverStatus.opWriteConcernCounters,
251254
newStatus.opWriteConcernCounters,
252255
[opName + ".wtag.myTag"],
@@ -300,4 +303,4 @@ for (const isPSASet of [true, false]) {
300303
1,
301304
isPSASet,
302305
{insert: collName, documents: [{_id: 0}]});
303-
}
306+
}

0 commit comments

Comments
 (0)