Skip to content

Commit da1f98c

Browse files
authored
CDRIVER-4754 pre-4.4 mongos writeConcernError does not determine retryability (#1501)
Synced with mongodb/specifications@3e60a7c
1 parent da6db59 commit da1f98c

File tree

7 files changed

+324
-12
lines changed

7 files changed

+324
-12
lines changed

src/libmongoc/src/mongoc/mongoc-client.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,8 +1712,7 @@ _mongoc_client_retryable_write_command_with_stream (
17121712
ret = mongoc_cluster_run_command_monitored (
17131713
&client->cluster, &parts->assembled, reply, error);
17141714

1715-
_mongoc_write_error_handle_labels (
1716-
ret, error, reply, server_stream->sd->max_wire_version);
1715+
_mongoc_write_error_handle_labels (ret, error, reply, server_stream->sd);
17171716

17181717
if (is_retryable) {
17191718
_mongoc_write_error_update_if_unsupported_storage_engine (

src/libmongoc/src/mongoc/mongoc-cluster.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ _handle_txn_error_labels (bool cmd_ret,
530530
}
531531

532532
_mongoc_write_error_handle_labels (
533-
cmd_ret, cmd_err, reply, cmd->server_stream->sd->max_wire_version);
533+
cmd_ret, cmd_err, reply, cmd->server_stream->sd);
534534
}
535535

536536
/*

src/libmongoc/src/mongoc/mongoc-collection.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3548,7 +3548,7 @@ mongoc_collection_find_and_modify_with_opts (
35483548

35493549
if (parts.is_retryable_write) {
35503550
_mongoc_write_error_handle_labels (
3551-
ret, error, reply_ptr, server_stream->sd->max_wire_version);
3551+
ret, error, reply_ptr, server_stream->sd);
35523552
}
35533553

35543554
if (is_retryable) {

src/libmongoc/src/mongoc/mongoc-error-private.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include <bson/bson.h>
2020
#include <stddef.h>
2121

22+
#include "mongoc-server-description.h"
23+
2224
BSON_BEGIN_DECLS
2325

2426
typedef enum {
@@ -72,7 +74,7 @@ void
7274
_mongoc_write_error_handle_labels (bool cmd_ret,
7375
const bson_error_t *cmd_err,
7476
bson_t *reply,
75-
int32_t server_max_wire_version);
77+
mongoc_server_description_t *sd);
7678

7779
bool
7880
_mongoc_error_is_shutdown (bson_error_t *error);

src/libmongoc/src/mongoc/mongoc-error.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "mongoc-error-private.h"
2121
#include "mongoc-rpc-private.h"
2222
#include "mongoc-client-private.h"
23+
#include "mongoc-server-description-private.h"
2324

2425
bool
2526
mongoc_error_has_label (const bson_t *reply, const char *label)
@@ -102,7 +103,7 @@ void
102103
_mongoc_write_error_handle_labels (bool cmd_ret,
103104
const bson_error_t *cmd_err,
104105
bson_t *reply,
105-
int32_t server_max_wire_version)
106+
mongoc_server_description_t *sd)
106107
{
107108
bson_error_t error;
108109

@@ -115,14 +116,21 @@ _mongoc_write_error_handle_labels (bool cmd_ret,
115116
return;
116117
}
117118

118-
if (server_max_wire_version >= WIRE_VERSION_RETRYABLE_WRITE_ERROR_LABEL) {
119+
if (sd->max_wire_version >= WIRE_VERSION_RETRYABLE_WRITE_ERROR_LABEL) {
119120
return;
120121
}
121122

122-
/* check for a server error. */
123-
if (_mongoc_cmd_check_ok_no_wce (
124-
reply, MONGOC_ERROR_API_VERSION_2, &error)) {
125-
return;
123+
/* Check for a server error. Do not consult writeConcernError for pre-4.4
124+
* mongos. */
125+
if (sd->type == MONGOC_SERVER_MONGOS) {
126+
if (_mongoc_cmd_check_ok (reply, MONGOC_ERROR_API_VERSION_2, &error)) {
127+
return;
128+
}
129+
} else {
130+
if (_mongoc_cmd_check_ok_no_wce (
131+
reply, MONGOC_ERROR_API_VERSION_2, &error)) {
132+
return;
133+
}
126134
}
127135

128136
if (_mongoc_write_error_is_retryable (&error)) {

src/libmongoc/src/mongoc/mongoc-write-command.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ _mongoc_write_opmsg (mongoc_write_command_t *command,
750750

751751
if (parts.is_retryable_write) {
752752
_mongoc_write_error_handle_labels (
753-
ret, error, &reply, server_stream->sd->max_wire_version);
753+
ret, error, &reply, server_stream->sd);
754754
}
755755

756756
/* Add this batch size so we skip these documents next time */

0 commit comments

Comments
 (0)