Skip to content

Commit 6a757da

Browse files
committed
Append topology type to error
1 parent 68a4b10 commit 6a757da

9 files changed

+37
-69
lines changed

src/libbson/tests/test-bcon-basic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ test_int32 (void)
293293
bson_init (&bcon);
294294
bson_init (&expected);
295295

296-
bson_append_int32 (&expected, "foobar", 3, 100);
296+
bson_append_int32 (&expected, "foo", -1, 100);
297297

298298
BCON_APPEND (&bcon, "foo", BCON_INT32 (100));
299299

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,8 @@ _mongoc_error_is_server (const bson_error_t *error);
9797
bool
9898
_mongoc_error_is_auth (const bson_error_t *error);
9999

100+
/* Try to append `s` to `error`. Truncates `s` if `error` is out of space. */
101+
void
102+
_mongoc_error_append (bson_error_t *error, const char *s);
103+
100104
BSON_END_DECLS

src/libmongoc/src/mongoc/mongoc-error.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,3 +327,12 @@ _mongoc_error_is_auth (const bson_error_t *error)
327327
return error->domain == MONGOC_ERROR_CLIENT &&
328328
error->code == MONGOC_ERROR_CLIENT_AUTHENTICATE;
329329
}
330+
331+
void
332+
_mongoc_error_append (bson_error_t *error, const char *s)
333+
{
334+
BSON_ASSERT (error);
335+
const size_t error_len = strlen (error->message);
336+
const size_t remaining = sizeof (error->message) - error_len;
337+
bson_strncpy (error->message + error_len, s, remaining);
338+
}

src/libmongoc/src/mongoc/mongoc-server-description-private.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,8 +241,4 @@ bool
241241
mongoc_server_description_has_service_id (
242242
const mongoc_server_description_t *description);
243243

244-
/* Generate human-readable description of the server */
245-
bson_string_t *
246-
mongoc_server_description_info (const mongoc_server_description_t *sd);
247-
248244
#endif

src/libmongoc/src/mongoc/mongoc-server-description.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,15 +1281,3 @@ mongoc_server_description_has_service_id (
12811281
}
12821282
return true;
12831283
}
1284-
1285-
bson_string_t *
1286-
mongoc_server_description_info (const mongoc_server_description_t *sd)
1287-
{
1288-
bson_string_t *info = bson_string_new (NULL);
1289-
bson_string_append_printf (info,
1290-
"%s server_type: %s, rtt: %ld",
1291-
sd->host.host_and_port,
1292-
mongoc_server_description_type (sd),
1293-
sd->round_trip_time_msec);
1294-
return info;
1295-
}

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ struct _mongoc_topology_description_t {
5555
* see Driver Sessions Spec. */
5656
bson_t cluster_time;
5757

58-
5958
/* smallest seen logicalSessionTimeoutMinutes, or -1 if any server has no
6059
* logicalSessionTimeoutMinutes. see Server Discovery and Monitoring Spec */
6160
int64_t session_timeout_minutes;
@@ -195,9 +194,4 @@ _mongoc_topology_description_clear_connection_pool (
195194
uint32_t server_id,
196195
const bson_oid_t *service_id);
197196

198-
199-
/* Generate human-readable description of the topology */
200-
bson_string_t *
201-
_mongoc_topology_description_info (const mongoc_topology_description_t *td);
202-
203197
#endif /* MONGOC_TOPOLOGY_DESCRIPTION_PRIVATE_H */

src/libmongoc/src/mongoc/mongoc-topology-description.c

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2602,32 +2602,3 @@ _mongoc_topology_description_clear_connection_pool (
26022602

26032603
mc_tpl_sd_increment_generation (sd, service_id);
26042604
}
2605-
2606-
bool
2607-
_append_server_info (void *sd, void *info)
2608-
{
2609-
bson_string_t *server_info =
2610-
mongoc_server_description_info ((mongoc_server_description_t *) sd);
2611-
bson_string_append_printf (
2612-
(bson_string_t *) info, "<%s>, ", server_info->str);
2613-
bson_string_free (server_info, true);
2614-
return true;
2615-
}
2616-
2617-
bson_string_t *
2618-
_mongoc_topology_description_info (const mongoc_topology_description_t *td)
2619-
{
2620-
bson_string_t *info = bson_string_new (NULL);
2621-
if (!td->_servers_ || td->_servers_->items_len == 0) {
2622-
bson_string_append (info, "No available servers.");
2623-
return info;
2624-
}
2625-
2626-
bson_string_append_printf (info,
2627-
"Topology type: %s, servers: [",
2628-
mongoc_topology_description_type (td));
2629-
mongoc_set_for_each (td->_servers_, _append_server_info, (void *) info);
2630-
bson_string_append_c (info, ']');
2631-
2632-
return info;
2633-
}

src/libmongoc/src/mongoc/mongoc-topology.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,6 +1168,9 @@ mongoc_topology_select_server_id (mongoc_topology_t *topology,
11681168
bool *must_use_primary,
11691169
bson_error_t *error)
11701170
{
1171+
static const char *timeout_msg =
1172+
"No suitable servers found: `serverSelectionTimeoutMS` expired";
1173+
11711174
mongoc_topology_scanner_t *ts;
11721175
int r;
11731176
int64_t local_threshold_ms;
@@ -1179,8 +1182,10 @@ mongoc_topology_select_server_id (mongoc_topology_t *topology,
11791182
int64_t heartbeat_msec;
11801183
uint32_t server_id;
11811184
mc_shared_tpld td = mc_tpld_take_ref (topology);
1182-
const char *timeout_msg =
1183-
"No suitable servers found: `serverSelectionTimeoutMS` expired.";
1185+
1186+
bson_string_t *topology_type = bson_string_new (". Topology type: ");
1187+
bson_string_append (topology_type,
1188+
mongoc_topology_description_type (td.ptr));
11841189

11851190
/* These names come from the Server Selection Spec pseudocode */
11861191
int64_t loop_start; /* when we entered this function */
@@ -1241,15 +1246,10 @@ mongoc_topology_select_server_id (mongoc_topology_t *topology,
12411246

12421247
if (scan_ready > expire_at && !try_once) {
12431248
/* selection timeout will expire before min heartbeat passes */
1244-
bson_string_t *topology_info =
1245-
_mongoc_topology_description_info (td.ptr);
1246-
bson_string_t *msg = bson_string_new_printf (
1247-
"%s %s", timeout_msg, topology_info->str);
1248-
_mongoc_server_selection_error (msg->str, &scanner_error, error);
1249+
_mongoc_server_selection_error (
1250+
timeout_msg, &scanner_error, error);
12491251

12501252
server_id = 0;
1251-
bson_string_free (topology_info, true);
1252-
bson_string_free (msg, true);
12531253
goto done;
12541254
}
12551255

@@ -1402,6 +1402,10 @@ mongoc_topology_select_server_id (mongoc_topology_t *topology,
14021402
}
14031403

14041404
done:
1405+
if (error) {
1406+
_mongoc_error_append (error, topology_type->str);
1407+
}
1408+
bson_string_free (topology_type, true);
14051409
mc_tpld_drop_ref (&td);
14061410
return server_id;
14071411
}
@@ -1977,7 +1981,6 @@ static void
19771981
_topology_collect_errors (const mongoc_topology_description_t *td,
19781982
bson_error_t *error_out)
19791983
{
1980-
// zz
19811984
const mongoc_server_description_t *server_description;
19821985
bson_string_t *error_message;
19831986

@@ -1993,9 +1996,8 @@ _topology_collect_errors (const mongoc_topology_description_t *td,
19931996
if (error_message->len > 0) {
19941997
bson_string_append_c (error_message, ' ');
19951998
}
1996-
bson_string_append_printf (error_message,
1997-
"[%s (SERVER TYPE)]",
1998-
server_description->error.message);
1999+
bson_string_append_printf (
2000+
error_message, "[%s]", server_description->error.message);
19992001
/* The last error's code and domain wins. */
20002002
error_out->code = error->code;
20012003
error_out->domain = error->domain;

src/libmongoc/tests/test-mongoc-server-selection-errors.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ test_server_selection_error_dns_direct_single (void)
9393
server_selection_error_dns (
9494
"mongodb://example-localhost.invalid:27017/",
9595
"No suitable servers found (`serverSelectionTryOnce` set): "
96-
"[Fake error for 'example-localhost.invalid']",
96+
"[Fake error for 'example-localhost.invalid']"
97+
". Topology type: Single",
9798
false,
9899
false);
99100
}
@@ -106,7 +107,8 @@ test_server_selection_error_dns_direct_pooled (void *ctx)
106107
server_selection_error_dns (
107108
"mongodb://example-localhost.invalid:27017/",
108109
"No suitable servers found: `serverSelectionTimeoutMS` expired: "
109-
"[Fake error for 'example-localhost.invalid']",
110+
"[Fake error for 'example-localhost.invalid']"
111+
". Topology type: Single",
110112
false,
111113
true);
112114
}
@@ -119,7 +121,8 @@ test_server_selection_error_dns_multi_fail_single (void)
119121
"example-localhost.invalid:27017,other-example-localhost.invalid:27017/",
120122
"No suitable servers found (`serverSelectionTryOnce` set):"
121123
" [Fake error for 'example-localhost.invalid']"
122-
" [Fake error for 'other-example-localhost.invalid']",
124+
" [Fake error for 'other-example-localhost.invalid']"
125+
". Topology type: Unknown",
123126
false,
124127
false);
125128
}
@@ -134,7 +137,8 @@ test_server_selection_error_dns_multi_fail_pooled (void *ctx)
134137
"example-localhost.invalid:27017,other-example-localhost.invalid:27017/",
135138
"No suitable servers found: `serverSelectionTimeoutMS` expired:"
136139
" [Fake error for 'example-localhost.invalid']"
137-
" [Fake error for 'other-example-localhost.invalid']",
140+
" [Fake error for 'other-example-localhost.invalid']"
141+
". Topology type: Unknown",
138142
false,
139143
true);
140144
}

0 commit comments

Comments
 (0)