Skip to content

Commit 370fc18

Browse files
committed
CDRIVER-3625 monitor with a thread-per-server
For a client pool, servers are now scanned independently using a separate thread per server. SRV polling is now done on a separate thread.
1 parent 6cb7999 commit 370fc18

20 files changed

+2153
-558
lines changed

.evergreen/compile-unix.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,10 @@ mkfifo pipe || true
262262
if [ -e pipe ]; then
263263
set +o xtrace
264264
tee error.log < pipe &
265-
run_valgrind ./src/libmongoc/test-libmongoc -d -F test-results.json 2>pipe
265+
run_valgrind ./src/libmongoc/test-libmongoc --no-fork -d -F test-results.json 2>pipe
266266
rm pipe
267267
else
268-
run_valgrind ./src/libmongoc/test-libmongoc -d -F test-results.json
268+
run_valgrind ./src/libmongoc/test-libmongoc --no-fork -d -F test-results.json
269269
fi
270270

271271
# Check if the error.log exists, and is more than 0 byte

.evergreen/run-tests.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ case "$OS" in
9393
check_mongocryptd
9494

9595
chmod +x src/libmongoc/Debug/test-libmongoc.exe
96-
./src/libmongoc/Debug/test-libmongoc.exe $TEST_ARGS
96+
./src/libmongoc/Debug/test-libmongoc.exe $TEST_ARGS -d
9797
;;
9898

9999
*)
@@ -104,9 +104,9 @@ case "$OS" in
104104

105105
if [ "$VALGRIND" = "on" ]; then
106106
. $DIR/valgrind.sh
107-
run_valgrind ./src/libmongoc/test-libmongoc --no-fork $TEST_ARGS
107+
run_valgrind ./src/libmongoc/test-libmongoc --no-fork $TEST_ARGS -d
108108
else
109-
./src/libmongoc/test-libmongoc --no-fork $TEST_ARGS
109+
./src/libmongoc/test-libmongoc --no-fork $TEST_ARGS -d
110110
fi
111111

112112
;;

src/libmongoc/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@ set (SOURCES ${SOURCES}
542542
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-gridfs-upload.c
543543
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-socket.c
544544
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology.c
545+
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-background-monitoring.c
545546
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-description.c
546547
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-description-apm.c
547548
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-scanner.c
@@ -870,6 +871,7 @@ set (test-libmongoc-sources
870871
${PROJECT_SOURCE_DIR}/tests/test-mongoc-array.c
871872
${PROJECT_SOURCE_DIR}/tests/test-mongoc-async.c
872873
${PROJECT_SOURCE_DIR}/tests/test-mongoc-aws.c
874+
${PROJECT_SOURCE_DIR}/tests/test-mongoc-background-monitoring.c
873875
${PROJECT_SOURCE_DIR}/tests/test-mongoc-buffer.c
874876
${PROJECT_SOURCE_DIR}/tests/test-mongoc-bulk.c
875877
${PROJECT_SOURCE_DIR}/tests/test-mongoc-change-stream.c

src/libmongoc/src/mongoc/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ set (src_libmongoc_src_mongoc_DIST_noinst_hs
157157
mongoc-topology-description-apm-private.h
158158
mongoc-topology-description-private.h
159159
mongoc-topology-private.h
160+
mongoc-topology-background-monitoring-private.h
160161
mongoc-topology-scanner-private.h
161162
mongoc-trace-private.h
162163
mongoc-uri-private.h
@@ -172,6 +173,7 @@ set (src_libmongoc_src_mongoc_DIST_cs
172173
mongoc-array.c
173174
mongoc-async.c
174175
mongoc-async-cmd.c
176+
mongoc-topology-background-monitoring.c
175177
mongoc-buffer.c
176178
mongoc-bulk-operation.c
177179
mongoc-change-stream.c

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "mongoc-queue-private.h"
2626
#include "mongoc-thread-private.h"
2727
#include "mongoc-topology-private.h"
28+
#include "mongoc-topology-background-monitoring-private.h"
2829
#include "mongoc-trace-private.h"
2930

3031
#ifdef MONGOC_ENABLE_SSL
@@ -218,9 +219,10 @@ mongoc_client_pool_destroy (mongoc_client_pool_t *pool)
218219
static void
219220
_start_scanner_if_needed (mongoc_client_pool_t *pool)
220221
{
221-
if (!_mongoc_topology_start_background_scanner (pool->topology)) {
222-
MONGOC_ERROR ("Background scanner did not start!");
223-
abort ();
222+
if (!pool->topology->single_threaded) {
223+
bson_mutex_lock (&pool->topology->mutex);
224+
_mongoc_topology_background_monitoring_start (pool->topology);
225+
bson_mutex_unlock (&pool->topology->mutex);
224226
}
225227
}
226228

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,14 @@ mongoc_stream_t *
233233
mongoc_client_connect_tcp (int32_t connecttimeoutms,
234234
const mongoc_host_list_t *host,
235235
bson_error_t *error);
236+
237+
mongoc_stream_t *
238+
mongoc_client_connect (bool buffered,
239+
bool use_ssl,
240+
void *ssl_opts_void,
241+
const mongoc_uri_t *uri,
242+
const mongoc_host_list_t *host,
243+
bson_error_t *error);
236244
BSON_END_DECLS
237245

238246
#endif /* MONGOC_CLIENT_PRIVATE_H */

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

Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ _mongoc_get_rr_search (const char *service,
560560
*
561561
* Fetch an SRV or TXT resource record and update put results in
562562
* @rr_data.
563-
*
563+
*
564564
* See RFCs 1464 and 2782, MongoDB's "Initial DNS Seedlist Discovery"
565565
* spec, and MongoDB's "Polling SRV Records for Mongos Discovery"
566566
* spec.
@@ -644,10 +644,12 @@ mongoc_client_connect_tcp (int32_t connecttimeoutms,
644644
hints.ai_flags = 0;
645645
hints.ai_protocol = 0;
646646

647+
TRACE ("DNS lookup for %s", host->host);
647648
s = getaddrinfo (host->host, portstr, &hints, &result);
648649

649650
if (s != 0) {
650651
mongoc_counter_dns_failure_inc ();
652+
TRACE ("Failed to resolve %s", host->host);
651653
bson_set_error (error,
652654
MONGOC_ERROR_STREAM,
653655
MONGOC_ERROR_STREAM_NAME_RESOLUTION,
@@ -764,49 +766,26 @@ mongoc_client_connect_unix (const mongoc_host_list_t *host, bson_error_t *error)
764766
#endif
765767
}
766768

767-
768-
/*
769-
*--------------------------------------------------------------------------
770-
*
771-
* mongoc_client_default_stream_initiator --
772-
*
773-
* A mongoc_stream_initiator_t that will handle the various type
774-
* of supported sockets by MongoDB including TCP and UNIX.
775-
*
776-
* Language binding authors may want to implement an alternate
777-
* version of this method to use their native stream format.
778-
*
779-
* Returns:
780-
* A mongoc_stream_t if successful; otherwise NULL and @error is set.
781-
*
782-
* Side effects:
783-
* @error is set if return value is NULL.
784-
*
785-
*--------------------------------------------------------------------------
786-
*/
787-
788769
mongoc_stream_t *
789-
mongoc_client_default_stream_initiator (const mongoc_uri_t *uri,
790-
const mongoc_host_list_t *host,
791-
void *user_data,
792-
bson_error_t *error)
770+
mongoc_client_connect (bool buffered,
771+
bool use_ssl,
772+
void *ssl_opts_void,
773+
const mongoc_uri_t *uri,
774+
const mongoc_host_list_t *host,
775+
bson_error_t *error)
793776
{
794777
mongoc_stream_t *base_stream = NULL;
795778
int32_t connecttimeoutms;
796-
#ifdef MONGOC_ENABLE_SSL
797-
mongoc_client_t *client = (mongoc_client_t *) user_data;
798-
const char *mechanism;
799-
#endif
800779

801780
BSON_ASSERT (uri);
802781
BSON_ASSERT (host);
803782

804783
#ifndef MONGOC_ENABLE_SSL
805-
if (mongoc_uri_get_tls (uri)) {
784+
if (ssl_opts_void || mongoc_uri_get_tls (uri)) {
806785
bson_set_error (error,
807786
MONGOC_ERROR_CLIENT,
808787
MONGOC_ERROR_CLIENT_NO_ACCEPTABLE_PEER,
809-
"SSL is not enabled in this build of mongo-c-driver.");
788+
"TLS is not enabled in this build of mongo-c-driver.");
810789
return NULL;
811790
}
812791
#endif
@@ -836,14 +815,17 @@ mongoc_client_default_stream_initiator (const mongoc_uri_t *uri,
836815

837816
#ifdef MONGOC_ENABLE_SSL
838817
if (base_stream) {
818+
mongoc_ssl_opt_t *ssl_opts;
819+
const char *mechanism;
820+
821+
ssl_opts = (mongoc_ssl_opt_t *) ssl_opts_void;
839822
mechanism = mongoc_uri_get_auth_mechanism (uri);
840823

841-
if (client->use_ssl ||
842-
(mechanism && (0 == strcmp (mechanism, "MONGODB-X509")))) {
824+
if (use_ssl || (mechanism && (0 == strcmp (mechanism, "MONGODB-X509")))) {
843825
mongoc_stream_t *original = base_stream;
844826

845827
base_stream = mongoc_stream_tls_new_with_hostname (
846-
base_stream, host->host, &client->ssl_opts, true);
828+
base_stream, host->host, ssl_opts, true);
847829

848830
if (!base_stream) {
849831
mongoc_stream_destroy (original);
@@ -863,9 +845,54 @@ mongoc_client_default_stream_initiator (const mongoc_uri_t *uri,
863845
}
864846
#endif
865847

866-
return base_stream ? mongoc_stream_buffered_new (base_stream, 1024) : NULL;
848+
if (!base_stream) {
849+
return NULL;
850+
}
851+
if (buffered) {
852+
return mongoc_stream_buffered_new (base_stream, 1024);
853+
}
854+
return base_stream;
867855
}
868856

857+
/*
858+
*--------------------------------------------------------------------------
859+
*
860+
* mongoc_client_default_stream_initiator --
861+
*
862+
* A mongoc_stream_initiator_t that will handle the various type
863+
* of supported sockets by MongoDB including TCP and UNIX.
864+
*
865+
* Language binding authors may want to implement an alternate
866+
* version of this method to use their native stream format.
867+
*
868+
* Returns:
869+
* A mongoc_stream_t if successful; otherwise NULL and @error is set.
870+
*
871+
* Side effects:
872+
* @error is set if return value is NULL.
873+
*
874+
*--------------------------------------------------------------------------
875+
*/
876+
877+
mongoc_stream_t *
878+
mongoc_client_default_stream_initiator (const mongoc_uri_t *uri,
879+
const mongoc_host_list_t *host,
880+
void *user_data,
881+
bson_error_t *error)
882+
{
883+
void *ssl_opts_void = NULL;
884+
bool use_ssl = false;
885+
#ifdef MONGOC_ENABLE_SSL
886+
mongoc_client_t *client = (mongoc_client_t *) user_data;
887+
888+
use_ssl = client->use_ssl;
889+
ssl_opts_void = (void *) &client->ssl_opts;
890+
891+
#endif
892+
893+
return mongoc_client_connect (
894+
true, use_ssl, ssl_opts_void, uri, host, error);
895+
}
869896

870897
/*
871898
*--------------------------------------------------------------------------
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
/*
3+
* Copyright 2020-present MongoDB, Inc.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
#include "mongoc-prelude.h"
19+
20+
#ifndef MONGOC_TOPOLOGY_BACKGROUND_MONITORING_PRIVATE_H
21+
#define MONGOC_TOPOLOGY_BACKGROUND_MONITORING_PRIVATE_H
22+
23+
/* Methods of mongoc_topology_t for managing background monitoring. */
24+
25+
struct _mongoc_topology_t;
26+
27+
void
28+
_mongoc_topology_background_monitoring_start (
29+
struct _mongoc_topology_t *topology);
30+
31+
void
32+
_mongoc_topology_background_monitoring_reconcile (
33+
struct _mongoc_topology_t *topology);
34+
35+
void
36+
_mongoc_topology_background_monitoring_request_scan (
37+
struct _mongoc_topology_t *topology);
38+
39+
void
40+
_mongoc_topology_background_monitoring_stop (
41+
struct _mongoc_topology_t *topology);
42+
43+
#endif /* MONGOC_TOPOLOGY_BACKGROUND_MONITORING_PRIVATE_H */

0 commit comments

Comments
 (0)