Skip to content

Commit 80628aa

Browse files
committed
CDRIVER-2376 fix performance loss
Starting in commit #9f9934dcd, the driver had incorrectly called "ping" before nearly every command when in single-threaded mode. This was due to the mongoc_topology_scanner_node_t.last_update field not being updated, so the driver thought each server's socket had been idle and needed to be checked with "ping", even when the socket had been used recently. In this commit, update last_used after every command so we don't call "ping" unnecessarily.
1 parent 471bfb0 commit 80628aa

File tree

3 files changed

+47
-13
lines changed

3 files changed

+47
-13
lines changed

src/mongoc/mongoc-cluster.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ mongoc_cluster_run_command_monitored (mongoc_cluster_t *cluster,
433433
{
434434
bool retval;
435435
uint32_t request_id = ++cluster->request_id;
436+
uint32_t server_id;
436437
mongoc_apm_callbacks_t *callbacks;
437438
mongoc_apm_command_started_t started_event;
438439
mongoc_apm_command_succeeded_t succeeded_event;
@@ -444,6 +445,7 @@ mongoc_cluster_run_command_monitored (mongoc_cluster_t *cluster,
444445
int32_t compressor_id;
445446

446447
server_stream = cmd->server_stream;
448+
server_id = server_stream->sd->id;
447449
compressor_id = mongoc_server_description_compressor_id (server_stream->sd);
448450

449451
callbacks = &cluster->client->apm_callbacks;
@@ -476,7 +478,7 @@ mongoc_cluster_run_command_monitored (mongoc_cluster_t *cluster,
476478
request_id,
477479
cmd->operation_id,
478480
&server_stream->sd->host,
479-
server_stream->sd->id,
481+
server_id,
480482
cluster->client->apm_context);
481483

482484
callbacks->succeeded (&succeeded_event);
@@ -490,18 +492,21 @@ mongoc_cluster_run_command_monitored (mongoc_cluster_t *cluster,
490492
request_id,
491493
cmd->operation_id,
492494
&server_stream->sd->host,
493-
server_stream->sd->id,
495+
server_id,
494496
cluster->client->apm_context);
495497

496498
callbacks->failed (&failed_event);
497499
mongoc_apm_command_failed_cleanup (&failed_event);
498500
}
499501
if (!retval) {
500-
handle_not_master_error (cluster, server_stream->sd->id, error);
502+
handle_not_master_error (cluster, server_id, error);
501503
}
502504
if (reply == &reply_local) {
503505
bson_destroy (&reply_local);
504506
}
507+
508+
_mongoc_topology_update_last_used (cluster->client->topology, server_id);
509+
505510
return retval;
506511
}
507512

@@ -556,6 +561,9 @@ mongoc_cluster_run_command_private (mongoc_cluster_t *cluster,
556561
handle_not_master_error (cluster, server_stream->sd->id, error);
557562
}
558563

564+
_mongoc_topology_update_last_used (cluster->client->topology,
565+
server_stream->sd->id);
566+
559567
return retval;
560568
}
561569

@@ -2248,7 +2256,9 @@ mongoc_cluster_check_interval (mongoc_cluster_t *cluster, uint32_t server_id)
22482256
*
22492257
* mongoc_cluster_legacy_rpc_sendv_to_server --
22502258
*
2251-
* Sends the given RPCs to the given server.
2259+
* Sends the given RPCs to the given server. Used for OP_QUERY cursors,
2260+
* OP_KILLCURSORS, and legacy writes with OP_INSERT, OP_UPDATE, and
2261+
* OP_DELETE. This function is *not* in the OP_QUERY command path.
22522262
*
22532263
* Returns:
22542264
* True if successful.
@@ -2270,7 +2280,6 @@ mongoc_cluster_legacy_rpc_sendv_to_server (
22702280
bson_error_t *error)
22712281
{
22722282
uint32_t server_id;
2273-
mongoc_topology_scanner_node_t *scanner_node;
22742283
int32_t max_msg_size;
22752284
bool ret = false;
22762285
int32_t compressor_id = 0;
@@ -2326,14 +2335,7 @@ mongoc_cluster_legacy_rpc_sendv_to_server (
23262335
GOTO (done);
23272336
}
23282337

2329-
if (cluster->client->topology->single_threaded) {
2330-
scanner_node = mongoc_topology_scanner_get_node (
2331-
cluster->client->topology->scanner, server_id);
2332-
2333-
if (scanner_node) {
2334-
scanner_node->last_used = bson_get_monotonic_time ();
2335-
}
2336-
}
2338+
_mongoc_topology_update_last_used (cluster->client->topology, server_id);
23372339

23382340
ret = true;
23392341

src/mongoc/mongoc-topology-private.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ bool
111111
_mongoc_topology_update_from_handshake (mongoc_topology_t *topology,
112112
const mongoc_server_description_t *sd);
113113

114+
void
115+
_mongoc_topology_update_last_used (mongoc_topology_t *topology,
116+
uint32_t server_id);
117+
114118
int64_t
115119
mongoc_topology_server_timestamp (mongoc_topology_t *topology, uint32_t id);
116120

src/mongoc/mongoc-topology.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,34 @@ _mongoc_topology_update_from_handshake (mongoc_topology_t *topology,
928928
return has_server;
929929
}
930930

931+
/*
932+
*--------------------------------------------------------------------------
933+
*
934+
* _mongoc_topology_update_last_used --
935+
*
936+
* Internal function. In single-threaded mode only, track when the socket
937+
* to a particular server was last used. This is required for
938+
* mongoc_cluster_check_interval to know when a socket has been idle.
939+
*
940+
*--------------------------------------------------------------------------
941+
*/
942+
943+
void
944+
_mongoc_topology_update_last_used (mongoc_topology_t *topology,
945+
uint32_t server_id)
946+
{
947+
mongoc_topology_scanner_node_t *node;
948+
949+
if (!topology->single_threaded) {
950+
return;
951+
}
952+
953+
node = mongoc_topology_scanner_get_node (topology->scanner, server_id);
954+
if (node) {
955+
node->last_used = bson_get_monotonic_time ();
956+
}
957+
}
958+
931959
/*
932960
*--------------------------------------------------------------------------
933961
*

0 commit comments

Comments
 (0)