Register Attrition injectors only after selection

This commit is contained in:
Trevor Clinkenbeard 2026-07-24 17:45:30 -07:00
parent 348b22ef09
commit 469ccf9aea
1 changed files with 41 additions and 4 deletions

View File

@ -165,10 +165,6 @@ struct MachineAttritionWorkload : FailureInjectionWorkload {
enabled = !clientId && g_network->isSimulated() && faultInjectionActivated;
suspendDuration = 10.0;
iterate = true;
if (enabled) {
phase = MachineAttritionPhase::get(wcx.sharedRandomNumber);
phaseOwner = phase->registerWorkload(machinesToLeave);
}
}
explicit MachineAttritionWorkload(WorkloadContext const& wcx) : FailureInjectionWorkload(wcx) {
@ -202,6 +198,13 @@ struct MachineAttritionWorkload : FailureInjectionWorkload {
}
}
void initFailureInjectionMode(DeterministicRandom&) override {
if (enabled) {
phase = MachineAttritionPhase::get(sharedRandomNumber);
phaseOwner = phase->registerWorkload(machinesToLeave);
}
}
bool shouldInject(DeterministicRandom& random,
const WorkloadRequest& work,
const unsigned alreadyAdded) const override {
@ -627,5 +630,39 @@ TEST_CASE("/fdbserver/workloads/MachineAttrition/phaseCoordination") {
return Void();
}
TEST_CASE("/fdbserver/workloads/MachineAttrition/failureInjectorSelection") {
WorkloadContext wcx;
wcx.clientId = 0;
wcx.clientCount = 1;
wcx.sharedRandomNumber = -3;
auto phase = MachineAttritionPhase::get(wcx.sharedRandomNumber);
auto explicitOwner = phase->registerWorkload(0);
std::vector<LocalityData> machines = { LocalityData(Optional<Standalone<StringRef>>(),
Standalone<StringRef>("zone0"_sr),
Standalone<StringRef>("zone0"_sr),
Optional<Standalone<StringRef>>()) };
phase->observe(machines);
TestWorkloadImpl<MachineAttritionWorkload, true> unselected(wcx, NoOptions{});
ASSERT(!unselected.phase);
ASSERT(unselected.phaseOwner == 0);
auto unselectedTargets = machines;
ASSERT(phase->prepareTargets(unselectedTargets, explicitOwner));
ASSERT(unselectedTargets.size() == 1);
TestWorkloadImpl<MachineAttritionWorkload, true> selected(wcx, NoOptions{});
ASSERT(!selected.phase);
selected.enabled = true;
DeterministicRandom random(wcx.sharedRandomNumber);
selected.initFailureInjectionMode(random);
ASSERT(selected.phase == phase);
ASSERT(selected.phaseOwner != 0);
auto selectedTargets = machines;
ASSERT(!phase->prepareTargets(selectedTargets, explicitOwner));
return Void();
}
WorkloadFactory<MachineAttritionWorkload> MachineAttritionWorkloadFactory;
FailureInjectorFactory<MachineAttritionWorkload> MachineAttritionFailureWorkloadFactory;