Skip to content

Commit 2af521e

Browse files
authored
PYTHON-2984 Fix retry behavior for bulk write writeConcernError (#800)
1 parent cddae7a commit 2af521e

39 files changed

+515
-95
lines changed

pymongo/bulk.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
validate_is_document_type,
2929
validate_ok_for_replace,
3030
validate_ok_for_update)
31-
from pymongo.helpers import _RETRYABLE_ERROR_CODES
31+
from pymongo.helpers import _RETRYABLE_ERROR_CODES, _get_wce_doc
3232
from pymongo.collation import validate_collation_or_none
3333
from pymongo.errors import (BulkWriteError,
3434
ConfigurationError,
@@ -119,9 +119,9 @@ def _merge_command(run, full_result, offset, result):
119119
replacement["op"] = run.ops[idx]
120120
full_result["writeErrors"].append(replacement)
121121

122-
wc_error = result.get("writeConcernError")
123-
if wc_error:
124-
full_result["writeConcernErrors"].append(wc_error)
122+
wce = _get_wce_doc(result)
123+
if wce:
124+
full_result["writeConcernErrors"].append(wce)
125125

126126

127127
def _raise_bulk_write_error(full_result):

pymongo/helpers.py

+15-6
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,18 @@ def _raise_write_concern_error(error):
188188
error.get("errmsg"), error.get("code"), error)
189189

190190

191+
def _get_wce_doc(result):
192+
"""Return the writeConcernError or None."""
193+
wce = result.get("writeConcernError")
194+
if wce:
195+
# The server reports errorLabels at the top level but it's more
196+
# convenient to attach it to the writeConcernError doc itself.
197+
error_labels = result.get("errorLabels")
198+
if error_labels:
199+
wce["errorLabels"] = error_labels
200+
return wce
201+
202+
191203
def _check_write_command_response(result):
192204
"""Backward compatibility helper for write command error handling.
193205
"""
@@ -196,12 +208,9 @@ def _check_write_command_response(result):
196208
if write_errors:
197209
_raise_last_write_error(write_errors)
198210

199-
error = result.get("writeConcernError")
200-
if error:
201-
error_labels = result.get("errorLabels")
202-
if error_labels:
203-
error.update({'errorLabels': error_labels})
204-
_raise_write_concern_error(error)
211+
wce = _get_wce_doc(result)
212+
if wce:
213+
_raise_write_concern_error(wce)
205214

206215

207216
def _fields_list_to_dict(fields, option_name):

test/retryable_writes/bulkWrite-serverErrors.json test/retryable_writes/legacy/bulkWrite-serverErrors.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,12 @@
119119
"failCommands": [
120120
"insert"
121121
],
122+
"errorLabels": [
123+
"RetryableWriteError"
124+
],
122125
"writeConcernError": {
123126
"code": 91,
124-
"errmsg": "Replication is being shut down",
125-
"errorLabels": [
126-
"RetryableWriteError"
127-
]
127+
"errmsg": "Replication is being shut down"
128128
}
129129
}
130130
},

test/retryable_writes/deleteOne-serverErrors.json test/retryable_writes/legacy/deleteOne-serverErrors.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,12 @@
7575
"failCommands": [
7676
"delete"
7777
],
78+
"errorLabels": [
79+
"RetryableWriteError"
80+
],
7881
"writeConcernError": {
7982
"code": 91,
80-
"errmsg": "Replication is being shut down",
81-
"errorLabels": [
82-
"RetryableWriteError"
83-
]
83+
"errmsg": "Replication is being shut down"
8484
}
8585
}
8686
},

test/retryable_writes/findOneAndDelete-serverErrors.json test/retryable_writes/legacy/findOneAndDelete-serverErrors.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@
8181
"failCommands": [
8282
"findAndModify"
8383
],
84+
"errorLabels": [
85+
"RetryableWriteError"
86+
],
8487
"writeConcernError": {
8588
"code": 91,
86-
"errmsg": "Replication is being shut down",
87-
"errorLabels": [
88-
"RetryableWriteError"
89-
]
89+
"errmsg": "Replication is being shut down"
9090
}
9191
}
9292
},

test/retryable_writes/findOneAndReplace-serverErrors.json test/retryable_writes/legacy/findOneAndReplace-serverErrors.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,12 @@
8585
"failCommands": [
8686
"findAndModify"
8787
],
88+
"errorLabels": [
89+
"RetryableWriteError"
90+
],
8891
"writeConcernError": {
8992
"code": 91,
90-
"errmsg": "Replication is being shut down",
91-
"errorLabels": [
92-
"RetryableWriteError"
93-
]
93+
"errmsg": "Replication is being shut down"
9494
}
9595
}
9696
},

test/retryable_writes/findOneAndUpdate-serverErrors.json test/retryable_writes/legacy/findOneAndUpdate-serverErrors.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@
8686
"failCommands": [
8787
"findAndModify"
8888
],
89+
"errorLabels": [
90+
"RetryableWriteError"
91+
],
8992
"writeConcernError": {
9093
"code": 91,
91-
"errmsg": "Replication is being shut down",
92-
"errorLabels": [
93-
"RetryableWriteError"
94-
]
94+
"errmsg": "Replication is being shut down"
9595
}
9696
}
9797
},

test/retryable_writes/insertMany-serverErrors.json test/retryable_writes/legacy/insertMany-serverErrors.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,12 @@
9292
"failCommands": [
9393
"insert"
9494
],
95+
"errorLabels": [
96+
"RetryableWriteError"
97+
],
9598
"writeConcernError": {
9699
"code": 91,
97-
"errmsg": "Replication is being shut down",
98-
"errorLabels": [
99-
"RetryableWriteError"
100-
]
100+
"errmsg": "Replication is being shut down"
101101
}
102102
}
103103
},

test/retryable_writes/insertOne-serverErrors.json test/retryable_writes/legacy/insertOne-serverErrors.json

+20-20
Original file line numberDiff line numberDiff line change
@@ -761,12 +761,12 @@
761761
"failCommands": [
762762
"insert"
763763
],
764+
"errorLabels": [
765+
"RetryableWriteError"
766+
],
764767
"writeConcernError": {
765768
"code": 11600,
766-
"errmsg": "Replication is being shut down",
767-
"errorLabels": [
768-
"RetryableWriteError"
769-
]
769+
"errmsg": "Replication is being shut down"
770770
}
771771
}
772772
},
@@ -812,12 +812,12 @@
812812
"failCommands": [
813813
"insert"
814814
],
815+
"errorLabels": [
816+
"RetryableWriteError"
817+
],
815818
"writeConcernError": {
816819
"code": 11602,
817-
"errmsg": "Replication is being shut down",
818-
"errorLabels": [
819-
"RetryableWriteError"
820-
]
820+
"errmsg": "Replication is being shut down"
821821
}
822822
}
823823
},
@@ -863,12 +863,12 @@
863863
"failCommands": [
864864
"insert"
865865
],
866+
"errorLabels": [
867+
"RetryableWriteError"
868+
],
866869
"writeConcernError": {
867870
"code": 189,
868-
"errmsg": "Replication is being shut down",
869-
"errorLabels": [
870-
"RetryableWriteError"
871-
]
871+
"errmsg": "Replication is being shut down"
872872
}
873873
}
874874
},
@@ -914,12 +914,12 @@
914914
"failCommands": [
915915
"insert"
916916
],
917+
"errorLabels": [
918+
"RetryableWriteError"
919+
],
917920
"writeConcernError": {
918921
"code": 91,
919-
"errmsg": "Replication is being shut down",
920-
"errorLabels": [
921-
"RetryableWriteError"
922-
]
922+
"errmsg": "Replication is being shut down"
923923
}
924924
}
925925
},
@@ -965,12 +965,12 @@
965965
"failCommands": [
966966
"insert"
967967
],
968+
"errorLabels": [
969+
"RetryableWriteError"
970+
],
968971
"writeConcernError": {
969972
"code": 91,
970-
"errmsg": "Replication is being shut down",
971-
"errorLabels": [
972-
"RetryableWriteError"
973-
]
973+
"errmsg": "Replication is being shut down"
974974
}
975975
}
976976
},

test/retryable_writes/replaceOne-serverErrors.json test/retryable_writes/legacy/replaceOne-serverErrors.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,12 @@
8585
"failCommands": [
8686
"update"
8787
],
88+
"errorLabels": [
89+
"RetryableWriteError"
90+
],
8891
"writeConcernError": {
8992
"code": 91,
90-
"errmsg": "Replication is being shut down",
91-
"errorLabels": [
92-
"RetryableWriteError"
93-
]
93+
"errmsg": "Replication is being shut down"
9494
}
9595
}
9696
},

test/retryable_writes/updateOne-serverErrors.json test/retryable_writes/legacy/updateOne-serverErrors.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@
8686
"failCommands": [
8787
"update"
8888
],
89+
"errorLabels": [
90+
"RetryableWriteError"
91+
],
8992
"writeConcernError": {
9093
"code": 91,
91-
"errmsg": "Replication is being shut down",
92-
"errorLabels": [
93-
"RetryableWriteError"
94-
]
94+
"errmsg": "Replication is being shut down"
9595
}
9696
}
9797
},

0 commit comments

Comments
 (0)