Skip to content

Commit cf96488

Browse files
committed
CXX-689 Assert bypassDocumentValidation is not used with unacknowledged writes
1 parent b973dbc commit cf96488

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

src/mongo/client/dbclient.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2040,8 +2040,7 @@ void DBClientBase::_write(const string& ns,
20402040
WriteResult* writeResult) {
20412041
const WriteConcern* operationWriteConcern = writeConcern ? writeConcern : &getWriteConcern();
20422042

2043-
if (getMaxWireVersion() >= 2 &&
2044-
(operationWriteConcern->requiresConfirmation() || bypassDocumentValidation))
2043+
if (getMaxWireVersion() >= 2 && operationWriteConcern->requiresConfirmation())
20452044
_commandWriter->write(
20462045
ns, writes, ordered, bypassDocumentValidation, operationWriteConcern, writeResult);
20472046
else

src/mongo/client/wire_protocol_writer.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,17 @@ void WireProtocolWriter::write(const StringData& ns,
3131
bool bypassDocumentValidation,
3232
const WriteConcern* writeConcern,
3333
WriteResult* writeResult) {
34-
invariant(bypassDocumentValidation == false);
34+
if (_client->getMaxWireVersion() >= 4) {
35+
// Per DRIVERS-250:
36+
// If your driver sends unacknowledged writes using op codes (OP_INSERT, OP_UPDATE,
37+
// OP_DELETE), you MUST raise an error when bypassDocumentValidation is explicitly set by a
38+
// user on >= 3.2 servers.
39+
//
40+
uassert(0,
41+
"bypassDocumentValidation is not supported for unacknowledged writes with MongoDB "
42+
"3.2 and later.",
43+
!bypassDocumentValidation);
44+
}
3545

3646
// Effectively a map of batch relative indexes to WriteOperations
3747
std::vector<WriteOperation*> batchOps;

src/mongo/integration/standalone/dbclient_test.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ TEST_F(DBClientTest, ByPassDocumentValidation) {
125125

126126
ASSERT_EQUALS(c->count(TEST_NS), 1U);
127127

128+
// Validate we fail with ByPassDocumentValidation, and unacknowledged writes against 3.2
129+
ASSERT_THROWS(c->insert(TEST_NS,
130+
BSON("fieldName" << 1000),
131+
InsertOption_BypassDocumentValidation,
132+
&WriteConcern::unacknowledged),
133+
std::exception);
134+
128135
c->update(TEST_NS,
129136
BSON("fieldName" << 1000),
130137
BSON("fieldName" << 1001),

0 commit comments

Comments
 (0)