Skip to content

Commit a8c1da4

Browse files
committed
CDRIVER-553 Fix replica set node management
Grow and shrink nodes_len with peer list, rather than being fixed on the initial seed list size.
1 parent 66ded1a commit a8c1da4

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/mongoc/mongoc-cluster.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2031,6 +2031,7 @@ _mongoc_cluster_reconnect_replica_set (mongoc_cluster_t *cluster,
20312031
const mongoc_host_list_t *iter;
20322032
mongoc_cluster_node_t node;
20332033
mongoc_cluster_node_t *saved_nodes;
2034+
size_t saved_nodes_len;
20342035
mongoc_host_list_t host;
20352036
mongoc_stream_t *stream;
20362037
mongoc_list_t *list;
@@ -2047,6 +2048,7 @@ _mongoc_cluster_reconnect_replica_set (mongoc_cluster_t *cluster,
20472048
BSON_ASSERT(cluster->mode == MONGOC_CLUSTER_REPLICA_SET);
20482049

20492050
saved_nodes = bson_malloc0(cluster->nodes_len * sizeof(*saved_nodes));
2051+
saved_nodes_len = cluster->nodes_len;
20502052

20512053
MONGOC_DEBUG("Reconnecting to replica set.");
20522054

@@ -2142,10 +2144,11 @@ _mongoc_cluster_reconnect_replica_set (mongoc_cluster_t *cluster,
21422144
}
21432145
}
21442146

2145-
for (liter = list, i = 0;
2146-
liter && (i < cluster->nodes_len);
2147-
liter = liter->next) {
2147+
for (liter = list, i = 0; liter; liter = liter->next, i++) {}
2148+
cluster->nodes = bson_realloc (cluster->nodes, sizeof (*cluster->nodes) * i);
2149+
cluster->nodes_len = i;
21482150

2151+
for (liter = list, i = 0; liter; liter = liter->next) {
21492152
if (!_mongoc_host_list_from_string(&host, liter->data)) {
21502153
MONGOC_WARNING("Failed to parse host and port: \"%s\"",
21512154
(char *)liter->data);
@@ -2154,7 +2157,7 @@ _mongoc_cluster_reconnect_replica_set (mongoc_cluster_t *cluster,
21542157

21552158
stream = NULL;
21562159

2157-
for (j = 0; j < cluster->nodes_len; j++) {
2160+
for (j = 0; j < saved_nodes_len; j++) {
21582161
if (0 == strcmp (saved_nodes [j].host.host_and_port,
21592162
host.host_and_port)) {
21602163
stream = saved_nodes [j].stream;
@@ -2215,14 +2218,16 @@ _mongoc_cluster_reconnect_replica_set (mongoc_cluster_t *cluster,
22152218
i++;
22162219
}
22172220

2221+
cluster->nodes_len = i;
2222+
22182223
_mongoc_list_foreach(list, (void(*)(void*,void*))bson_free, NULL);
22192224
_mongoc_list_destroy(list);
22202225

22212226
/*
22222227
* Cleanup all potential saved connections that were not used.
22232228
*/
22242229

2225-
for (j = 0; j < cluster->nodes_len; j++) {
2230+
for (j = 0; j < saved_nodes_len; j++) {
22262231
if (saved_nodes [j].stream) {
22272232
mongoc_stream_destroy (saved_nodes [j].stream);
22282233
saved_nodes [j].stream = NULL;

0 commit comments

Comments
 (0)