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);
        }