private async Task <T> ExecuteReadOperationAsync <T>(IClientSessionHandle session, IReadOperation <T> operation, ReadPreference readPreference, CancellationToken cancellationToken)
 {
     using (var binding = new ReadPreferenceBinding(_cluster, readPreference, session.ToCoreSession()))
     {
         return(await _operationExecutor.ExecuteReadOperationAsync(binding, operation, cancellationToken).ConfigureAwait(false));
     }
 }
        public void Session_reference_count_should_be_decremented_as_soon_as_possible(int collectionSize, int batchSize)
        {
            RequireServer.Check();
            DropCollection();
            var documents = Enumerable.Range(1, collectionSize).Select(n => new BsonDocument("_id", n));

            Insert(documents);

            _session.ReferenceCount().Should().Be(1);
            var cancellationToken = CancellationToken.None;

            using (var binding = new ReadPreferenceBinding(CoreTestConfiguration.Cluster, ReadPreference.Primary, _session.Fork()))
                using (var channelSource = (ChannelSourceHandle)binding.GetReadChannelSource(cancellationToken))
                    using (var channel = channelSource.GetChannel(cancellationToken))
                    {
                        var  query = new BsonDocument();
                        long cursorId;
                        var  firstBatch = GetFirstBatch(channel, query, batchSize, cancellationToken, out cursorId);

                        using (var cursor = new AsyncCursor <BsonDocument>(channelSource, _collectionNamespace, firstBatch, cursorId, batchSize, null, BsonDocumentSerializer.Instance, new MessageEncoderSettings()))
                        {
                            AssertExpectedSessionReferenceCount(_session, cursor);
                            while (cursor.MoveNext(cancellationToken))
                            {
                                AssertExpectedSessionReferenceCount(_session, cursor);
                            }
                            AssertExpectedSessionReferenceCount(_session, cursor);
                        }
                    }
            _session.ReferenceCount().Should().Be(1);
        }
示例#3
0
 private async Task <T> ExecuteReadOperation <T>(IReadOperation <T> operation, TimeSpan?timeout, CancellationToken cancellationToken)
 {
     using (var binding = new ReadPreferenceBinding(_cluster, _settings.ReadPreference))
     {
         return(await _operationExecutor.ExecuteReadOperationAsync(binding, operation, timeout ?? _settings.OperationTimeout, cancellationToken));
     }
 }
 private T ExecuteReadOperation <T>(IClientSessionHandle session, IReadOperation <T> operation, ReadPreference readPreference, CancellationToken cancellationToken)
 {
     using (var binding = new ReadPreferenceBinding(_cluster, readPreference, session.ToCoreSession()))
     {
         return(_operationExecutor.ExecuteReadOperation(binding, operation, cancellationToken));
     }
 }
示例#5
0
 private T ExecuteReadOperation <T>(IReadOperation <T> operation, ReadPreference readPreference, CancellationToken cancellationToken)
 {
     using (var binding = new ReadPreferenceBinding(_cluster, readPreference))
     {
         return(_operationExecutor.ExecuteReadOperation(binding, operation, cancellationToken));
     }
 }
        public static Task <BsonDocument> ExplainAggregation <TDocument, TResult>(
            this IMongoCollection <TDocument> collection
            , PipelineDefinition <TDocument, TResult> aggregationPipeline, ExplainVerbosity verbosity)
        {
            IBsonSerializerRegistry     serializerRegistry = collection.Settings.SerializerRegistry;
            IBsonSerializer <TDocument> serializer         = serializerRegistry.GetSerializer <TDocument>();
            MessageEncoderSettings      encoderSettings    = collection.GetMessageEncoderSettings();

            RenderedPipelineDefinition <TResult> renderedDefinition = aggregationPipeline.Render(serializer, serializerRegistry);

            IReadOperation <BsonDocument> explainOperation = new AggregateOperation <TResult>(
                collection.CollectionNamespace,
                renderedDefinition.Documents,
                renderedDefinition.OutputSerializer,
                encoderSettings)
                                                             .ToExplainOperation(verbosity);

            ICluster           cluster = GetCluster(collection);
            ICoreSessionHandle session = NoCoreSession.NewHandle();

            using (IReadBinding binding = new ReadPreferenceBinding(cluster, collection.Settings.ReadPreference, session))
            {
                var cancelToken = new CancellationToken();
                return(explainOperation.ExecuteAsync(binding, cancelToken));
            }
        }
 private TResult ExecuteReadOperation <TResult>(IClientSessionHandle session, IReadOperation <TResult> operation, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var binding = new ReadPreferenceBinding(_cluster, _settings.ReadPreference, session.ToCoreSession()))
     {
         return(_operationExecutor.ExecuteReadOperation(binding, operation, cancellationToken));
     }
 }
        /// <summary>
        /// Create a read binding handle.
        /// </summary>
        /// <param name="cluster">The cluster,</param>
        /// <param name="session">The session.</param>
        /// <param name="readPreference">The read preference.</param>
        /// <returns>An effective read binging.</returns>
        public static IReadBindingHandle CreateReadBinding(ICluster cluster, ICoreSessionHandle session, ReadPreference readPreference)
        {
            IReadBinding readBinding;

            if (session.IsInTransaction &&
                IsChannelPinned(session.CurrentTransaction) &&
                session.CurrentTransaction.State != CoreTransactionState.Starting)
            {
                readBinding = new ChannelReadWriteBinding(
                    session.CurrentTransaction.PinnedServer,
                    session.CurrentTransaction.PinnedChannel.Fork(),
                    session);
            }
            else
            {
                if (IsInLoadBalancedMode(cluster.Description) && IsChannelPinned(session.CurrentTransaction))
                {
                    // unpin if the next operation is not under transaction
                    session.CurrentTransaction.UnpinAll();
                }
                readBinding = new ReadPreferenceBinding(cluster, readPreference, session);
            }

            return(new ReadBindingHandle(readBinding));
        }
 private async Task <TResult> ExecuteReadOperation <TResult>(IReadOperation <TResult> operation, ReadPreference readPreference, CancellationToken cancellationToken)
 {
     using (var binding = new ReadPreferenceBinding(_cluster, readPreference))
     {
         return(await _operationExecutor.ExecuteReadOperationAsync(binding, operation, cancellationToken).ConfigureAwait(false));
     }
 }
示例#10
0
        protected TResult ExecuteOperation <TResult>(IReadOperation <TResult> operation, ReadPreference readPreference, bool async)
        {
            var cluster = CoreTestConfiguration.Cluster;

            using (var binding = new ReadPreferenceBinding(cluster, readPreference))
            {
                return(ExecuteOperation(operation, binding, async));
            }
        }
        /// <inheritdoc/>
        public sealed override async Task <IAsyncCursor <BsonDocument> > ListDatabasesAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            var messageEncoderSettings = GetMessageEncoderSettings();
            var operation = new ListDatabasesOperation(messageEncoderSettings);

            using (var binding = new ReadPreferenceBinding(_cluster, _settings.ReadPreference))
            {
                return(await _operationExecutor.ExecuteReadOperationAsync(binding, operation, cancellationToken).ConfigureAwait(false));
            }
        }
示例#12
0
        /// <summary>
        /// Gets the database names.
        /// </summary>
        /// <param name="timeout">The timeout.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>A list of the database on the server.</returns>
        public async Task <IReadOnlyList <string> > GetDatabaseNamesAsync(TimeSpan?timeout = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            var messageEncoderSettings = GetMessageEncoderSettings();
            var operation = new ListDatabaseNamesOperation(messageEncoderSettings);

            using (var binding = new ReadPreferenceBinding(_cluster, _settings.ReadPreference))
            {
                return(await _operationExecutor.ExecuteReadOperationAsync(binding, operation, timeout ?? _settings.OperationTimeout, cancellationToken).ConfigureAwait(false));
            }
        }
        protected TResult ExecuteOperation <TResult>(IReadOperation <TResult> operation, ReadPreference readPreference, bool async)
        {
            var cluster = CoreTestConfiguration.Cluster;

            using (var binding = new ReadPreferenceBinding(cluster, readPreference, NoCoreSession.NewHandle()))
                using (var bindingHandle = new ReadBindingHandle(binding))
                {
                    return(ExecuteOperation(operation, bindingHandle, async));
                }
        }
        public void Execute_should_return_expected_result()
        {
            var subject = new CurrentOpUsingFindOperation(_adminDatabaseNamespace, _messageEncoderSettings);

            using (var binding = new ReadPreferenceBinding(CoreTestConfiguration.Cluster, ReadPreference.PrimaryPreferred))
            {
                var result = subject.Execute(binding, CancellationToken.None);

                result.Contains("inprog");
            }
        }
        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.");
            }

            var binding = new ReadPreferenceBinding(_cluster, readPreference, session.WrappedCoreSession.Fork());

            return(new ReadBindingHandle(binding));
        }
        public void Execute_should_return_expected_result()
        {
            RequireServer.Check().ClusterTypes(ClusterType.Standalone, ClusterType.ReplicaSet).StorageEngine("mmapv1");
            var subject = new CurrentOpUsingFindOperation(_adminDatabaseNamespace, _messageEncoderSettings);

            using (var binding = new ReadPreferenceBinding(CoreTestConfiguration.Cluster, ReadPreference.PrimaryPreferred))
            {
                var result = subject.Execute(binding, CancellationToken.None);

                result.Contains("inprog");
            }
        }
示例#17
0
        public void Execute_should_return_expected_result()
        {
            RequireServer.Check().VersionGreaterThanOrEqualTo("3.1.2");
            var subject = new CurrentOpOperation(_adminDatabaseNamespace, _messageEncoderSettings);

            using (var binding = new ReadPreferenceBinding(CoreTestConfiguration.Cluster, ReadPreference.PrimaryPreferred, NoCoreSession.NewHandle()))
            {
                var result = subject.Execute(binding);

                result.Contains("inprog");
            }
        }
示例#18
0
        public void Execute_should_return_expected_result()
        {
            RequireServer.Check().Supports(Feature.CurrentOpCommand);
            var subject = new CurrentOpUsingCommandOperation(_adminDatabaseNamespace, _messageEncoderSettings);

            using (var binding = new ReadPreferenceBinding(CoreTestConfiguration.Cluster, ReadPreference.PrimaryPreferred, NoCoreSession.NewHandle()))
            {
                var result = subject.Execute(binding, CancellationToken.None);

                result.Contains("inprog");
            }
        }
示例#19
0
        public void Execute_should_return_expected_result()
        {
            RequireServer.Where(minimumVersion: "3.1.2");
            var subject = new CurrentOpOperation(_adminDatabaseNamespace, _messageEncoderSettings);

            using (var binding = new ReadPreferenceBinding(CoreTestConfiguration.Cluster, ReadPreference.PrimaryPreferred))
            {
                var result = subject.Execute(binding);

                result.Contains("inprog");
            }
        }
示例#20
0
        private IReadBindingHandle CreateReadBinding(IClientSessionHandle session)
        {
            var binding = new ReadPreferenceBinding(_cluster, _settings.ReadPreference, session.WrappedCoreSession.Fork());

            return(new ReadBindingHandle(binding));
        }
        private static IReadBindingHandle CreateReadBinding(ReadPreference readPreference, ICoreSessionHandle session)
        {
            var binding = new ReadPreferenceBinding(__cluster.Value, readPreference, session.Fork());

            return(new ReadBindingHandle(binding));
        }