public Task<Result<MachineMapping>> RegisterMachineAsync(OperationContext context, MachineLocation machineLocation)
{
return context.PerformOperationAsync(Tracer, async () =>
{
if (Configuration.DistributedContentConsumerOnly)
{
return Result.Success(new MachineMapping(machineLocation, new MachineId(0)));
}
// Get the local machine id
var machineIdAndIsAdded = await _clusterStateKey.UseNonConcurrentReplicatedHashAsync(
context,
Configuration.RetryWindow,
RedisOperation.StartupGetOrAddLocalMachine,
(batch, key) => batch.GetOrAddMachineAsync(key, machineLocation.ToString(), _clock.UtcNow),
timeout: Configuration.ClusterRedisOperationTimeout)
.ThrowIfFailureAsync();
Tracer.Debug(context, $"Assigned machine id={machineIdAndIsAdded.machineId}, location={machineLocation}, isAdded={machineIdAndIsAdded.isAdded}.");
return Result.Success(new MachineMapping(machineLocation, new MachineId(machineIdAndIsAdded.machineId)));
},
traceOperationStarted: false,
extraEndMessage: r =>
{
if (r.Succeeded)
{
return $"MachineLocation=[{r.Value.Location}] MachineId=[{r.Value.Id}]";
}
else
{
return $"MachineLocation=[{machineLocation}]";
}
});
}