protected override async Task ExecuteAsync(CancellationToken cancelToken) { #region init state AppState = await ResetState(); Logger.LogDebug($"State initialized: [{AppState.Level}:{AppState.Hash}]"); #endregion Logger.LogWarning("Observer is started"); while (!cancelToken.IsCancellationRequested) { #region wait for updates try { if (!await WaitForUpdatesAsync(cancelToken)) { break; } var head = await Node.GetHeaderAsync(); Logger.LogDebug($"New head is found [{head.Level}:{head.Hash}]"); } catch (Exception ex) { Logger.LogCritical($"Failed to check updates. {ex.Message}"); await Task.Delay(5000); continue; } #endregion #region apply updates try { if (!await ApplyUpdatesAsync(cancelToken)) { break; } Logger.LogDebug($"Current head [{AppState.Level}:{AppState.Hash}]"); } catch (BaseException ex) when(ex.RebaseRequired) { Logger.LogError($"Failed to apply block: {ex.Message}. Rebase local branch..."); try { if (!await RebaseLocalBranchAsync(cancelToken)) { break; } } catch (Exception exx) { Logger.LogCritical($"Failed to rebase branch. {exx.Message}"); AppState = await ResetState(); await Task.Delay(5000); continue; } } catch (Exception ex) { Logger.LogCritical($"Failed to apply updates. {ex.Message}"); AppState = await ResetState(); await Task.Delay(5000); continue; } #endregion } Logger.LogWarning("Observer is stoped"); }
protected override async Task ExecuteAsync(CancellationToken cancelToken) { try { Logger.LogWarning("Observer started"); #region init state if (!await ResetState(cancelToken)) { return; } Logger.LogInformation($"State initialized: [{AppState.Level}:{AppState.Hash}]"); #endregion #region init quotes await InitQuotes(); Logger.LogInformation($"Quotes initialized: [{AppState.QuoteLevel}]"); #endregion Logger.LogInformation("Synchronization started"); while (!cancelToken.IsCancellationRequested) { #region wait for updates try { if (!await WaitForUpdatesAsync(cancelToken)) { break; } var head = await Node.GetHeaderAsync(); Logger.LogDebug($"New head is found [{head.Level}:{head.Hash}]"); } catch (Exception ex) { Logger.LogError($"Failed to check updates. {ex.Message}"); await Task.Delay(3000, CancellationToken.None); continue; } #endregion #region apply updates try { if (!await ApplyUpdatesAsync(cancelToken)) { break; } Logger.LogDebug($"Current head [{AppState.Level}:{AppState.Hash}]"); } catch (BaseException ex) when(ex.RebaseRequired) { Logger.LogError($"Failed to apply block: {ex.Message}. Rebase local branch..."); if (!await ResetState(cancelToken)) { break; } try { if (!await RebaseLocalBranchAsync(cancelToken)) { break; } } catch (Exception exx) { Logger.LogError($"Failed to rebase branch. {exx.Message}"); await Task.Delay(3000, CancellationToken.None); if (!await ResetState(cancelToken)) { break; } continue; } } catch (Exception ex) { Logger.LogError($"Failed to apply updates. {ex.Message}"); await Task.Delay(3000, CancellationToken.None); if (!await ResetState(cancelToken)) { break; } continue; } #endregion } } catch (Exception ex) { // should never get here Logger.LogCritical($"Observer crashed: {ex.Message}"); } finally { Logger.LogWarning("Observer stopped"); } }