Skip to content

Commit d0062b2

Browse files
committed
JAVA-908: Include writeConcern in findandmodify command, and check for writeConcernError in the response
1 parent 9fc4c7e commit d0062b2

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

src/main/com/mongodb/DBCollectionImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,13 @@ public CommandResult execute() throws IOException {
321321
return port.runCommand(db, cmd, db.getMongo().getMaxBsonObjectSize() + QUERY_DOCUMENT_HEADROOM);
322322
}
323323
});
324+
if (res.containsField("writeConcernError")) {
325+
DBObject writeConcernErrorDocument = (DBObject) res.get("writeConcernError");
326+
CommandResult fakedCommandResultForWriteConcernError = new CommandResult(port.serverAddress());
327+
fakedCommandResultForWriteConcernError.put("err", writeConcernErrorDocument.get("errmsg"));
328+
fakedCommandResultForWriteConcernError.put("code", writeConcernErrorDocument.get("code"));
329+
throw new WriteConcernException(fakedCommandResultForWriteConcernError);
330+
}
324331
if (res.ok() || res.getErrorMessage().equals("No matching object found")) {
325332
return replaceWithObjectClass((DBObject) res.get("value"));
326333
}
@@ -365,6 +372,10 @@ private BasicDBObject prepareFindAndModifyCommand(final DBObject query, final DB
365372
if (upsert)
366373
cmd.append( "upsert", upsert );
367374
}
375+
376+
if (writeConcern.callGetLastError() && !writeConcern.useServerDefault() && serverVersion.compareTo(new ServerVersion(3, 2)) >= 0) {
377+
cmd.append("writeConcern", writeConcern.asDBObject());
378+
}
368379
return cmd;
369380
}
370381

src/test/com/mongodb/DBCollectionTest.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -646,41 +646,52 @@ public void testFindAndReplaceA16MDocument() {
646646
@Test
647647
public void testWriteConcernExceptionOnInsert() throws UnknownHostException {
648648
assumeTrue(isReplicaSet(getMongoClient()));
649-
MongoClient mongoClient = new MongoClient(getMongoClientURI());
650649
try {
651-
DBCollection localCollection = mongoClient.getDB(collection.getDB().getName()).getCollection(collection.getName());
652-
WriteResult writeResult = localCollection.insert(new BasicDBObject(), new WriteConcern(5, 1, false, false));
650+
WriteResult writeResult = collection.insert(new BasicDBObject(), new WriteConcern(5, 1));
653651
fail("Expected update to error. Instead, succeeded with: " + writeResult);
654652
} catch (WriteConcernException e) {
655653
assertNotNull(e.getServerAddress());
656654
assertNotNull(e.getErrorMessage());
657655
assertNotNull(e.getCommandResult().get("err"));
658656
assertEquals(0, e.getCommandResult().get("n"));
659-
} finally {
660-
mongoClient.close();
661657
}
662658
}
663659

664660
@Test
665661
public void testWriteConcernExceptionOnUpdate() throws UnknownHostException {
666662
assumeTrue(isReplicaSet(getMongoClient()));
667-
MongoClient mongoClient = new MongoClient(getMongoClientURI());
668663
ObjectId id = new ObjectId();
669664
try {
670-
DBCollection localCollection = mongoClient.getDB(collection.getDB().getName()).getCollection(collection.getName());
671-
WriteResult writeResult = localCollection.update(new BasicDBObject("_id", id),
672-
new BasicDBObject("$set", new BasicDBObject("x", 1)),
673-
true, false,
674-
new WriteConcern(5, 1, false, false));
665+
WriteResult writeResult = collection.update(new BasicDBObject("_id", id),
666+
new BasicDBObject("$set", new BasicDBObject("x", 1)),
667+
true, false,
668+
new WriteConcern(5, 1));
675669
fail("Expected update to error. Instead, succeeded with: " + writeResult);
676670
} catch (WriteConcernException e) {
677-
assertNotNull(e.getServerAddress());
678671
assertNotNull(e.getErrorMessage());
679-
assertNotNull(e.getCommandResult().get("err"));
672+
assertTrue(e.getCode() > 0);
680673
assertEquals(1, e.getCommandResult().get("n"));
681674
assertEquals(id, e.getCommandResult().get("upserted"));
675+
}
676+
}
677+
678+
@Test
679+
public void testWriteConcernExceptionOnFindAndModify() throws UnknownHostException {
680+
checkServerVersion(3.2);
681+
assumeTrue(isReplicaSet(getMongoClient()));
682+
ObjectId id = new ObjectId();
683+
collection.setWriteConcern(new WriteConcern(5, 1));
684+
try {
685+
collection.findAndModify(new BasicDBObject("_id", id), null, null, false,
686+
new BasicDBObject("$set", new BasicDBObject("x", 1)),
687+
true, true);
688+
fail("Expected findAndModify to error");
689+
} catch (WriteConcernException e) {
690+
assertNotNull(e.getServerAddress());
691+
assertNotNull(e.getErrorMessage());
692+
assertTrue(e.getCode() > 0);
682693
} finally {
683-
mongoClient.close();
694+
collection.setWriteConcern(WriteConcern.ACKNOWLEDGED);
684695
}
685696
}
686697

0 commit comments

Comments
 (0)