properly handling BM targeted restart injection during BM recovery and if BM has already been restarted (#9945)

This commit is contained in:
Josh Slocum 2023-04-12 12:22:31 -05:00 committed by GitHub
parent 963630626c
commit e4fbf2fd59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 6 additions and 3 deletions

View File

@ -531,9 +531,9 @@ struct BlobManagerData : NonCopyable, ReferenceCounted<BlobManagerData> {
bool maybeInjectTargetedRestart() {
// inject a BW restart at most once per test
if (g_network->isSimulated() && !g_simulator->speedUpSimulation &&
now() > g_simulator->injectTargetedBMRestartTime) {
now() > g_simulator->injectTargetedBMRestartTime && iAmReplaced.canBeSet()) {
CODE_PROBE(true, "Injecting BM targeted restart");
TraceEvent("SimBMInjectTargetedRestart", id);
TraceEvent("SimBMInjectTargetedRestart", id).log();
g_simulator->injectTargetedBMRestartTime = std::numeric_limits<double>::max();
iAmReplaced.send(Void());
return true;
@ -5668,7 +5668,10 @@ ACTOR Future<Void> blobManager(BlobManagerInterface bmInterf,
// we need to recover the old blob manager's state (e.g. granule assignments) before
// before the new blob manager does anything
wait(recoverBlobManager(self) || collection);
choose {
when(wait(recoverBlobManager(self) || collection)) {}
when(wait(self->iAmReplaced.getFuture())) {}
}
self->addActor.send(doLockChecks(self));
self->addActor.send(monitorClientRanges(self));