Skip to content

Commit 646ebed

Browse files
committed
Improve handling of server API on pooled clients
1 parent af3e4cd commit 646ebed

File tree

5 files changed

+19
-9
lines changed

5 files changed

+19
-9
lines changed

src/libmongoc/src/mongoc/mongoc-client-pool.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ struct _mongoc_client_pool_t {
5151
int32_t error_api_version;
5252
bool error_api_set;
5353
mongoc_server_api_t *api;
54+
bool client_initialized;
5455
};
5556

5657

@@ -240,12 +241,13 @@ _initialize_new_client (mongoc_client_pool_t *pool, mongoc_client_t *client)
240241
pool->topology->scanner->initiator,
241242
pool->topology->scanner->initiator_context);
242243

244+
pool->client_initialized = true;
245+
client->is_pooled = true;
243246
client->error_api_version = pool->error_api_version;
244247
_mongoc_client_set_apm_callbacks_private (
245248
client, &pool->apm_callbacks, pool->apm_context);
246249

247250
client->api = mongoc_server_api_copy (pool->api);
248-
client->api_set = true;
249251

250252
#ifdef MONGOC_ENABLE_SSL
251253
if (pool->ssl_opts_set) {
@@ -529,7 +531,7 @@ mongoc_client_pool_set_server_api (mongoc_client_pool_t *pool,
529531
return false;
530532
}
531533

532-
if (mongoc_client_pool_get_size (pool)) {
534+
if (pool->client_initialized) {
533535
bson_set_error (error,
534536
MONGOC_ERROR_POOL,
535537
MONGOC_ERROR_POOL_API_TOO_LATE,

src/libmongoc/src/mongoc/mongoc-client-private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ struct _mongoc_client_t {
9797
mongoc_uri_t *uri;
9898
mongoc_cluster_t cluster;
9999
bool in_exhaust;
100+
bool is_pooled;
100101

101102
mongoc_stream_initiator_t initiator;
102103
void *initiator_data;
@@ -119,7 +120,6 @@ struct _mongoc_client_t {
119120
bool error_api_set;
120121

121122
mongoc_server_api_t *api;
122-
bool api_set;
123123

124124
/* mongoc_client_session_t's in use, to look up lsids and clusterTimes */
125125
mongoc_set_t *client_sessions;

src/libmongoc/src/mongoc/mongoc-client.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3105,7 +3105,15 @@ mongoc_client_set_server_api (mongoc_client_t *client,
31053105
BSON_ASSERT_PARAM (client);
31063106
BSON_ASSERT_PARAM (api);
31073107

3108-
if (client->api_set) {
3108+
if (client->is_pooled) {
3109+
bson_set_error (error,
3110+
MONGOC_ERROR_CLIENT,
3111+
MONGOC_ERROR_CLIENT_API_FROM_POOL,
3112+
"Cannot set server api on a client checked out from a pool");
3113+
return false;
3114+
}
3115+
3116+
if (client->api) {
31093117
bson_set_error (error,
31103118
MONGOC_ERROR_CLIENT,
31113119
MONGOC_ERROR_CLIENT_API_ALREADY_SET,
@@ -3114,7 +3122,6 @@ mongoc_client_set_server_api (mongoc_client_t *client,
31143122
}
31153123

31163124
client->api = mongoc_server_api_copy (api);
3117-
client->api_set = true;
31183125
_mongoc_topology_scanner_set_server_api (client->topology->scanner, api);
31193126
return true;
31203127
}

src/libmongoc/src/mongoc/mongoc-error.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ typedef enum {
130130

131131
/* An error related to server version api */
132132
MONGOC_ERROR_CLIENT_API_ALREADY_SET,
133+
MONGOC_ERROR_CLIENT_API_FROM_POOL,
133134
MONGOC_ERROR_POOL_API_ALREADY_SET,
134135
MONGOC_ERROR_POOL_API_TOO_LATE
135136
} mongoc_error_code_t;

src/libmongoc/tests/test-mongoc-versioned-api.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ _test_mongoc_server_api_client_pool (void)
126126
ASSERT (!mongoc_client_set_server_api (client, api, &error));
127127
ASSERT_ERROR_CONTAINS (error,
128128
MONGOC_ERROR_CLIENT,
129-
MONGOC_ERROR_CLIENT_API_ALREADY_SET,
130-
"Cannot set server api more than once");
129+
MONGOC_ERROR_CLIENT_API_FROM_POOL,
130+
"Cannot set server api on a client checked out from a pool");
131131

132132
mongoc_client_pool_push (pool, client);
133133
mongoc_client_pool_destroy (pool);
@@ -163,8 +163,8 @@ _test_mongoc_server_api_client_pool_once (void)
163163
ASSERT (!mongoc_client_set_server_api (client, api, &error));
164164
ASSERT_ERROR_CONTAINS (error,
165165
MONGOC_ERROR_CLIENT,
166-
MONGOC_ERROR_CLIENT_API_ALREADY_SET,
167-
"Cannot set server api more than once");
166+
MONGOC_ERROR_CLIENT_API_FROM_POOL,
167+
"Cannot set server api on a client checked out from a pool");
168168

169169
mongoc_client_pool_push (pool, client);
170170
mongoc_client_pool_destroy (pool);

0 commit comments

Comments
 (0)