Skip to content

Commit 34f10e5

Browse files
committed
CDRIVER-4055 Update server selection for load balancer
1 parent 800a9eb commit 34f10e5

File tree

4 files changed

+30
-1
lines changed

4 files changed

+30
-1
lines changed

src/libmongoc/src/mongoc/mongoc-cmd.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,7 @@ _mongoc_cmd_parts_assemble_mongod (mongoc_cmd_parts_t *parts,
627627
case MONGOC_TOPOLOGY_SHARDED:
628628
case MONGOC_TOPOLOGY_UNKNOWN:
629629
case MONGOC_TOPOLOGY_DESCRIPTION_TYPES:
630+
case MONGOC_TOPOLOGY_LOADBALANCED:
630631
default:
631632
/* must not call this function w/ sharded or unknown topology type */
632633
BSON_ASSERT (false);

src/libmongoc/src/mongoc/mongoc-read-prefs.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,12 @@ assemble_query (const mongoc_read_prefs_t *read_prefs,
383383

384384
case MONGOC_TOPOLOGY_UNKNOWN:
385385
case MONGOC_TOPOLOGY_DESCRIPTION_TYPES:
386+
case MONGOC_TOPOLOGY_LOADBALANCED:
387+
/* TODO (CDRIVER-4056): this is pending a question on pre-5.0 support and testing.
388+
* The spec says 5.0 is the minimum server version.
389+
* It is unclear if we can assume the backing server always supports OP_MSG.
390+
* I think the intent is we can, but there is no max wire version check.
391+
*/
386392
default:
387393
/* must not call _apply_read_preferences with unknown topology type */
388394
BSON_ASSERT (false);

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ _is_data_node (mongoc_server_description_t *sd)
3636
case MONGOC_SERVER_STANDALONE:
3737
case MONGOC_SERVER_RS_SECONDARY:
3838
case MONGOC_SERVER_RS_PRIMARY:
39+
case MONGOC_SERVER_LOADBALANCER:
3940
return true;
4041
case MONGOC_SERVER_RS_OTHER:
4142
case MONGOC_SERVER_RS_ARBITER:
@@ -351,6 +352,10 @@ _mongoc_topology_description_server_is_candidate (
351352
default:
352353
return false;
353354
}
355+
356+
case MONGOC_TOPOLOGY_LOADBALANCED:
357+
return desc_type == MONGOC_SERVER_LOADBALANCER;
358+
354359
default:
355360
return false;
356361
}
@@ -711,6 +716,16 @@ mongoc_topology_description_suitable_servers (
711716
topology->servers, _mongoc_find_suitable_mongos_cb, &data);
712717
}
713718

719+
/* Load balanced clusters --
720+
* Always select the only server. */
721+
if (topology->type == MONGOC_TOPOLOGY_LOADBALANCED) {
722+
BSON_ASSERT (topology->servers->items_len == 1);
723+
server = (mongoc_server_description_t *) mongoc_set_get_item (
724+
topology->servers, 0);
725+
_mongoc_array_append_val (set, server);
726+
goto DONE;
727+
}
728+
714729
/* Ways to get here:
715730
* - secondary read
716731
* - secondary preferred read
@@ -1792,6 +1807,8 @@ _mongoc_topology_description_type (mongoc_topology_description_t *topology)
17921807
return "RSWithPrimary";
17931808
case MONGOC_TOPOLOGY_SINGLE:
17941809
return "Single";
1810+
case MONGOC_TOPOLOGY_LOADBALANCED:
1811+
return "LoadBalanced";
17951812
case MONGOC_TOPOLOGY_DESCRIPTION_TYPES:
17961813
default:
17971814
MONGOC_ERROR ("Invalid mongoc_topology_description_type_t type");

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,12 @@ test_all_spec_tests (TestSuite *suite)
6060
install_json_test_suite (suite, resolved, &test_rtt_calculation_cb);
6161

6262
/* SS logic */
63-
test_framework_resolve_path (JSON_DIR "/server_selection/server_selection", resolved);
63+
test_framework_resolve_path (JSON_DIR "/server_selection/server_selection",
64+
resolved);
65+
install_json_test_suite (suite, resolved, &test_server_selection_logic_cb);
66+
67+
test_framework_resolve_path (
68+
JSON_DIR "/server_selection/server_selection/LoadBalanced", resolved);
6469
install_json_test_suite (suite, resolved, &test_server_selection_logic_cb);
6570
}
6671

0 commit comments

Comments
 (0)