Skip to content
This repository was archived by the owner on Jan 7, 2022. It is now read-only.

Commit b0ea9fe

Browse files
al13n321facebook-github-bot
authored andcommitted
Make nodeset selector not fail for internal logs if configured nodeset_size is smaller than replication factor
Summary: It used to select a nodeset of the given size, then check if it's replicatable and fail because it's not. This diff makes nodeset selector increase nodeset size to 2*replication_factor-1. Reviewed By: MohamedBassem Differential Revision: D17372813 fbshipit-source-id: 32859b052db8f0f07d224eaec88307b2c5f57103
1 parent 9f46eb3 commit b0ea9fe

3 files changed

Lines changed: 63 additions & 7 deletions

File tree

logdevice/common/nodeset_selection/WeightAwareNodeSetSelector.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,15 @@ NodeSetSelector::Result WeightAwareNodeSetSelector::getStorageSet(
7474
min_nodes_per_domain = 0;
7575
}
7676

77+
// We'll try to pick at least this many nodes in total.
78+
// If target_nodeset_size seems too small compared to replication factor,
79+
// increase it to 2*replication_factor - 1, which provides, in some sense,
80+
// equal write and read availability.
81+
nodeset_size_t min_nodes_total =
82+
std::max(target_nodeset_size,
83+
static_cast<nodeset_size_t>(
84+
replication_property.getReplicationFactor() * 2 - 1));
85+
7786
struct CandidateNode {
7887
uint64_t shard_id_hash;
7988
ShardID shard_id;
@@ -237,7 +246,7 @@ NodeSetSelector::Result WeightAwareNodeSetSelector::getStorageSet(
237246
int picked_in_domain =
238247
only_writable ? d->num_picked_writable : d->num_picked;
239248
if (picked_in_domain >= min_nodes_per_domain &&
240-
result_size >= target_nodeset_size) {
249+
result_size >= min_nodes_total) {
241250
// The nodeset is big enough and has enough nodes from each domain.
242251
break;
243252
}

logdevice/common/test/RandomNodeSetSelectorTest.cpp

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -610,9 +610,9 @@ void basic_test(NodeSetSelectorType ns_type) {
610610
logid_t(3),
611611
Decision::NEEDS_CHANGE,
612612
[&](StorageSet* ss) {
613-
EXPECT_EQ(4, keep_only_writable(*ss).size());
614-
EXPECT_GE(ss->size(), 4);
615-
EXPECT_LE(ss->size(), 10);
613+
EXPECT_EQ(7, keep_only_writable(*ss).size());
614+
EXPECT_GE(ss->size(), 7);
615+
EXPECT_LE(ss->size(), 14);
616616
});
617617

618618
verify_result(selector.get(),
@@ -1087,3 +1087,50 @@ TEST(ConsistentHashingWeightAwareNodeSetSelectorTest, Seed) {
10871087
EXPECT_EQ(Decision::KEEP, res6.decision);
10881088
EXPECT_EQ(res5.signature, res6.signature);
10891089
}
1090+
1091+
TEST(WeightAwareNodeSetSelectorTest, InternalLogsConfiguredTooSmall) {
1092+
Nodes nodes;
1093+
addNodes(&nodes, 5, 1, "region.dc3.FB|REGION3|MSB_9.00.ab");
1094+
addNodes(&nodes, 5, 1, "region.dc3.FB|REGION3|MSB_8.00.ab");
1095+
addNodes(&nodes, 5, 1, "region.dc3.FB|REGION3|MSB_7.00.ab");
1096+
1097+
ASSERT_EQ(15, nodes.size());
1098+
Configuration::NodesConfig nodes_config(std::move(nodes));
1099+
1100+
ReplicationProperty replication(
1101+
{{NodeLocationScope::CLUSTER, 2}, {NodeLocationScope::NODE, 4}});
1102+
size_t nodeset_size = 3;
1103+
auto logs_config = std::make_shared<LocalLogsConfig>();
1104+
1105+
InternalLogs il;
1106+
logsconfig::LogAttributes log_attrs;
1107+
log_attrs.set_nodeSetSize(nodeset_size);
1108+
log_attrs.set_replicateAcross(replication.getDistinctReplicationFactors());
1109+
auto log_group_node = il.insert("event_log_snapshots", log_attrs);
1110+
ASSERT_NE(nullptr, log_group_node);
1111+
1112+
ShapingConfig shaping_cfg(
1113+
std::set<NodeLocationScope>{NodeLocationScope::NODE},
1114+
std::set<NodeLocationScope>{NodeLocationScope::NODE});
1115+
auto config = std::make_shared<Configuration>(
1116+
ServerConfig::fromDataTest("nodeset_selector_test",
1117+
std::move(nodes_config),
1118+
MetaDataLogsConfig(),
1119+
PrincipalsConfig(),
1120+
SecurityConfig(),
1121+
TraceLoggerConfig(),
1122+
TrafficShapingConfig(),
1123+
shaping_cfg,
1124+
ServerConfig::SettingsConfig(),
1125+
ServerConfig::SettingsConfig(),
1126+
std::move(il)),
1127+
std::move(logs_config));
1128+
1129+
auto selector =
1130+
NodeSetSelectorFactory::create(NodeSetSelectorType::WEIGHT_AWARE);
1131+
verify_result(selector.get(),
1132+
config,
1133+
InternalLogs::EVENT_LOG_SNAPSHOTS,
1134+
Decision::NEEDS_CHANGE,
1135+
[&](StorageSet* ss) { EXPECT_EQ(7, ss->size()); });
1136+
}

logdevice/test/SequencerIntegrationTest.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -432,8 +432,8 @@ TEST_F(SequencerIntegrationTest, WinSizeChangeDelayTest) {
432432
// nodes changes.
433433
TEST_F(SequencerIntegrationTest, StorageStateChangeDelayTest) {
434434
Configuration::Nodes nodes;
435-
size_t num_nodes = 7;
436-
// 2 sequencer nodes and 5 storage nodes
435+
size_t num_nodes = 9;
436+
// 2 sequencer nodes and 7 storage nodes
437437
for (int i = 0; i < num_nodes; ++i) {
438438
auto& node = nodes[i];
439439
node.generation = 1;
@@ -512,7 +512,7 @@ TEST_F(SequencerIntegrationTest, StorageStateChangeDelayTest) {
512512
// nodeset for the written log.
513513
std::unordered_map<node_index_t, size_t> stores;
514514
node_index_t to_disable = 1;
515-
for (node_index_t n = 2; n <= 6; ++n) {
515+
for (node_index_t n = 2; n < num_nodes; ++n) {
516516
stores[n] = cluster->getNode(n).stats()["message_received.STORE"];
517517
if (stores[n] > stores[to_disable]) {
518518
to_disable = n;

0 commit comments

Comments
 (0)