private async Task OnChannelActivated(CancellationToken cancellationToken) { try { //Step 1 - read nodes and stats from db AddPersistedNodes(cancellationToken); //Step 2 - initialize bootnodes if (_logger.IsDebug) { _logger.Debug("Initializing bootnodes."); } while (true) { if (cancellationToken.IsCancellationRequested) { break; } if (await InitializeBootnodes(cancellationToken)) { break; } //Check if we were able to communicate with any trusted nodes or persisted nodes //if so no need to replay bootstrapping, we can start discovery process if (_discoveryManager.GetOrAddNodeLifecycleManagers(x => x.State == NodeLifecycleState.Active).Any()) { break; } _logger.Warn("Could not communicate with any nodes (bootnodes, trusted nodes, persisted nodes)."); await Task.Delay(1000, cancellationToken); } if (cancellationToken.IsCancellationRequested) { return; } InitializeDiscoveryPersistenceTimer(); InitializeDiscoveryTimer(); await RunDiscoveryAsync(cancellationToken).ContinueWith( t => { if (t.IsFaulted) { _logger.Error("Discovery error", t.Exception); } }); } catch (Exception e) { if (_logger.IsDebug) { _logger.Error("DEBUG/ERROR Error during discovery initialization", e); } } }