summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbdul Qadeer <abdul.qadeer@mongodb.com>2023-03-31 20:19:03 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-04-04 00:42:05 +0000
commit5b82316e5017ff76646fd12878079620f9ad4be7 (patch)
tree01a328c4ec2b2c10af0007861911b76180d272d5
parent867bd2a507ddc5f54d59220f8c977836e0f0d8d1 (diff)
downloadmongo-r4.4.20.tar.gz
SERVER-73229 Throw on write errors in session refreshr4.4.20-rc0r4.4.20
(cherry picked from commit 447b425584090e2d11ad11bbd01ecb12c37294f4)
-rw-r--r--etc/backports_required_for_multiversion_tests.yml2
-rw-r--r--jstests/replsets/session_cache_refresh_write_error_fail.js33
-rw-r--r--src/mongo/db/sessions_collection.cpp5
3 files changed, 37 insertions, 3 deletions
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;