Skip to content

Commit ab65efb

Browse files
authored
CDRIVER-4086 Implement srvServiceName for initial DNS seedlist and SRV polling (#916)
* Update MONGOC_URI_SRVMAXHOSTS to lowercase for consistency * Add support for parsing URI option srvServiceName * Update spec tests for srvServiceName * Add documentation for mongoc_uri_get_srv_service_name() * Add support for srvServiceName in DNS seedlist discovery * Add mongoc_uri_get_srv_hostname() * Replace and rename SRV "service" with "hostname"
1 parent b42543c commit ab65efb

14 files changed

+299
-80
lines changed

src/libmongoc/doc/mongoc_uri_get_service.rst

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,22 @@ Synopsis
99
.. code-block:: c
1010
1111
const char *
12-
mongoc_uri_get_service (const mongoc_uri_t *uri);
12+
mongoc_uri_get_service (const mongoc_uri_t *uri)
13+
BSON_GNUC_DEPRECATED_FOR (mongoc_uri_get_srv_hostname);
1314
1415
Parameters
1516
----------
1617

1718
* ``uri``: A :symbol:`mongoc_uri_t`.
1819

19-
Description
20-
-----------
20+
Deprecated
21+
----------
22+
23+
This function is deprecated and should not be used in new code.
24+
25+
Please use :symbol:`mongoc_uri_get_srv_hostname()` instead.
2126

22-
Returns the SRV service name of a MongoDB URI.
27+
Returns the SRV host and domain name of a MongoDB URI.
2328

2429
Returns
2530
-------
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
:man_page: mongoc_uri_get_srv_hostname
2+
3+
mongoc_uri_get_srv_hostname()
4+
=============================
5+
6+
Synopsis
7+
--------
8+
9+
.. code-block:: c
10+
11+
const char *
12+
mongoc_uri_get_srv_hostname (const mongoc_uri_t *uri);
13+
14+
Parameters
15+
----------
16+
17+
* ``uri``: A :symbol:`mongoc_uri_t`.
18+
19+
Description
20+
-----------
21+
22+
Returns the SRV host and domain name of a MongoDB URI.
23+
24+
Returns
25+
-------
26+
27+
A string if this URI's scheme is "mongodb+srv://", or NULL if the scheme is "mongodb://".
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
:man_page: mongoc_uri_get_srv_service_name
2+
3+
mongoc_uri_get_srv_service_name()
4+
=================================
5+
6+
Synopsis
7+
--------
8+
9+
.. code-block:: c
10+
11+
const char *
12+
mongoc_uri_get_srv_service_name (const mongoc_uri_t *uri);
13+
14+
Parameters
15+
----------
16+
17+
* ``uri``: A :symbol:`mongoc_uri_t`.
18+
19+
Description
20+
-----------
21+
22+
Returns the SRV service name of a MongoDB URI.
23+
24+
Returns
25+
-------
26+
27+
A string corresponding to the value of the srvServiceName URI option if present. Otherwise, the default value "mongodb".

src/libmongoc/doc/mongoc_uri_t.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,8 @@ MONGOC_URI_SAFE safe {tr
302302
mongoc_uri_get_service
303303
mongoc_uri_get_ssl
304304
mongoc_uri_get_string
305+
mongoc_uri_get_srv_hostname
306+
mongoc_uri_get_srv_service_name
305307
mongoc_uri_get_tls
306308
mongoc_uri_get_username
307309
mongoc_uri_get_write_concern

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ BSON_STATIC_ASSERT2 (mongoc_cmd_rw,
154154
* There is no reason these should be in mongoc-client. */
155155
#define MONGOC_RR_DEFAULT_BUFFER_SIZE 1024
156156
bool
157-
_mongoc_client_get_rr (const char *service,
157+
_mongoc_client_get_rr (const char *hostname,
158158
mongoc_rr_type_t rr_type,
159159
mongoc_rr_data_t *rr_data,
160160
size_t initial_buffer_size,

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

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,13 @@ _mongoc_client_killcursors_command (mongoc_cluster_t *cluster,
103103

104104
#ifdef MONGOC_HAVE_DNSAPI
105105

106-
typedef bool (*mongoc_rr_callback_t) (const char *service,
106+
typedef bool (*mongoc_rr_callback_t) (const char *hostname,
107107
PDNS_RECORD pdns,
108108
mongoc_rr_data_t *rr_data,
109109
bson_error_t *error);
110110

111111
static bool
112-
srv_callback (const char *service,
112+
srv_callback (const char *hostname,
113113
PDNS_RECORD pdns,
114114
mongoc_rr_data_t *rr_data,
115115
bson_error_t *error)
@@ -132,7 +132,7 @@ srv_callback (const char *service,
132132

133133
/* rr_data is unused, but here to match srv_callback signature */
134134
static bool
135-
txt_callback (const char *service,
135+
txt_callback (const char *hostname,
136136
PDNS_RECORD pdns,
137137
mongoc_rr_data_t *rr_data,
138138
bson_error_t *error)
@@ -178,7 +178,7 @@ txt_callback (const char *service,
178178
*/
179179

180180
static bool
181-
_mongoc_get_rr_dnsapi (const char *service,
181+
_mongoc_get_rr_dnsapi (const char *hostname,
182182
mongoc_rr_type_t rr_type,
183183
mongoc_rr_data_t *rr_data,
184184
bson_error_t *error)
@@ -209,7 +209,7 @@ _mongoc_get_rr_dnsapi (const char *service,
209209
callback = txt_callback;
210210
}
211211

212-
res = DnsQuery_UTF8 (service,
212+
res = DnsQuery_UTF8 (hostname,
213213
nst,
214214
DNS_QUERY_BYPASS_CACHE,
215215
NULL /* IP Address */,
@@ -229,17 +229,17 @@ _mongoc_get_rr_dnsapi (const char *service,
229229
0)) {
230230
DNS_ERROR ("Failed to look up %s record \"%s\": %s",
231231
rr_type_name,
232-
service,
232+
hostname,
233233
(char *) lpMsgBuf);
234234
}
235235

236236
DNS_ERROR ("Failed to look up %s record \"%s\": Unknown error",
237237
rr_type_name,
238-
service);
238+
hostname);
239239
}
240240

241241
if (!pdns) {
242-
DNS_ERROR ("No %s records for \"%s\"", rr_type_name, service);
242+
DNS_ERROR ("No %s records for \"%s\"", rr_type_name, hostname);
243243
}
244244

245245
i = 0;
@@ -252,7 +252,7 @@ _mongoc_get_rr_dnsapi (const char *service,
252252
/* Initial DNS Seedlist Discovery Spec: a client "MUST raise an
253253
error when multiple TXT records are encountered". */
254254
callback_success = false;
255-
DNS_ERROR ("Multiple TXT records for \"%s\"", service);
255+
DNS_ERROR ("Multiple TXT records for \"%s\"", hostname);
256256
}
257257

258258
if (rr_data) {
@@ -261,7 +261,7 @@ _mongoc_get_rr_dnsapi (const char *service,
261261
}
262262
}
263263

264-
if (!callback (service, pdns, rr_data, error)) {
264+
if (!callback (hostname, pdns, rr_data, error)) {
265265
callback_success = false;
266266
GOTO (done);
267267
}
@@ -275,7 +275,7 @@ _mongoc_get_rr_dnsapi (const char *service,
275275

276276
rr_data->count = i;
277277
if (i == 0) {
278-
DNS_ERROR ("No matching %s records for \"%s\"", rr_type_name, service);
278+
DNS_ERROR ("No matching %s records for \"%s\"", rr_type_name, hostname);
279279
}
280280
dns_success = true;
281281

@@ -293,7 +293,7 @@ _mongoc_get_rr_dnsapi (const char *service,
293293

294294
#elif (defined(MONGOC_HAVE_RES_NSEARCH) || defined(MONGOC_HAVE_RES_SEARCH))
295295

296-
typedef bool (*mongoc_rr_callback_t) (const char *service,
296+
typedef bool (*mongoc_rr_callback_t) (const char *hostname,
297297
ns_msg *ns_answer,
298298
ns_rr *rr,
299299
mongoc_rr_data_t *rr_data,
@@ -318,7 +318,7 @@ _mongoc_hstrerror (int code)
318318
}
319319

320320
static bool
321-
srv_callback (const char *service,
321+
srv_callback (const char *hostname,
322322
ns_msg *ns_answer,
323323
ns_rr *rr,
324324
mongoc_rr_data_t *rr_data,
@@ -345,7 +345,7 @@ srv_callback (const char *service,
345345

346346
if (size < 1) {
347347
DNS_ERROR ("Invalid record in SRV answer for \"%s\": \"%s\"",
348-
service,
348+
hostname,
349349
_mongoc_hstrerror (h_errno));
350350
}
351351

@@ -360,7 +360,7 @@ srv_callback (const char *service,
360360
}
361361

362362
static bool
363-
txt_callback (const char *service,
363+
txt_callback (const char *hostname,
364364
ns_msg *ns_answer,
365365
ns_rr *rr,
366366
mongoc_rr_data_t *rr_data,
@@ -375,7 +375,7 @@ txt_callback (const char *service,
375375

376376
total = (uint16_t) ns_rr_rdlen (*rr);
377377
if (total < 1 || total > 255) {
378-
DNS_ERROR ("Invalid TXT record size %hu for \"%s\"", total, service);
378+
DNS_ERROR ("Invalid TXT record size %hu for \"%s\"", total, hostname);
379379
}
380380

381381
/* a TXT record has one or more strings, each up to 255 chars, each is
@@ -426,7 +426,7 @@ txt_callback (const char *service,
426426
*/
427427

428428
static bool
429-
_mongoc_get_rr_search (const char *service,
429+
_mongoc_get_rr_search (const char *hostname,
430430
mongoc_rr_type_t rr_type,
431431
mongoc_rr_data_t *rr_data,
432432
size_t initial_buffer_size,
@@ -483,26 +483,26 @@ _mongoc_get_rr_search (const char *service,
483483
/* thread-safe */
484484
res_ninit (&state);
485485
size =
486-
res_nsearch (&state, service, ns_c_in, nst, search_buf, buffer_size);
486+
res_nsearch (&state, hostname, ns_c_in, nst, search_buf, buffer_size);
487487
#elif defined(MONGOC_HAVE_RES_SEARCH)
488-
size = res_search (service, ns_c_in, nst, search_buf, buffer_size);
488+
size = res_search (hostname, ns_c_in, nst, search_buf, buffer_size);
489489
#endif
490490

491491
if (size < 0) {
492492
DNS_ERROR ("Failed to look up %s record \"%s\": %s",
493493
rr_type_name,
494-
service,
494+
hostname,
495495
_mongoc_hstrerror (h_errno));
496496
}
497497
} while (size >= buffer_size);
498498

499499
if (ns_initparse (search_buf, size, &ns_answer)) {
500-
DNS_ERROR ("Invalid %s answer for \"%s\"", rr_type_name, service);
500+
DNS_ERROR ("Invalid %s answer for \"%s\"", rr_type_name, hostname);
501501
}
502502

503503
n = ns_msg_count (ns_answer, ns_s_an);
504504
if (!n) {
505-
DNS_ERROR ("No %s records for \"%s\"", rr_type_name, service);
505+
DNS_ERROR ("No %s records for \"%s\"", rr_type_name, hostname);
506506
}
507507

508508
rr_data->count = n;
@@ -512,7 +512,7 @@ _mongoc_get_rr_search (const char *service,
512512
DNS_ERROR ("Invalid record %d of %s answer for \"%s\": \"%s\"",
513513
i,
514514
rr_type_name,
515-
service,
515+
hostname,
516516
_mongoc_hstrerror (h_errno));
517517
}
518518

@@ -532,7 +532,7 @@ _mongoc_get_rr_search (const char *service,
532532
/* Initial DNS Seedlist Discovery Spec: a client "MUST raise an error
533533
* when multiple TXT records are encountered". */
534534
callback_success = false;
535-
DNS_ERROR ("Multiple TXT records for \"%s\"", service);
535+
DNS_ERROR ("Multiple TXT records for \"%s\"", hostname);
536536
}
537537

538538
num_matching_records++;
@@ -542,14 +542,14 @@ _mongoc_get_rr_search (const char *service,
542542
rr_data->min_ttl = ttl;
543543
}
544544

545-
if (!callback (service, &ns_answer, &resource_record, rr_data, error)) {
545+
if (!callback (hostname, &ns_answer, &resource_record, rr_data, error)) {
546546
callback_success = false;
547547
GOTO (done);
548548
}
549549
}
550550

551551
if (num_matching_records == 0) {
552-
DNS_ERROR ("No matching %s records for \"%s\"", rr_type_name, service);
552+
DNS_ERROR ("No matching %s records for \"%s\"", rr_type_name, hostname);
553553
}
554554

555555
dns_success = true;
@@ -595,7 +595,7 @@ _mongoc_get_rr_search (const char *service,
595595
*/
596596

597597
bool
598-
_mongoc_client_get_rr (const char *service,
598+
_mongoc_client_get_rr (const char *hostname,
599599
mongoc_rr_type_t rr_type,
600600
mongoc_rr_data_t *rr_data,
601601
size_t initial_buffer_size,
@@ -604,10 +604,10 @@ _mongoc_client_get_rr (const char *service,
604604
BSON_ASSERT (rr_data);
605605

606606
#ifdef MONGOC_HAVE_DNSAPI
607-
return _mongoc_get_rr_dnsapi (service, rr_type, rr_data, error);
607+
return _mongoc_get_rr_dnsapi (hostname, rr_type, rr_data, error);
608608
#elif (defined(MONGOC_HAVE_RES_NSEARCH) || defined(MONGOC_HAVE_RES_SEARCH))
609609
return _mongoc_get_rr_search (
610-
service, rr_type, rr_data, initial_buffer_size, error);
610+
hostname, rr_type, rr_data, initial_buffer_size, error);
611611
#else
612612
bson_set_error (error,
613613
MONGOC_ERROR_STREAM,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ MONGOC_DECL_SPECIAL_TS_POOL (
8181
NULL,
8282
NULL)
8383

84-
typedef bool (*_mongoc_rr_resolver_fn) (const char *service,
84+
typedef bool (*_mongoc_rr_resolver_fn) (const char *hostname,
8585
mongoc_rr_type_t rr_type,
8686
mongoc_rr_data_t *rr_data,
8787
size_t initial_buffer_size,

0 commit comments

Comments
 (0)