Example #1
0
        private async Task ReconnectAsync(CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
        {
            var transactions = _sessions.Values.Select(s => s.StartReconnecting()).ExcludeDefault().ToList();

            if (transactions.Any())
            {
                try {
                    await WhenAllCancelOnFailure(transactions, (t, ct) => t.AcquireLockAsync(ct), cancellationToken);
                    await WhenAllCancelOnFailure(transactions, (t, ct) => t.ReconnectAsync(ct, reentrancyToken), cancellationToken);
                } catch (OperationCanceledException ex) when(!(ex is RHostDisconnectedException))
                {
                    throw;
                } catch (Exception ex) {
                    _console.Write(Resources.RSessionProvider_ConnectionFailed.FormatInvariant(ex.Message));
                    throw;
                } finally {
                    foreach (var transaction in transactions)
                    {
                        transaction.Dispose();
                    }
                }
            }
            else
            {
                await TestBrokerConnectionWithRHost(_brokerProxy, cancellationToken, reentrancyToken);
            }
        }
Example #2
0
        private async Task ReconnectAsync(CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
        {
            var sessions = _sessions.Values.ToList();

            if (sessions.Any())
            {
                // All sessions should participate in reconnect. If any of it didn't start, cancel the rest.
                var transactions = sessions.Select(s => s.StartReconnecting()).ToList();

                try {
                    await TaskUtilities.WhenAllCancelOnFailure(transactions, (t, ct) => t.AcquireLockAsync(ct), cancellationToken);

                    await TaskUtilities.WhenAllCancelOnFailure(transactions, (t, ct) => t.ReconnectAsync(ct, reentrancyToken), cancellationToken);
                } catch (OperationCanceledException ex) when(!(ex is RHostDisconnectedException))
                {
                    throw;
                } catch (Exception ex) {
                    _callback.Write(Resources.RSessionProvider_ConnectionFailed.FormatInvariant(ex.Message));
                    throw;
                } finally {
                    foreach (var transaction in transactions)
                    {
                        transaction.Dispose();
                    }
                }
            }
            else
            {
                await TestBrokerConnectionWithRHost(_brokerProxy, cancellationToken, reentrancyToken);
            }
        }
Example #3
0
            public async Task ReconnectAsync(CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
            {
                using (_session._disposeToken.Link(ref cancellationToken)) {
                    if (!VerifyTransactionState(nameof(ConnectToNewBrokerAsync)))
                    {
                        return;
                    }

                    var host = _session._host;
                    // 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 any)
                        await _session.CancelAllAsync(cancellationToken);

                        host.Dispose();
                        await _session._hostRunTask;
                    }

                    var connectionInfo = new BrokerConnectionInfo(_session._startupInfo.Name, _session,
                                                                  _session._startupInfo.RHostCommandLineArguments);
                    host = await _session.BrokerClient.ConnectAsync(connectionInfo, cancellationToken, reentrancyToken);

                    await _session.StartHostAsyncBackground(host, _lockToken, cancellationToken);
                }
            }
Example #4
0
        private async Task SwitchBrokerAsync(CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
        {
            var transactions = _sessions.Values.Select(s => s.StartSwitchingBroker()).ExcludeDefault().ToList();

            if (transactions.Any())
            {
                await SwitchSessionsAsync(transactions, cancellationToken, reentrancyToken);
            }
            else
            {
                // Ping isn't enough here - need a "full" test with RHost
                await TestBrokerConnectionWithRHost(_brokerProxy, cancellationToken, reentrancyToken);
            }
        }
Example #5
0
            public async Task ReconnectAsync(CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
            {
                if (_lockToken == null)
                {
                    throw new InvalidOperationException($"{nameof(AcquireLockAsync)} must be called before {nameof(ReconnectAsync)}");
                }

                _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 host = _session._host;

                // 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 any)
                    await _session.CancelAllAsync(cancellationToken);

                    host.Dispose();
                    await _session._hostRunTask;
                }

                host = await _session.BrokerClient.ConnectAsync(_session._startupInfo.Name, _session, _session._startupInfo.RHostCommandLineArguments,
                                                                cancellationToken : cancellationToken, reentrancyToken : reentrancyToken);

                await _session.StartHostAsyncBackground(host, _lockToken, cancellationToken);
            }
Example #6
0
 private async Task ConnectToNewBrokerAsync(IEnumerable <IRSessionSwitchBrokerTransaction> transactions, CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
 {
     try {
         await TaskUtilities.WhenAllCancelOnFailure(transactions, (t, ct) => t.ConnectToNewBrokerAsync(ct, reentrancyToken), cancellationToken);
     } catch (OperationCanceledException ex) when(!(ex is RHostDisconnectedException))
     {
         throw;
     } catch (Exception ex) {
         _callback.Write(Resources.RSessionProvider_ConnectionFailed.FormatInvariant(ex.Message));
         throw;
     }
 }
 public Token(LockSource lockSource) {
     _lockSource = lockSource;
     Reentrancy = LockTokenFactory.Create(lockSource);
 }
Example #8
0
        private async Task SwitchSessionsAsync(IEnumerable <RSession> sessions, CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
        {
            // All sessions should participate in switch. If any of it didn't start, cancel the rest.
            var transactions = sessions.Select(s => s.StartSwitchingBroker()).ToList();

            try {
                await TaskUtilities.WhenAllCancelOnFailure(transactions, (t, ct) => t.AcquireLockAsync(ct), cancellationToken);
                await ConnectToNewBrokerAsync(transactions, cancellationToken, reentrancyToken);

                OnBrokerDisconnected();
                await CompleteSwitchingBrokerAsync(transactions, cancellationToken);
            } finally {
                foreach (var transaction in transactions)
                {
                    transaction.Dispose();
                }
            }
        }
Example #9
0
        private async Task SwitchBrokerAsync(IBrokerClient oldBroker, CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
        {
            var sessions = _sessions.Values.ToList();

            if (sessions.Any())
            {
                await SwitchSessionsAsync(sessions, cancellationToken, reentrancyToken);
            }
            else
            {
                // Ping isn't enough here - need a "full" test with RHost
                await TestBrokerConnectionWithRHost(_brokerProxy, cancellationToken, reentrancyToken);
            }
        }
Example #10
0
        private static async Task TestBrokerConnectionWithRHost(IBrokerClient brokerClient, CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
        {
            var callbacks = new NullRCallbacks();
            var rhost     = await brokerClient.ConnectAsync(nameof(TestBrokerConnectionAsync), callbacks, cancellationToken : cancellationToken, reentrancyToken : reentrancyToken);

            try {
                var rhostRunTask = rhost.Run(cancellationToken);
                callbacks.SetReadConsoleInput("q()\n");
                await rhostRunTask;
            } finally {
                rhost.Dispose();
            }
        }
Example #11
0
        public override async Task <RHost> ConnectAsync(BrokerConnectionInfo connectionInfo, CancellationToken cancellationToken = default(CancellationToken), ReentrancyToken reentrancyToken = default(ReentrancyToken))
        {
            await EnsureBrokerStartedAsync();

            return(await base.ConnectAsync(connectionInfo, cancellationToken, reentrancyToken));
        }
Example #12
0
 public async Task <RHost> ConnectAsync(string name, IRCallbacks callbacks, string rCommandLineArguments = null, int timeout = 3000,
                                        CancellationToken cancellationToken = default(CancellationToken), ReentrancyToken reentrancyToken = default(ReentrancyToken))
 {
     using (await _connectArwl.ReaderLockAsync(cancellationToken, reentrancyToken)) {
         return(await _broker.ConnectAsync(name, callbacks, rCommandLineArguments, timeout, cancellationToken));
     }
 }
Example #13
0
 public Task <RHost> ConnectAsync(string name, IRCallbacks callbacks, string rCommandLineArguments = null, int timeout           = 3000,
                                  CancellationToken cancellationToken = new CancellationToken(), ReentrancyToken reentrancyToken = new ReentrancyToken()) => Result;
Example #14
0
 public async Task <RHost> ConnectAsync(BrokerConnectionInfo connectionInfo, CancellationToken cancellationToken = default(CancellationToken), ReentrancyToken reentrancyToken = default(ReentrancyToken))
 {
     using (await _connectArwl.ReaderLockAsync(cancellationToken, reentrancyToken)) {
         return(await _broker.ConnectAsync(connectionInfo, cancellationToken, reentrancyToken));
     }
 }
Example #15
0
            public async Task ConnectToNewBrokerAsync(CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
            {
                using (_session._disposeToken.Link(ref cancellationToken)) {
                    if (!VerifyTransactionState(nameof(ConnectToNewBrokerAsync)))
                    {
                        return;
                    }

                    var startupInfo = _session._startupInfo;
                    // host requires _startupInfo, so proceed only if session was started at least once
                    var connectionInfo = new BrokerConnectionInfo(startupInfo.Name, _session, startupInfo.RHostCommandLineArguments);
                    _hostToSwitch = await _session.BrokerClient.ConnectAsync(connectionInfo, cancellationToken, reentrancyToken);
                }
            }
 public Token(LockSource lockSource)
 {
     _lockSource = lockSource;
     Reentrancy  = LockTokenFactory.Create(lockSource);
 }
Example #17
0
            public async Task ConnectToNewBrokerAsync(CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
            {
                if (_lockToken == null)
                {
                    throw new InvalidOperationException($"{nameof(AcquireLockAsync)} must be called before {nameof(ConnectToNewBrokerAsync)}");
                }

                _session._disposeToken.ThrowIfDisposed();
                var startupInfo = _session._startupInfo;

                if (startupInfo != null)
                {
                    // host requires _startupInfo, so proceed only if session was started at least once
                    _hostToSwitch = await _session.BrokerClient.ConnectAsync(startupInfo.Name, _session, startupInfo.RHostCommandLineArguments, cancellationToken : cancellationToken, reentrancyToken : reentrancyToken);
                }
            }
Example #18
0
 public Task <RHost> ConnectAsync(BrokerConnectionInfo connectionInfo, CancellationToken cancellationToken = default(CancellationToken), ReentrancyToken reentrancyToken = default(ReentrancyToken)) => Result;
Example #19
0
 public TSource GetSource(ReentrancyToken token) => token._source as TSource;
Example #20
0
        private async Task SwitchSessionsAsync(IReadOnlyCollection <IRSessionSwitchBrokerTransaction> transactions, CancellationToken cancellationToken, ReentrancyToken reentrancyToken)
        {
            // All sessions should participate in switch. If any of it didn't start, cancel the rest.
            try {
                await WhenAllCancelOnFailure(transactions, (t, ct) => t.AcquireLockAsync(ct), cancellationToken);
                await ConnectToNewBrokerAsync(transactions, cancellationToken, reentrancyToken);

                OnBrokerDisconnected();
                await CompleteSwitchingBrokerAsync(transactions, cancellationToken);
            } finally {
                foreach (var transaction in transactions)
                {
                    transaction.Dispose();
                }
            }
        }
Example #21
0
        public override async Task <RHost> ConnectAsync(string name, IRCallbacks callbacks, string rCommandLineArguments = null, int timeout = 3000,
                                                        CancellationToken cancellationToken = default(CancellationToken), ReentrancyToken reentrancyToken = default(ReentrancyToken))
        {
            await EnsureBrokerStartedAsync();

            return(await base.ConnectAsync(name, callbacks, rCommandLineArguments, timeout, cancellationToken));
        }
Example #22
0
 public TSource GetSource(ReentrancyToken token)
 {
     return(token._source as TSource);
 }