Skip to content

Commit 20b752f

Browse files
committed
CSHARP-2221: RunCommand should use transaction's ReadPreference.
1 parent b42eaf5 commit 20b752f

File tree

4 files changed

+55
-29
lines changed

4 files changed

+55
-29
lines changed

src/MongoDB.Driver/MongoCollectionImpl.cs

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
using MongoDB.Driver.Core.Operations;
2828
using MongoDB.Driver.Core.WireProtocol.Messages.Encoders;
2929
using MongoDB.Driver.Linq;
30-
using MongoDB.Bson.Serialization.Serializers;
3130

3231
namespace MongoDB.Driver
3332
{
@@ -977,8 +976,8 @@ private IBsonSerializer<TField> GetValueSerializerForDistinct<TField>(RenderedFi
977976

978977
private TResult ExecuteReadOperation<TResult>(IClientSessionHandle session, IReadOperation<TResult> operation, CancellationToken cancellationToken = default(CancellationToken))
979978
{
980-
var readPreference = GetReadPreference(session);
981-
return ExecuteReadOperation(session, operation, readPreference, cancellationToken);
979+
var effectiveReadPreference = ReadPreferenceResolver.GetEffectiveReadPreference(session, null, _settings.ReadPreference);
980+
return ExecuteReadOperation(session, operation, effectiveReadPreference, cancellationToken);
982981
}
983982

984983
private TResult ExecuteReadOperation<TResult>(IClientSessionHandle session, IReadOperation<TResult> operation, ReadPreference readPreference, CancellationToken cancellationToken = default(CancellationToken))
@@ -991,8 +990,8 @@ private IBsonSerializer<TField> GetValueSerializerForDistinct<TField>(RenderedFi
991990

992991
private Task<TResult> ExecuteReadOperationAsync<TResult>(IClientSessionHandle session, IReadOperation<TResult> operation, CancellationToken cancellationToken = default(CancellationToken))
993992
{
994-
var readPreference = GetReadPreference(session);
995-
return ExecuteReadOperationAsync(session, operation, readPreference, cancellationToken);
993+
var effectiveReadPreference = ReadPreferenceResolver.GetEffectiveReadPreference(session, null, _settings.ReadPreference);
994+
return ExecuteReadOperationAsync(session, operation, effectiveReadPreference, cancellationToken);
996995
}
997996

998997
private async Task<TResult> ExecuteReadOperationAsync<TResult>(IClientSessionHandle session, IReadOperation<TResult> operation, ReadPreference readPreference, CancellationToken cancellationToken = default(CancellationToken))
@@ -1019,22 +1018,6 @@ private IBsonSerializer<TField> GetValueSerializerForDistinct<TField>(RenderedFi
10191018
}
10201019
}
10211020

1022-
private ReadPreference GetReadPreference(IClientSession session)
1023-
{
1024-
var readPreference = _settings.ReadPreference;
1025-
1026-
if (session.IsInTransaction)
1027-
{
1028-
var transactionReadPreference = session.WrappedCoreSession.CurrentTransaction.TransactionOptions.ReadPreference;
1029-
if (transactionReadPreference != null)
1030-
{
1031-
readPreference = transactionReadPreference;
1032-
}
1033-
}
1034-
1035-
return readPreference;
1036-
}
1037-
10381021
private IEnumerable<BsonDocument> RenderArrayFilters(IEnumerable<ArrayFilterDefinition> arrayFilters)
10391022
{
10401023
if (arrayFilters == null)

src/MongoDB.Driver/MongoDB.Driver.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@
304304
<Compile Include="ProjectionDefinitionBuilder.cs" />
305305
<Compile Include="IndexKeysDefinitionBuilder.cs" />
306306
<Compile Include="IServerSession.cs" />
307+
<Compile Include="ReadPreferenceResolver.cs" />
307308
<Compile Include="ServerSession.cs" />
308309
<Compile Include="SortDefinitionBuilder.cs" />
309310
<Compile Include="FilterDefinitionBuilder.cs" />

src/MongoDB.Driver/MongoDatabaseImpl.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
*/
1515

1616
using System;
17-
using System.Collections.Generic;
18-
using System.Linq;
1917
using System.Reflection;
2018
using System.Threading;
2119
using System.Threading.Tasks;
@@ -203,7 +201,8 @@ public override IAsyncCursor<BsonDocument> ListCollections(IClientSessionHandle
203201
Ensure.IsNotNull(session, nameof(session));
204202
options = options ?? new ListCollectionsOptions();
205203
var operation = CreateListCollectionsOperation(options);
206-
return ExecuteReadOperation(session, operation, ReadPreference.Primary, cancellationToken);
204+
var effectiveReadPreference = ReadPreferenceResolver.GetEffectiveReadPreference(session, null, ReadPreference.Primary);
205+
return ExecuteReadOperation(session, operation, effectiveReadPreference, cancellationToken);
207206
}
208207

209208
public override Task<IAsyncCursor<BsonDocument>> ListCollectionsAsync(ListCollectionsOptions options, CancellationToken cancellationToken)
@@ -216,7 +215,8 @@ public override Task<IAsyncCursor<BsonDocument>> ListCollectionsAsync(IClientSes
216215
Ensure.IsNotNull(session, nameof(session));
217216
options = options ?? new ListCollectionsOptions();
218217
var operation = CreateListCollectionsOperation(options);
219-
return ExecuteReadOperationAsync(session, operation, ReadPreference.Primary, cancellationToken);
218+
var effectiveReadPreference = ReadPreferenceResolver.GetEffectiveReadPreference(session, null, ReadPreference.Primary);
219+
return ExecuteReadOperationAsync(session, operation, effectiveReadPreference, cancellationToken);
220220
}
221221

222222
public override void RenameCollection(string oldName, string newName, RenameCollectionOptions options, CancellationToken cancellationToken)
@@ -260,10 +260,10 @@ public override Task RenameCollectionAsync(IClientSessionHandle session, string
260260
{
261261
Ensure.IsNotNull(session, nameof(session));
262262
Ensure.IsNotNull(command, nameof(command));
263-
readPreference = readPreference ?? ReadPreference.Primary;
264263

265264
var operation = CreateRunCommandOperation(command);
266-
return ExecuteReadOperation(session, operation, readPreference, cancellationToken);
265+
var effectiveReadPreference = ReadPreferenceResolver.GetEffectiveReadPreference(session, readPreference, ReadPreference.Primary);
266+
return ExecuteReadOperation(session, operation, effectiveReadPreference, cancellationToken);
267267
}
268268

269269
public override Task<TResult> RunCommandAsync<TResult>(Command<TResult> command, ReadPreference readPreference = null, CancellationToken cancellationToken = default(CancellationToken))
@@ -275,10 +275,10 @@ public override Task RenameCollectionAsync(IClientSessionHandle session, string
275275
{
276276
Ensure.IsNotNull(session, nameof(session));
277277
Ensure.IsNotNull(command, nameof(command));
278-
readPreference = readPreference ?? ReadPreference.Primary;
279278

280279
var operation = CreateRunCommandOperation(command);
281-
return ExecuteReadOperationAsync(session, operation, readPreference, cancellationToken);
280+
var effectiveReadPreference = ReadPreferenceResolver.GetEffectiveReadPreference(session, readPreference, ReadPreference.Primary);
281+
return ExecuteReadOperationAsync(session, operation, effectiveReadPreference, cancellationToken);
282282
}
283283

284284
public override IMongoDatabase WithReadConcern(ReadConcern readConcern)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/* Copyright 2018-present MongoDB Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
namespace MongoDB.Driver
17+
{
18+
internal static class ReadPreferenceResolver
19+
{
20+
public static ReadPreference GetEffectiveReadPreference(
21+
IClientSessionHandle session,
22+
ReadPreference explicitReadPreference,
23+
ReadPreference defaultReadPreference)
24+
{
25+
if (explicitReadPreference != null)
26+
{
27+
return explicitReadPreference;
28+
}
29+
30+
if (session.IsInTransaction)
31+
{
32+
var transactionReadPreference = session.WrappedCoreSession.CurrentTransaction.TransactionOptions.ReadPreference;
33+
if (transactionReadPreference != null)
34+
{
35+
return transactionReadPreference;
36+
}
37+
}
38+
39+
return defaultReadPreference ?? ReadPreference.Primary;
40+
}
41+
}
42+
}

0 commit comments

Comments
 (0)