From 5b82316e5017ff76646fd12878079620f9ad4be7 Mon Sep 17 00:00:00 2001 From: Abdul Qadeer Date: Fri, 31 Mar 2023 20:19:03 +0000 Subject: SERVER-73229 Throw on write errors in session refresh (cherry picked from commit 447b425584090e2d11ad11bbd01ecb12c37294f4) --- etc/backports_required_for_multiversion_tests.yml | 2 ++ .../session_cache_refresh_write_error_fail.js | 33 ++++++++++++++++++++++ src/mongo/db/sessions_collection.cpp | 5 ++-- 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 jstests/replsets/session_cache_refresh_write_error_fail.js diff --git a/etc/backports_required_for_multiversion_tests.yml b/etc/backports_required_for_multiversion_tests.yml index 7c7067e8ef1..14a87de6d84 100644 --- a/etc/backports_required_for_multiversion_tests.yml +++ b/etc/backports_required_for_multiversion_tests.yml @@ -155,6 +155,8 @@ all: ticket: SERVER-74124 - test_file: jstests/core/map_reduce_subplanning.js ticket: SERVER-74131 +- test_file: jstests/replsets/session_cache_refresh_write_error_fail.js + ticket: SERVER-73229 suites: change_streams_multiversion: null concurrency_replication_multiversion: null diff --git a/jstests/replsets/session_cache_refresh_write_error_fail.js b/jstests/replsets/session_cache_refresh_write_error_fail.js new file mode 100644 index 00000000000..8a2749b0fac --- /dev/null +++ b/jstests/replsets/session_cache_refresh_write_error_fail.js @@ -0,0 +1,33 @@ +/** + * Test that write errors resulting as part of refreshing logical session do not kill open cursors. + */ +(function() { +"use strict"; + +load("jstests/libs/fail_point_util.js"); + +const rst = new ReplSetTest({nodes: 1}); + +rst.startSet(); +rst.initiate(); + +const db = rst.getPrimary().getDB("test"); +const fp = configureFailPoint(db, "failAllUpdates"); +const collection = db.getCollection("mycoll"); +const sessionDb = db.getMongo().startSession().getDatabase(db.getName()); +const sessionCollection = sessionDb.getCollection(collection.getName()); + +assert.commandWorked(sessionCollection.insert(Array.from({length: 5}, (_, i) => ({_id: i})))); + +const res = assert.commandWorked(sessionCollection.runCommand("find", {batchSize: 2})); + +assert.commandFailedWithCode(db.adminCommand({refreshLogicalSessionCacheNow: 1}), + ErrorCodes.InternalError); + +assert.commandWorked( + sessionDb.runCommand({getMore: res.cursor.id, collection: sessionCollection.getName()})); + +fp.off(); + +rst.stopSet(); +})(); diff --git a/src/mongo/db/sessions_collection.cpp b/src/mongo/db/sessions_collection.cpp index b883bebf76c..0689ecfa1c2 100644 --- a/src/mongo/db/sessions_collection.cpp +++ b/src/mongo/db/sessions_collection.cpp @@ -156,9 +156,8 @@ SessionsCollection::SendBatchFn SessionsCollection::makeSendFnForBatchWrite( const NamespaceString& ns, DBClientBase* client) { auto send = [client, ns](BSONObj batch) { BSONObj res; - if (!client->runCommand(ns.db().toString(), batch, res)) { - uassertStatusOK(getStatusFromCommandResult(res)); - } + client->runCommand(ns.db().toString(), batch, res); + uassertStatusOK(getStatusFromWriteCommandReply(res)); }; return send; -- cgit v1.2.1