public async Task CompleteSwitchingBrokerAsync(CancellationToken cancellationToken) { if (_lockToken == null) { throw new InvalidOperationException($"{nameof(AcquireLockAsync)} must be called before {nameof(CompleteSwitchingBrokerAsync)}"); } _session._disposeToken.ThrowIfDisposed(); if (_session._startupInfo == null) { // Session never started. No need to restart it. // Reset _initializationLock so that next awaiter can proceed. _lockToken.Reset(); return; } var brokerClient = _session.BrokerClient; var startupInfo = _session._startupInfo; var host = _session._host; var hostRunTask = _session._hostRunTask; // host may be null if previous attempts to start it have failed if (host != null) { // Detach RHost from RSession host.DetachCallback(); // Cancel all current requests await _session.CancelAllAsync(cancellationToken); } // Start new RHost await _session.StartHostAsyncBackground(_hostToSwitch, _lockToken, cancellationToken); // Shut down the old host, gracefully if possible, and wait for old hostRunTask to exit; if (hostRunTask != null) { await StopHostAsync(brokerClient, startupInfo?.Name, host, hostRunTask); } host?.Dispose(); if (hostRunTask != null && hostRunTask.Status == TaskStatus.Running) { await hostRunTask; } _hostToSwitch = null; }
public async Task CompleteSwitchingBrokerAsync(CancellationToken cancellationToken) { using (_session._disposeToken.Link(ref cancellationToken)) { if (!VerifyTransactionState(nameof(ConnectToNewBrokerAsync))) { return; } if (_hostToSwitch == null) { Debugger.Launch(); } try { var brokerClient = _session.BrokerClient; var startupInfo = _session._startupInfo; var host = _session._host; var hostRunTask = _session._hostRunTask; // host may be null if previous attempts to start it have failed if (host != null) { // Detach RHost from RSession host.DetachCallback(); // Cancel all current requests await _session.CancelAllAsync(cancellationToken); } // Start new RHost await _session.StartHostAsyncBackground(_hostToSwitch, _lockToken, cancellationToken); // Shut down the old host, gracefully if possible, and wait for old hostRunTask to exit; if (hostRunTask != null) { await StopHostAsync(brokerClient, startupInfo?.Name, host, hostRunTask); } host?.Dispose(); if (hostRunTask != null) { await hostRunTask; } } finally { _hostToSwitch = null; } } }
public async Task CompleteSwitchingBrokerAsync(CancellationToken cancellationToken) { using (_session._disposeToken.Link(ref cancellationToken)) { try { var brokerClient = _session.BrokerClient; var host = _session._host; var hostRunTask = _session._hostRunTask; // host may be null if previous attempts to start it have failed if (host != null) { // Detach RHost from RSession host.DetachCallback(); // Cancel all current requests // If can't be canceled in 10s - just ignore, old host will be stopped later await Task.WhenAny(_session.CancelAllAsync(cancellationToken), Task.Delay(10000, cancellationToken)).Unwrap(); } // Start new RHost await _session.StartHostAsyncBackground(_hostToSwitch, cancellationToken); // Shut down the old host, gracefully if possible, and wait for old hostRunTask to exit; if (hostRunTask != null && host != null) { await StopHostAsync(brokerClient, host, hostRunTask, true); } host?.Dispose(); if (hostRunTask != null) { await hostRunTask; } } finally { _hostToSwitch = null; } } }