Exemplo n.º 1
0
        /// <summary>
        /// Creates and initializes a retryable read operation context.
        /// </summary>
        /// <param name="binding">The binding.</param>
        /// <param name="retryRequested">if set to <c>true</c> [retry requested].</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>A retryable read context.</returns>
        public static async Task <RetryableReadContext> CreateAsync(IReadBinding binding, bool retryRequested, CancellationToken cancellationToken)
        {
            var context = new RetryableReadContext(binding, retryRequested);

            try
            {
                await context.InitializeAsync(cancellationToken).ConfigureAwait(false);

                if (ChannelPinningHelper.PinChannelSourceAndChannelIfRequired(
                        context.ChannelSource,
                        context.Channel,
                        context.Binding.Session,
                        out var pinnedChannelSource,
                        out var pinnedChannel))
                {
                    context.ReplaceChannelSource(pinnedChannelSource);
                    context.ReplaceChannel(pinnedChannel);
                }
                return(context);
            }
            catch
            {
                context.Dispose();
                throw;
            }
        }
Exemplo n.º 2
0
        // public static methods
        /// <summary>
        /// Creates and initializes a retryable write operation context.
        /// </summary>
        /// <param name="binding">The binding.</param>
        /// <param name="retryRequested">if set to <c>true</c> [retry requested].</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>A retryable write context.</returns>
        public static RetryableWriteContext Create(IWriteBinding binding, bool retryRequested, CancellationToken cancellationToken)
        {
            var context = new RetryableWriteContext(binding, retryRequested);

            try
            {
                context.Initialize(cancellationToken);

                if (context.Binding.Session.IsInTransaction &&
                    ChannelPinningHelper.PinChannelSourceAndChannelIfRequired(
                        context.ChannelSource,
                        context.Channel,
                        context.Binding.Session,
                        out var pinnedChannelSource,
                        out var pinnedChannel))
                {
                    context.ReplaceChannelSource(pinnedChannelSource);
                    context.ReplaceChannel(pinnedChannel);
                }

                return(context);
            }
            catch
            {
                context.Dispose();
                throw;
            }
        }
Exemplo n.º 3
0
        private DisposableBindingBundle <IReadWriteBindingHandle, RetryableWriteContext> CreateReadWriteBindingsAndRetryableWriteContext(ICluster cluster, ICoreSessionHandle sessionHandle, bool async)
        {
            var effectiveReadBindings = ChannelPinningHelper.CreateReadWriteBinding(cluster, sessionHandle);
            var retryableReadContext  = CreateRetryableWriteContext(effectiveReadBindings, async);

            return(new DisposableBindingBundle <IReadWriteBindingHandle, RetryableWriteContext>(effectiveReadBindings, retryableReadContext));
        }
Exemplo n.º 4
0
 private async Task <TResult> ExecuteEndTransactionOnPrimaryAsync <TResult>(IReadOperation <TResult> operation, CancellationToken cancellationToken)
 {
     using (var sessionHandle = new NonDisposingCoreSessionHandle(this))
         using (var binding = ChannelPinningHelper.CreateReadWriteBinding(_cluster, sessionHandle))
         {
             return(await operation.ExecuteAsync(binding, cancellationToken).ConfigureAwait(false));
         }
 }
Exemplo n.º 5
0
 private TResult ExecuteEndTransactionOnPrimary <TResult>(IReadOperation <TResult> operation, CancellationToken cancellationToken)
 {
     using (var sessionHandle = new NonDisposingCoreSessionHandle(this))
         using (var binding = ChannelPinningHelper.CreateReadWriteBinding(_cluster, sessionHandle))
         {
             return(operation.Execute(binding, cancellationToken));
         }
 }
Exemplo n.º 6
0
        private IReadBinding CreateReadBinding(IClientSessionHandle session, ReadPreference readPreference)
        {
            if (session.IsInTransaction && readPreference.ReadPreferenceMode != ReadPreferenceMode.Primary)
            {
                throw new InvalidOperationException("Read preference in a transaction must be primary.");
            }

            return(ChannelPinningHelper.CreateReadBinding(_cluster, session.WrappedCoreSession.Fork(), readPreference));
        }
Exemplo n.º 7
0
        // private methods
        private IAsyncCursor <TDocument> CreateCursor(IChannelSourceHandle channelSource, BsonDocument query, CursorBatch <TDocument> batch)
        {
            var getMoreChannelSource = ChannelPinningHelper.CreateGetMoreChannelSource(channelSource, batch.CursorId);

            return(new AsyncCursor <TDocument>(
                       getMoreChannelSource,
                       _collectionNamespace,
                       query,
                       batch.Documents,
                       batch.CursorId,
                       _batchSize,
                       _limit < 0 ? Math.Abs(_limit.Value) : _limit,
                       _resultSerializer,
                       _messageEncoderSettings));
        }
Exemplo n.º 8
0
        /// <summary>
        /// Creates and initializes a retryable write operation context.
        /// </summary>
        /// <param name="binding">The binding.</param>
        /// <param name="retryRequested">if set to <c>true</c> [retry requested].</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>A retryable write context.</returns>
        public static async Task <RetryableWriteContext> CreateAsync(IWriteBinding binding, bool retryRequested, CancellationToken cancellationToken)
        {
            var context = new RetryableWriteContext(binding, retryRequested);

            try
            {
                await context.InitializeAsync(cancellationToken).ConfigureAwait(false);

                ChannelPinningHelper.PinChannellIfRequired(
                    context.ChannelSource,
                    context.Channel,
                    context.Binding.Session);

                return(context);
            }
            catch
            {
                context.Dispose();
                throw;
            }
        }
Exemplo n.º 9
0
        // public static methods
        /// <summary>
        /// Creates and initializes a retryable write operation context.
        /// </summary>
        /// <param name="binding">The binding.</param>
        /// <param name="retryRequested">if set to <c>true</c> [retry requested].</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>A retryable write context.</returns>
        public static RetryableWriteContext Create(IWriteBinding binding, bool retryRequested, CancellationToken cancellationToken)
        {
            var context = new RetryableWriteContext(binding, retryRequested);

            try
            {
                context.Initialize(cancellationToken);

                ChannelPinningHelper.PinChannellIfRequired(
                    context.ChannelSource,
                    context.Channel,
                    context.Binding.Session);

                return(context);
            }
            catch
            {
                context.Dispose();
                throw;
            }
        }
Exemplo n.º 10
0
 private IWriteBindingHandle CreateReadWriteBinding(IClientSessionHandle session)
 {
     return(ChannelPinningHelper.CreateReadWriteBinding(_cluster, session.WrappedCoreSession.Fork()));
 }