/// <summary> /// Triggered when the application host is performing a graceful shutdown. /// </summary> /// <param name="cancellationToken">Indicates that the shutdown process should no longer be graceful.</param> /// <returns>Task.</returns> /// <autogeneratedoc /> public Task StopAsync(CancellationToken cancellationToken) { var tasks = new List <Task> { ArpService.StopAsync(cancellationToken), PingService.StopAsync(cancellationToken), CommonServices.StopAsync(cancellationToken) }; ServiceHostStatus = ServiceHostStatus.StopPending; var logger = CommonServices?.LoggerFactory?.CreatePureLogger <CommonNetworkServices>(); return(tasks.WaitForTasks(cancellationToken, (t) => { if (t.IsCompleted) { ServiceHostStatus = ServiceHostStatus.Stopped; } } , logger)); }
/// <summary> /// Starts the network services. /// </summary> /// <returns> /// A task that represents the asynchronous operation. /// </returns> /// <remarks> /// Starts the various IPFS and Lib.P2P network services. This should /// be called after any configuration changes. /// </remarks> /// <exception cref="Exception"> /// When the engine is already started. /// </exception> public async Task StartAsync() { _dfsState.IsStarted = true; if (_stopTasks.Count > 0) { throw new Exception("IPFS engine is already started."); } // Repository must be at the correct version. await MigrationManager.MirgrateToVersionAsync(MigrationManager.LatestVersion).ConfigureAwait(false); Log.Debug("starting " + LocalPeer.Id); // Everybody needs the swarm. _stopTasks.Add(async() => { await SwarmService.StopAsync().ConfigureAwait(false); }); await SwarmService.StartAsync().ConfigureAwait(false); var peerManager = new PeerManager { SwarmService = SwarmService }; await peerManager.StartAsync().ConfigureAwait(false); _stopTasks.Add(async() => { await peerManager.StopAsync().ConfigureAwait(false); }); // Start the primary services. var tasks = new List <Func <Task> > { async() => { _stopTasks.Add(async() => await BitSwapService.StopAsync().ConfigureAwait(false)); await BitSwapService.StartAsync().ConfigureAwait(false); }, async() => { _stopTasks.Add(async() => await DhtService.StopAsync().ConfigureAwait(false)); await DhtService.StartAsync().ConfigureAwait(false); }, async() => { _stopTasks.Add(async() => await PingService.StopAsync().ConfigureAwait(false)); await PingService.StartAsync().ConfigureAwait(false); }, async() => { _stopTasks.Add(async() => await PubSubService.StopAsync().ConfigureAwait(false)); await PubSubService.StartAsync().ConfigureAwait(false); } }; Log.Debug("waiting for services to start"); await Task.WhenAll(tasks.Select(t => t())).ConfigureAwait(false); // Starting listening to the swarm. var json = await ConfigApi.GetAsync("Addresses.Swarm").ConfigureAwait(false); var numberListeners = 0; foreach (string a in json) { try { await SwarmService.StartListeningAsync(a).ConfigureAwait(false); ++numberListeners; } catch (Exception e) { Log.Warning($"Listener failure for '{a}'", e); } } if (numberListeners == 0) { Log.Error("No listeners were created."); } // Now that the listener addresses are established, the discovery // services can begin. MulticastService multicast = null; if (!Options.Discovery.DisableMdns) { multicast = new MulticastService(); #pragma warning disable CS1998 _stopTasks.Add(async() => multicast.Dispose()); #pragma warning restore CS1998 } var autodialer = new AutoDialer(SwarmService) { MinConnections = Options.Swarm.MinConnections }; #pragma warning disable CS1998 _stopTasks.Add(async() => autodialer.Dispose()); #pragma warning restore CS1998 tasks = new List <Func <Task> > { // Bootstrap discovery async() => { var bootstrap = new Bootstrap { Addresses = await BootstrapApi.ListAsync() }; bootstrap.PeerDiscovered += OnPeerDiscovered; _stopTasks.Add(async() => await bootstrap.StopAsync().ConfigureAwait(false)); await bootstrap.StartAsync().ConfigureAwait(false); }, async() => { if (Options.Discovery.DisableRandomWalk) { return; } var randomWalk = new RandomWalk { Dht = DhtApi }; _stopTasks.Add(async() => await randomWalk.StopAsync().ConfigureAwait(false)); await randomWalk.StartAsync().ConfigureAwait(false); } }; Log.Debug("waiting for discovery services to start"); await Task.WhenAll(tasks.Select(t => t())).ConfigureAwait(false); multicast?.Start(); Log.Debug("started"); }