public async Task RunAsync(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { try { var newShardingSettings = settings.ShardingSettingsProvider(); if (shardingSettings == null || !shardingSettings.Equals(newShardingSettings)) { shardingSettings = newShardingSettings; restart = true; } if (restart) { await Restart().ConfigureAwait(false); restart = false; } using (new OperationContextToken($"Iteration-{iteration++}")) using (tracer.BeginConsumerCustomOperationSpan("Iteration")) using (iterationMetric?.For("time").Measure()) { await MakeIteration().ConfigureAwait(false); } } catch (Exception error) { if (cancellationToken.IsCancellationRequested) { return; } log.Error(error, "Failed to consume batch."); await DelayOnError().ConfigureAwait(false); } } if (coordinates != null) { await settings.CoordinatesStorage.AdvanceAsync(coordinates).ConfigureAwait(false); } log.Info("Final coordinates: {StreamCoordinates}.", coordinates); settings.OnStop?.Invoke(coordinates); }
public async Task RunAsync(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { try { // (iloktionov): Catch-up with state for other shards on any change to our sharding settings: var newShardingSettings = settings.ShardingSettingsProvider(); if (shardingSettings == null || !shardingSettings.Equals(newShardingSettings)) { log.Info( "Observed new sharding settings: shard with index {ShardIndex} from {ShardCount}. Syncing coordinates.", newShardingSettings.ClientShardIndex, newShardingSettings.ClientShardCount); shardingSettings = newShardingSettings; restart = true; } if (restart) { await Restart(cancellationToken).ConfigureAwait(false); restart = false; } using (iterationMetric?.For("time").Measure()) { await MakeIteration(cancellationToken).ConfigureAwait(false); } } catch (Exception error) { if (cancellationToken.IsCancellationRequested) { return; } log.Error(error, "Failed to consume stream."); await Task.Delay(settings.DelayOnError, cancellationToken).SilentlyContinue().ConfigureAwait(false); } } }