Skip to content

Commit d06c2f9

Browse files
committed
CDRIVER-2422 don't ignore readConcern opt in raw commands
1 parent 68cfb8b commit d06c2f9

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

src/mongoc/mongoc-cmd.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -655,11 +655,12 @@ mongoc_cmd_parts_assemble (mongoc_cmd_parts_t *parts,
655655
&parts->assembled_body, "$clusterTime", 12, cluster_time);
656656
}
657657

658-
if (parts->is_read_command && !is_get_more) {
658+
if (!is_get_more) {
659659
/* This condition should never trigger for an implicit client session.
660660
* Even though the causal consistency option may default to true, an
661661
* implicit client session will have no previous operation time. */
662-
if (cs && mongoc_session_opts_get_causal_consistency (&cs->opts) &&
662+
if (parts->is_read_command && cs &&
663+
mongoc_session_opts_get_causal_consistency (&cs->opts) &&
663664
cs->operation_timestamp) {
664665
_mongoc_cmd_parts_ensure_copied (parts);
665666
bson_append_document_begin (

tests/test-mongoc-client.c

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,6 +1446,87 @@ test_command_with_opts (void)
14461446
}
14471447

14481448

1449+
static void
1450+
test_command_with_opts_op_msg (void)
1451+
{
1452+
mock_server_t *server;
1453+
mongoc_client_t *client;
1454+
bson_t *cmd;
1455+
mongoc_write_concern_t *wc;
1456+
mongoc_read_concern_t *read_concern;
1457+
mongoc_read_prefs_t *prefs;
1458+
bson_error_t error;
1459+
future_t *future;
1460+
request_t *request;
1461+
bson_t opts = BSON_INITIALIZER;
1462+
1463+
server = mock_mongos_new (WIRE_VERSION_OP_MSG);
1464+
1465+
mock_server_auto_endsessions (server);
1466+
1467+
mock_server_run (server);
1468+
1469+
client = mongoc_client_new_from_uri (mock_server_get_uri (server));
1470+
1471+
/* client's write concern, read concern, read prefs are ignored */
1472+
wc = mongoc_write_concern_new ();
1473+
mongoc_write_concern_set_w (wc, 2);
1474+
mongoc_client_set_write_concern (client, wc);
1475+
1476+
read_concern = mongoc_read_concern_new ();
1477+
mongoc_read_concern_set_level (read_concern, "majority");
1478+
mongoc_client_set_read_concern (client, read_concern);
1479+
1480+
prefs = mongoc_read_prefs_new (MONGOC_READ_SECONDARY);
1481+
mongoc_client_set_read_prefs (client, prefs);
1482+
1483+
cmd = tmp_bson ("{'create': 'db'}");
1484+
future = future_client_command_with_opts (
1485+
client, "admin", cmd, NULL, NULL, NULL, &error);
1486+
1487+
request = mock_server_receives_msg (
1488+
server,
1489+
0,
1490+
tmp_bson ("{"
1491+
" 'create': 'db',"
1492+
" 'readConcern': {'$exists': false},"
1493+
" 'writeConcern': {'$exists': false}"
1494+
"}"));
1495+
1496+
mock_server_replies_ok_and_destroys (request);
1497+
ASSERT_OR_PRINT (future_get_bool (future), error);
1498+
future_destroy (future);
1499+
1500+
/* write concern, read concern, and read preference passed in explicitly */
1501+
mongoc_write_concern_append (wc, &opts);
1502+
mongoc_read_concern_append (read_concern, &opts);
1503+
future = future_client_command_with_opts (
1504+
client, "admin", cmd, prefs, &opts, NULL, &error);
1505+
1506+
request = mock_server_receives_msg (
1507+
server,
1508+
0,
1509+
tmp_bson ("{"
1510+
" 'create':'db',"
1511+
" 'writeConcern': {'w': 2},"
1512+
" 'readConcern': {'level':'majority'},"
1513+
" '$readPreference': {"
1514+
" 'mode':'secondary'"
1515+
" }"
1516+
"}"));
1517+
1518+
mock_server_replies_ok_and_destroys (request);
1519+
ASSERT_OR_PRINT (future_get_bool (future), error);
1520+
future_destroy (future);
1521+
1522+
mongoc_read_prefs_destroy (prefs);
1523+
mongoc_read_concern_destroy (read_concern);
1524+
mongoc_write_concern_destroy (wc);
1525+
mongoc_client_destroy (client);
1526+
mock_server_destroy (server);
1527+
}
1528+
1529+
14491530
static void
14501531
test_command_empty (void)
14511532
{
@@ -3372,6 +3453,8 @@ test_client_install (TestSuite *suite)
33723453
suite, "/Client/command_with_opts/legacy", test_command_with_opts_legacy);
33733454
TestSuite_AddMockServerTest (
33743455
suite, "/Client/command_with_opts", test_command_with_opts);
3456+
TestSuite_AddMockServerTest (
3457+
suite, "/Client/command_with_opts/op_msg", test_command_with_opts_op_msg);
33753458
TestSuite_AddMockServerTest (
33763459
suite, "/Client/command_with_opts/read", test_read_command_with_opts);
33773460
TestSuite_AddLive (suite, "/Client/command/empty", test_command_empty);

0 commit comments

Comments
 (0)