public async Task<Result<MasterElectionState>> GetRoleAsync(OperationContext context) { var r = await UpdateRoleAsync(context, tryUpdateLease: TryCreateOrExtendLease); if (r.Succeeded) { _lastElection = r.Value; } return r; }
public async Task<Result<Role>> ReleaseRoleIfNecessaryAsync(OperationContext context, bool shuttingDown = false) { if (!_configuration.IsMasterEligible) { return Result.Success<Role>(Role.Worker); } var r = await UpdateRoleAsync(context, tryUpdateLease: TryReleaseLeaseIfHeld).AsAsync(s => s.Role); if (r.Succeeded) { // We don't know who the master is any more _lastElection = new MasterElectionState(Master: default, Role: r.Value);
private static void Check(MasterElectionState state, Role role, MachineLocation?master) { if (master is null) { state.Master.IsValid.Should().BeFalse($"Expected master to be invalid but found {state.Master}"); } else { state.Master.Should().BeEquivalentTo(master.Value); } state.Role.Should().Be(role); }