Skip to content

Commit 7d83883

Browse files
committed
PYTHON-2984 Fix retry behavior for bulk write writeConcernError (#800)
(cherry picked from commit 2af521e)
1 parent 480d60e commit 7d83883

40 files changed

+530
-95
lines changed

doc/changelog.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
Changelog
22
=========
33

4+
Changes in Version 3.12.2
5+
-------------------------
6+
7+
Issues Resolved
8+
...............
9+
10+
Version 3.12.2 fixes a bug that prevented PyMongo from retrying bulk writes
11+
after a ``writeConcernError`` on MongoDB 4.4+ (`PYTHON-2984`_).
12+
13+
See the `PyMongo 3.12.2 release notes in JIRA`_ for the list of resolved issues
14+
in this release.
15+
16+
.. _PYTHON-2984: https://jira.mongodb.org/browse/PYTHON-2984
17+
.. _PyMongo 3.12.2 release notes in JIRA:https://jira.mongodb.org/secure/ReleaseNote.jspa?projectId=10004&version=32310
18+
419
Changes in Version 3.12.1
520
-------------------------
621

pymongo/bulk.py

Lines changed: 4 additions & 4 deletions
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,
@@ -126,9 +126,9 @@ def _merge_command(run, full_result, offset, result):
126126
replacement[_UOP] = run.ops[idx]
127127
full_result["writeErrors"].append(replacement)
128128

129-
wc_error = result.get("writeConcernError")
130-
if wc_error:
131-
full_result["writeConcernErrors"].append(wc_error)
129+
wce = _get_wce_doc(result)
130+
if wce:
131+
full_result["writeConcernErrors"].append(wce)
132132

133133

134134
def _raise_bulk_write_error(full_result):

pymongo/helpers.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,18 @@ def _raise_write_concern_error(error):
220220
error.get("errmsg"), error.get("code"), error)
221221

222222

223+
def _get_wce_doc(result):
224+
"""Return the writeConcernError or None."""
225+
wce = result.get("writeConcernError")
226+
if wce:
227+
# The server reports errorLabels at the top level but it's more
228+
# convenient to attach it to the writeConcernError doc itself.
229+
error_labels = result.get("errorLabels")
230+
if error_labels:
231+
wce["errorLabels"] = error_labels
232+
return wce
233+
234+
223235
def _check_write_command_response(result):
224236
"""Backward compatibility helper for write command error handling.
225237
"""
@@ -228,12 +240,9 @@ def _check_write_command_response(result):
228240
if write_errors:
229241
_raise_last_write_error(write_errors)
230242

231-
error = result.get("writeConcernError")
232-
if error:
233-
error_labels = result.get("errorLabels")
234-
if error_labels:
235-
error.update({'errorLabels': error_labels})
236-
_raise_write_concern_error(error)
243+
wce = _get_wce_doc(result)
244+
if wce:
245+
_raise_write_concern_error(wce)
237246

238247

239248
def _raise_last_error(bulk_write_result):

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

Lines changed: 4 additions & 4 deletions
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 renamed to test/retryable_writes/legacy/deleteOne-serverErrors.json

Lines changed: 4 additions & 4 deletions
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 renamed to test/retryable_writes/legacy/findOneAndDelete-serverErrors.json

Lines changed: 4 additions & 4 deletions
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 renamed to test/retryable_writes/legacy/findOneAndReplace-serverErrors.json

Lines changed: 4 additions & 4 deletions
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 renamed to test/retryable_writes/legacy/findOneAndUpdate-serverErrors.json

Lines changed: 4 additions & 4 deletions
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 renamed to test/retryable_writes/legacy/insertMany-serverErrors.json

Lines changed: 4 additions & 4 deletions
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 renamed to test/retryable_writes/legacy/insertOne-serverErrors.json

Lines changed: 20 additions & 20 deletions
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 renamed to test/retryable_writes/legacy/replaceOne-serverErrors.json

Lines changed: 4 additions & 4 deletions
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 renamed to test/retryable_writes/legacy/updateOne-serverErrors.json

Lines changed: 4 additions & 4 deletions
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)