summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis Osta <luis.osta@mongodb.com>2021-09-20 15:12:08 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-09-20 15:25:05 +0000
commit211007fa4a705c02e7c373dd6fc148aa4de3a038 (patch)
tree9fd7b8145b9b057a4f38676c251ced03ed7c671f
parent8a68076c2eeb23d92ff10b0bb59bf1cb866158e5 (diff)
downloadmongo-211007fa4a705c02e7c373dd6fc148aa4de3a038.tar.gz
SERVER-55648 Return correct response in case of shutdown
-rw-r--r--buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml2
-rw-r--r--jstests/sharding/retryable_mongos_write_errors.js57
-rw-r--r--src/mongo/s/write_ops/batch_write_exec.cpp7
3 files changed, 66 insertions, 0 deletions
diff --git a/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml b/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml
index 392607b4af9..a63bac55d57 100644
--- a/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml
+++ b/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml
@@ -132,6 +132,8 @@ selector:
- jstests/sharding/safe_secondary_reads_causal_consistency.js
# Enable the following once SERVER-55725 is backported to 4.0 (and prev. versions checked here).
- jstests/sharding/time_zone_info_mongos.js
+ # Requires behavior that does not and will never exist in 3.6.
+ - jstests/sharding/retryable_mongos_write_errors.js
executor:
config:
shell_options:
diff --git a/jstests/sharding/retryable_mongos_write_errors.js b/jstests/sharding/retryable_mongos_write_errors.js
new file mode 100644
index 00000000000..6d10f1c4f14
--- /dev/null
+++ b/jstests/sharding/retryable_mongos_write_errors.js
@@ -0,0 +1,57 @@
+/**
+ * Tests that retryable write errors in MongoS return a top level error message.
+ */
+
+(function() {
+ "use strict";
+
+ load("jstests/libs/fail_point_util.js");
+ load('jstests/libs/parallelTester.js'); // for ScopedThread.
+
+ // Creates a new connection, uses it to get the database from the parameter name and inserts
+ // multiple documents to the provided collection.
+ function insertHandler(host, databaseName, collectionName) {
+ const conn = new Mongo(host);
+ const database = conn.getDB(databaseName);
+ // creates an array with 10 documents
+ const docs = Array.from(Array(10).keys()).map((i) => ({a: i, b: "retryable"}));
+ return database.runCommand({insert: collectionName, documents: docs});
+ }
+
+ const dbName = "test";
+ const collName = "retryable_mongos_write_errors";
+ const ns = dbName + "." + collName;
+
+ const st = new ShardingTest({config: 1, mongos: 1, shards: 1});
+ const shard0Primary = st.rs0.getPrimary();
+
+ const insertFailPoint =
+ configureFailPoint(shard0Primary, "hangAfterCollectionInserts", {collectionNS: ns});
+
+ const insertThread = new Thread(insertHandler, st.s.host, dbName, collName);
+ jsTest.log("Starting To Insert Documents");
+ insertThread.start();
+ insertFailPoint.wait();
+ MongoRunner.stopMongos(st.s);
+
+ try {
+ const commandResponse = insertThread.returnData();
+ jsTest.log("Command Response: " + tojson(commandResponse) + "." + commandResponse.code);
+ // assert that retryableInsertRes failed with the HostUnreachableError or
+ // InterruptedAtShutdown error code
+ assert.eq(commandResponse.code, ErrorCodes.InterruptedAtShutdown, tojson(commandResponse));
+ } catch (e) {
+ jsTest.log("Error ocurred: " + e);
+ if (!isNetworkError(e)) {
+ throw e;
+ }
+ }
+
+ jsTest.log("Finished Assertions, Turning Off Failpoint");
+
+ insertFailPoint.off();
+ st.s = MongoRunner.runMongos(st.s);
+
+ jsTest.log('Shutting down sharding test');
+ st.stop();
+}()); \ No newline at end of file
diff --git a/src/mongo/s/write_ops/batch_write_exec.cpp b/src/mongo/s/write_ops/batch_write_exec.cpp
index 54bfdf6572f..bf2dfbe912b 100644
--- a/src/mongo/s/write_ops/batch_write_exec.cpp
+++ b/src/mongo/s/write_ops/batch_write_exec.cpp
@@ -46,6 +46,7 @@
#include "mongo/s/grid.h"
#include "mongo/s/write_ops/batch_write_op.h"
#include "mongo/s/write_ops/write_error_detail.h"
+#include "mongo/util/exit.h"
#include "mongo/util/log.h"
namespace mongo {
@@ -303,6 +304,12 @@ void BatchWriteExec::executeBatch(OperationContext* opCtx,
: OID());
} else {
// Error occurred dispatching, note it
+ if (ErrorCodes::isShutdownError(responseStatus.code()) &&
+ globalInShutdownDeprecated()) {
+ // Throw an error since the mongos itself is shutting down so this should
+ // be a top level error instead of a write error.
+ uassertStatusOK(responseStatus);
+ }
const Status status = responseStatus.withContext(
str::stream() << "Write results unavailable from " << shardHost);