Skip to content

Commit 7f14b69

Browse files
Luke Lovettbehackett
authored andcommitted
PYTHON-989 - Check for write concern errors when using the findAndModify command.
1 parent 2d960ac commit 7f14b69

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

pymongo/collection.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1928,6 +1928,7 @@ def __find_and_modify(self, filter, projection, sort, upsert=None,
19281928
out = self._command(sock_info, cmd,
19291929
read_preference=ReadPreference.PRIMARY,
19301930
allowable_errors=[_NO_OBJ_ERROR])
1931+
_check_write_command_response([(0, out)])
19311932
return out.get("value")
19321933

19331934
def find_one_and_delete(self, filter,
@@ -2300,6 +2301,7 @@ def find_and_modify(self, query={}, update=None,
23002301
out = self._command(sock_info, cmd,
23012302
read_preference=ReadPreference.PRIMARY,
23022303
allowable_errors=[_NO_OBJ_ERROR])
2304+
_check_write_command_response([(0, out)])
23032305

23042306
if not out['ok']:
23052307
if out["errmsg"] == _NO_OBJ_ERROR:

test/test_collection.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@
4141
InvalidDocument,
4242
InvalidName,
4343
InvalidOperation,
44-
OperationFailure)
44+
OperationFailure,
45+
WriteConcernError)
4546
from pymongo.message import _COMMAND_OVERHEAD
4647
from pymongo.operations import *
4748
from pymongo.read_preferences import ReadPreference
@@ -1980,6 +1981,28 @@ def test_find_one_and_write_concern(self):
19801981
self.assertEqual(
19811982
{'w': 0}, results['started'][0].command['writeConcern'])
19821983
results.clear()
1984+
1985+
# Test write concern errors.
1986+
c_wc_error = db.get_collection(
1987+
'test',
1988+
write_concern=WriteConcern(w=len(client_context.nodes) + 1))
1989+
self.assertRaises(
1990+
WriteConcernError,
1991+
c_wc_error.find_and_modify,
1992+
{'_id': 1}, {'$set': {'foo': 'bar'}})
1993+
self.assertRaises(
1994+
WriteConcernError,
1995+
c_wc_error.find_one_and_update,
1996+
{'_id': 1}, {'$set': {'foo': 'bar'}})
1997+
self.assertRaises(
1998+
WriteConcernError,
1999+
c_wc_error.find_one_and_replace,
2000+
{'w': 0}, results['started'][0].command['writeConcern'])
2001+
self.assertRaises(
2002+
WriteConcernError,
2003+
c_wc_error.find_one_and_delete,
2004+
{'w': 0}, results['started'][0].command['writeConcern'])
2005+
results.clear()
19832006
else:
19842007
c_w0.find_and_modify(
19852008
{'_id': 1}, {'$set': {'foo': 'bar'}})

0 commit comments

Comments
 (0)