Skip to content

Commit d50f650

Browse files
authored
CDRIVER-4614 Include topology description in error messages (#1527)
1 parent 5959f64 commit d50f650

File tree

4 files changed

+29
-8
lines changed

4 files changed

+29
-8
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,8 @@ _mongoc_error_is_server (const bson_error_t *error);
8989
bool
9090
_mongoc_error_is_auth (const bson_error_t *error);
9191

92+
/* Try to append `s` to `error`. Truncates `s` if `error` is out of space. */
93+
void
94+
_mongoc_error_append (bson_error_t *error, const char *s);
95+
9296
BSON_END_DECLS

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,3 +311,12 @@ _mongoc_error_is_auth (const bson_error_t *error)
311311

312312
return error->domain == MONGOC_ERROR_CLIENT && error->code == MONGOC_ERROR_CLIENT_AUTHENTICATE;
313313
}
314+
315+
void
316+
_mongoc_error_append (bson_error_t *error, const char *s)
317+
{
318+
BSON_ASSERT (error);
319+
const size_t error_len = strlen (error->message);
320+
const size_t remaining = sizeof (error->message) - error_len;
321+
bson_strncpy (error->message + error_len, s, remaining);
322+
}

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,6 +1098,9 @@ mongoc_topology_select_server_id (mongoc_topology_t *topology,
10981098
uint32_t server_id;
10991099
mc_shared_tpld td = mc_tpld_take_ref (topology);
11001100

1101+
bson_string_t *topology_type = bson_string_new (". Topology type: ");
1102+
bson_string_append (topology_type, mongoc_topology_description_type (td.ptr));
1103+
11011104
/* These names come from the Server Selection Spec pseudocode */
11021105
int64_t loop_start; /* when we entered this function */
11031106
int64_t loop_end; /* when we last completed a loop (single-threaded) */
@@ -1153,10 +1156,7 @@ mongoc_topology_select_server_id (mongoc_topology_t *topology,
11531156

11541157
if (scan_ready > expire_at && !try_once) {
11551158
/* selection timeout will expire before min heartbeat passes */
1156-
_mongoc_server_selection_error ("No suitable servers found: "
1157-
"`serverselectiontimeoutms` timed out",
1158-
&scanner_error,
1159-
error);
1159+
_mongoc_server_selection_error (timeout_msg, &scanner_error, error);
11601160

11611161
server_id = 0;
11621162
goto done;
@@ -1301,6 +1301,10 @@ mongoc_topology_select_server_id (mongoc_topology_t *topology,
13011301
}
13021302

13031303
done:
1304+
if (error) {
1305+
_mongoc_error_append (error, topology_type->str);
1306+
}
1307+
bson_string_free (topology_type, true);
13041308
mc_tpld_drop_ref (&td);
13051309
return server_id;
13061310
}

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ test_server_selection_error_dns_direct_single (void)
8181
{
8282
server_selection_error_dns ("mongodb://example-localhost.invalid:27017/",
8383
"No suitable servers found (`serverSelectionTryOnce` set): "
84-
"[Fake error for 'example-localhost.invalid']",
84+
"[Fake error for 'example-localhost.invalid']"
85+
". Topology type: Single",
8586
false,
8687
false);
8788
}
@@ -93,7 +94,8 @@ test_server_selection_error_dns_direct_pooled (void *ctx)
9394

9495
server_selection_error_dns ("mongodb://example-localhost.invalid:27017/",
9596
"No suitable servers found: `serverSelectionTimeoutMS` expired: "
96-
"[Fake error for 'example-localhost.invalid']",
97+
"[Fake error for 'example-localhost.invalid']"
98+
". Topology type: Single",
9799
false,
98100
true);
99101
}
@@ -105,7 +107,8 @@ test_server_selection_error_dns_multi_fail_single (void)
105107
"example-localhost.invalid:27017,other-example-localhost.invalid:27017/",
106108
"No suitable servers found (`serverSelectionTryOnce` set):"
107109
" [Fake error for 'example-localhost.invalid']"
108-
" [Fake error for 'other-example-localhost.invalid']",
110+
" [Fake error for 'other-example-localhost.invalid']"
111+
". Topology type: Unknown",
109112
false,
110113
false);
111114
}
@@ -119,7 +122,8 @@ test_server_selection_error_dns_multi_fail_pooled (void *ctx)
119122
"example-localhost.invalid:27017,other-example-localhost.invalid:27017/",
120123
"No suitable servers found: `serverSelectionTimeoutMS` expired:"
121124
" [Fake error for 'example-localhost.invalid']"
122-
" [Fake error for 'other-example-localhost.invalid']",
125+
" [Fake error for 'other-example-localhost.invalid']"
126+
". Topology type: Unknown",
123127
false,
124128
true);
125129
}

0 commit comments

Comments
 (0)