@@ -102,7 +102,8 @@ _handle_not_primary_error (mongoc_cluster_t *cluster,
102
102
reply ,
103
103
NULL ,
104
104
server_stream -> sd -> max_wire_version ,
105
- server_stream -> sd -> generation )) {
105
+ server_stream -> sd -> generation ,
106
+ & server_stream -> sd -> service_id )) {
106
107
mongoc_cluster_disconnect_node (cluster , server_id );
107
108
}
108
109
bson_mutex_unlock (& cluster -> client -> topology -> mutex );
@@ -138,7 +139,8 @@ _handle_network_error (mongoc_cluster_t *cluster,
138
139
NULL ,
139
140
why ,
140
141
server_stream -> sd -> max_wire_version ,
141
- server_stream -> sd -> generation );
142
+ server_stream -> sd -> generation ,
143
+ & server_stream -> sd -> service_id );
142
144
bson_mutex_unlock (& topology -> mutex );
143
145
/* Always disconnect the current connection on network error. */
144
146
mongoc_cluster_disconnect_node (cluster , server_id );
@@ -1959,7 +1961,6 @@ _mongoc_cluster_node_dtor (void *data_, void *ctx_)
1959
1961
1960
1962
static mongoc_cluster_node_t *
1961
1963
_mongoc_cluster_node_new (mongoc_stream_t * stream ,
1962
- uint32_t generation ,
1963
1964
const char * connection_address )
1964
1965
{
1965
1966
mongoc_cluster_node_t * node ;
@@ -1972,7 +1973,6 @@ _mongoc_cluster_node_new (mongoc_stream_t *stream,
1972
1973
1973
1974
node -> stream = stream ;
1974
1975
node -> connection_address = bson_strdup (connection_address );
1975
- node -> generation = generation ;
1976
1976
1977
1977
return node ;
1978
1978
}
@@ -2065,7 +2065,6 @@ _mongoc_cluster_finish_speculative_auth (
2065
2065
*/
2066
2066
static mongoc_cluster_node_t *
2067
2067
_mongoc_cluster_add_node (mongoc_cluster_t * cluster ,
2068
- uint32_t generation ,
2069
2068
uint32_t server_id ,
2070
2069
bson_error_t * error /* OUT */ )
2071
2070
{
@@ -2104,7 +2103,7 @@ _mongoc_cluster_add_node (mongoc_cluster_t *cluster,
2104
2103
2105
2104
/* take critical fields from a fresh hello */
2106
2105
cluster_node =
2107
- _mongoc_cluster_node_new (stream , generation , host -> host_and_port );
2106
+ _mongoc_cluster_node_new (stream , host -> host_and_port );
2108
2107
2109
2108
handshake_sd = _mongoc_cluster_run_hello (cluster ,
2110
2109
cluster_node ,
@@ -2140,10 +2139,14 @@ _mongoc_cluster_add_node (mongoc_cluster_t *cluster,
2140
2139
2141
2140
/* Transfer ownership of the server description into the cluster node. */
2142
2141
cluster_node -> handshake_sd = handshake_sd ;
2143
- /* Copy the generation from the cluster node .
2142
+ /* Copy the latest connection pool generation .
2144
2143
* TODO (CDRIVER-4078) do not store the generation counter on the server
2145
2144
* description */
2146
- cluster_node -> handshake_sd -> generation = generation ;
2145
+ bson_mutex_lock (& cluster -> client -> topology -> mutex );
2146
+ cluster_node -> handshake_sd -> generation =
2147
+ _mongoc_topology_get_connection_pool_generation (
2148
+ cluster -> client -> topology , server_id , & handshake_sd -> service_id );
2149
+ bson_mutex_unlock (& cluster -> client -> topology -> mutex );
2147
2150
2148
2151
bson_destroy (& speculative_auth_response );
2149
2152
mongoc_set_add (cluster -> nodes , server_id , cluster_node );
@@ -2268,27 +2271,39 @@ _mongoc_cluster_stream_for_server (mongoc_cluster_t *cluster,
2268
2271
* into account.
2269
2272
*/
2270
2273
2274
+ /* Add a transient transaction label if applicable. */
2275
+ _mongoc_bson_init_with_transient_txn_error (cs , reply );
2276
+
2277
+ /* When establishing a new connection in load balanced mode, drivers MUST
2278
+ * NOT perform SDAM error handling for any errors that occur before the
2279
+ * MongoDB Handshake. */
2280
+ bson_mutex_lock (& topology -> mutex );
2281
+ if (topology -> description .type == MONGOC_TOPOLOGY_LOAD_BALANCED ) {
2282
+ bson_mutex_unlock (& topology -> mutex );
2283
+ return NULL ;
2284
+ }
2285
+ bson_mutex_unlock (& topology -> mutex );
2286
+
2271
2287
mongoc_topology_invalidate_server (topology , server_id , err_ptr );
2272
2288
mongoc_cluster_disconnect_node (cluster , server_id );
2273
2289
bson_mutex_lock (& topology -> mutex );
2274
- _mongoc_topology_clear_connection_pool (topology , server_id );
2290
+ /* This is not load balanced mode, so there are no service IDs associated
2291
+ * with connections. Pass kZeroServiceId to clear the entire connection
2292
+ * pool to this server. */
2293
+ _mongoc_topology_clear_connection_pool (topology , server_id , & kZeroServiceId );
2275
2294
if (!topology -> single_threaded ) {
2276
2295
_mongoc_topology_background_monitoring_cancel_check (topology ,
2277
2296
server_id );
2278
2297
}
2279
2298
bson_mutex_unlock (& topology -> mutex );
2280
- _mongoc_bson_init_with_transient_txn_error (cs , reply );
2281
2299
return NULL ;
2282
2300
}
2283
2301
2284
2302
/* If this is a load balanced topology and the server stream does not have a
2285
2303
* service id, disconnect and return an error. */
2286
2304
bson_mutex_lock (& topology -> mutex );
2287
2305
if (topology -> description .type == MONGOC_TOPOLOGY_LOAD_BALANCED ) {
2288
- bson_oid_t service_id ;
2289
-
2290
- if (!mongoc_server_description_service_id (server_stream -> sd ,
2291
- & service_id )) {
2306
+ if (!mongoc_server_description_has_service_id (server_stream -> sd )) {
2292
2307
bson_set_error (error ,
2293
2308
MONGOC_ERROR_CLIENT ,
2294
2309
MONGOC_ERROR_CLIENT_INVALID_LOAD_BALANCER ,
@@ -2380,7 +2395,6 @@ mongoc_cluster_fetch_stream_single (mongoc_cluster_t *cluster,
2380
2395
bson_error_t * error /* OUT */ )
2381
2396
{
2382
2397
mongoc_topology_t * topology ;
2383
- mongoc_server_description_t * monitor_sd ;
2384
2398
mongoc_server_description_t * handshake_sd ;
2385
2399
mongoc_topology_scanner_node_t * scanner_node ;
2386
2400
char * address ;
@@ -2482,16 +2496,11 @@ mongoc_cluster_fetch_stream_single (mongoc_cluster_t *cluster,
2482
2496
scanner_node -> has_auth = true;
2483
2497
}
2484
2498
2485
- /* Always copy the latest generation from the shared server description. */
2486
- monitor_sd = mongoc_topology_server_by_id (topology , server_id , error );
2487
- if (!monitor_sd ) {
2488
- mongoc_server_description_destroy (handshake_sd );
2489
- return NULL ;
2490
- }
2491
- /* TODO: (CDRIVER-4078) do not store the generation counter as part of the
2492
- * server description. */
2493
- handshake_sd -> generation = monitor_sd -> generation ;
2494
- mongoc_server_description_destroy (monitor_sd );
2499
+ /* Copy the latest connection pool generation.
2500
+ * TODO (CDRIVER-4078) do not store the generation counter on the server
2501
+ * description */
2502
+ handshake_sd -> generation = _mongoc_topology_get_connection_pool_generation (
2503
+ cluster -> client -> topology , server_id , & handshake_sd -> service_id );
2495
2504
2496
2505
return mongoc_server_stream_new (
2497
2506
& topology -> description , handshake_sd , scanner_node -> stream );
@@ -2540,7 +2549,10 @@ mongoc_cluster_stream_valid (mongoc_cluster_t *cluster,
2540
2549
bson_mutex_lock (& topology -> mutex );
2541
2550
sd = mongoc_topology_description_server_by_id (
2542
2551
& topology -> description , server_stream -> sd -> id , & error );
2543
- if (!sd || server_stream -> sd -> generation < sd -> generation ) {
2552
+ if (!sd ||
2553
+ server_stream -> sd -> generation <
2554
+ _mongoc_topology_get_connection_pool_generation (
2555
+ topology , server_stream -> sd -> id , & server_stream -> sd -> service_id )) {
2544
2556
/* No server description, or the pool has been cleared. */
2545
2557
bson_mutex_unlock (& topology -> mutex );
2546
2558
goto done ;
@@ -2585,7 +2597,6 @@ mongoc_cluster_fetch_stream_pooled (mongoc_cluster_t *cluster,
2585
2597
mongoc_cluster_node_t * cluster_node ;
2586
2598
mongoc_server_description_t * sd ;
2587
2599
bool has_server_description = false;
2588
- uint32_t generation = 0 ;
2589
2600
2590
2601
cluster_node =
2591
2602
(mongoc_cluster_node_t * ) mongoc_set_get (cluster -> nodes , server_id );
@@ -2596,14 +2607,21 @@ mongoc_cluster_fetch_stream_pooled (mongoc_cluster_t *cluster,
2596
2607
& topology -> description , server_id , error );
2597
2608
if (sd ) {
2598
2609
has_server_description = true;
2599
- generation = sd -> generation ;
2600
2610
}
2601
2611
bson_mutex_unlock (& topology -> mutex );
2602
2612
2603
2613
if (cluster_node ) {
2614
+ uint32_t connection_pool_generation = 0 ;
2604
2615
BSON_ASSERT (cluster_node -> stream );
2605
2616
2606
- if (!has_server_description || cluster_node -> generation < generation ) {
2617
+ bson_mutex_lock (& topology -> mutex );
2618
+ connection_pool_generation =
2619
+ _mongoc_topology_get_connection_pool_generation (
2620
+ topology , server_id , & cluster_node -> handshake_sd -> service_id );
2621
+ bson_mutex_unlock (& topology -> mutex );
2622
+
2623
+ if (!has_server_description ||
2624
+ cluster_node -> handshake_sd -> generation < connection_pool_generation ) {
2607
2625
/* Since the stream was created, connections to this server were
2608
2626
* invalidated.
2609
2627
* This may have happened if:
@@ -2626,7 +2644,7 @@ mongoc_cluster_fetch_stream_pooled (mongoc_cluster_t *cluster,
2626
2644
}
2627
2645
2628
2646
cluster_node =
2629
- _mongoc_cluster_add_node (cluster , generation , server_id , error );
2647
+ _mongoc_cluster_add_node (cluster , server_id , error );
2630
2648
if (cluster_node ) {
2631
2649
return _mongoc_cluster_create_server_stream (
2632
2650
topology , cluster_node -> handshake_sd , cluster_node -> stream , error );
0 commit comments