Skip to content

Commit 1be980a

Browse files
committed
CSHARP-1688: Handle writeConcernError in responses from server.
1 parent 13e6165 commit 1be980a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1023
-191
lines changed

src/MongoDB.Driver.Core/Core/Operations/AggregateToCollectionOperation.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,9 @@ public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellatio
162162
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
163163
{
164164
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
165-
return operation.Execute(channelBinding, cancellationToken);
165+
var result = operation.Execute(channelBinding, cancellationToken);
166+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
167+
return result;
166168
}
167169
}
168170

@@ -176,7 +178,9 @@ public async Task<BsonDocument> ExecuteAsync(IWriteBinding binding, Cancellation
176178
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
177179
{
178180
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
179-
return await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
181+
var result = await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
182+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
183+
return result;
180184
}
181185
}
182186

src/MongoDB.Driver.Core/Core/Operations/CreateCollectionOperation.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,9 @@ public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellatio
260260
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
261261
{
262262
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
263-
return operation.Execute(channelBinding, cancellationToken);
263+
var result = operation.Execute(channelBinding, cancellationToken);
264+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
265+
return result;
264266
}
265267
}
266268

@@ -274,7 +276,9 @@ public async Task<BsonDocument> ExecuteAsync(IWriteBinding binding, Cancellation
274276
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
275277
{
276278
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
277-
return await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
279+
var result = await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
280+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
281+
return result;
278282
}
279283
}
280284

src/MongoDB.Driver.Core/Core/Operations/CreateIndexesUsingCommandOperation.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,9 @@ public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellatio
112112
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
113113
{
114114
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
115-
return operation.Execute(channelBinding, cancellationToken);
115+
var result = operation.Execute(channelBinding, cancellationToken);
116+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
117+
return result;
116118
}
117119
}
118120

@@ -125,7 +127,9 @@ public async Task<BsonDocument> ExecuteAsync(IWriteBinding binding, Cancellation
125127
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
126128
{
127129
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
128-
return await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
130+
var result = await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
131+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
132+
return result;
129133
}
130134
}
131135

src/MongoDB.Driver.Core/Core/Operations/CreateViewOperation.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,9 @@ public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellatio
153153
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
154154
{
155155
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
156-
return operation.Execute(channelBinding, cancellationToken);
156+
var result = operation.Execute(channelBinding, cancellationToken);
157+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
158+
return result;
157159
}
158160
}
159161

@@ -167,7 +169,9 @@ public async Task<BsonDocument> ExecuteAsync(IWriteBinding binding, Cancellation
167169
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
168170
{
169171
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
170-
return await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
172+
var result = await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
173+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
174+
return result;
171175
}
172176
}
173177

src/MongoDB.Driver.Core/Core/Operations/DropCollectionOperation.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,18 +94,21 @@ public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellatio
9494
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
9595
{
9696
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
97+
BsonDocument result;
9798
try
9899
{
99-
return operation.Execute(binding, cancellationToken);
100+
result = operation.Execute(binding, cancellationToken);
100101
}
101102
catch (MongoCommandException ex)
102103
{
103-
if (ShouldIgnoreException(ex))
104+
if (!ShouldIgnoreException(ex))
104105
{
105-
return ex.Result;
106+
throw;
106107
}
107-
throw;
108+
result = ex.Result;
108109
}
110+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
111+
return result;
109112
}
110113
}
111114

@@ -119,18 +122,21 @@ public async Task<BsonDocument> ExecuteAsync(IWriteBinding binding, Cancellation
119122
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
120123
{
121124
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
125+
BsonDocument result;
122126
try
123127
{
124-
return await operation.ExecuteAsync(binding, cancellationToken).ConfigureAwait(false);
128+
result = await operation.ExecuteAsync(binding, cancellationToken).ConfigureAwait(false);
125129
}
126130
catch (MongoCommandException ex)
127131
{
128-
if (ShouldIgnoreException(ex))
132+
if (!ShouldIgnoreException(ex))
129133
{
130-
return ex.Result;
134+
throw;
131135
}
132-
throw;
136+
result = ex.Result;
133137
}
138+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
139+
return result;
134140
}
135141
}
136142

src/MongoDB.Driver.Core/Core/Operations/DropDatabaseOperation.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellatio
9494
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
9595
{
9696
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
97-
return operation.Execute(channelBinding, cancellationToken);
97+
var result = operation.Execute(channelBinding, cancellationToken);
98+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
99+
return result;
98100
}
99101
}
100102

@@ -108,7 +110,9 @@ public async Task<BsonDocument> ExecuteAsync(IWriteBinding binding, Cancellation
108110
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
109111
{
110112
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
111-
return await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
113+
var result = await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
114+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
115+
return result;
112116
}
113117
}
114118

src/MongoDB.Driver.Core/Core/Operations/DropIndexOperation.cs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -138,19 +138,22 @@ public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellatio
138138
using (var channel = channelSource.GetChannel(cancellationToken))
139139
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
140140
{
141+
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
142+
BsonDocument result;
141143
try
142144
{
143-
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
144-
return operation.Execute(channelBinding, cancellationToken);
145+
result = operation.Execute(channelBinding, cancellationToken);
145146
}
146147
catch (MongoCommandException ex)
147148
{
148-
if (ShouldIgnoreException(ex))
149+
if (!ShouldIgnoreException(ex))
149150
{
150-
return ex.Result;
151+
throw;
151152
}
152-
throw;
153+
result = ex.Result;
153154
}
155+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
156+
return result;
154157
}
155158
}
156159

@@ -163,19 +166,22 @@ public async Task<BsonDocument> ExecuteAsync(IWriteBinding binding, Cancellation
163166
using (var channel = await channelSource.GetChannelAsync(cancellationToken).ConfigureAwait(false))
164167
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
165168
{
169+
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
170+
BsonDocument result;
166171
try
167172
{
168-
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
169-
return await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
173+
result = await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
170174
}
171175
catch (MongoCommandException ex)
172176
{
173-
if (ShouldIgnoreException(ex))
177+
if (!ShouldIgnoreException(ex))
174178
{
175-
return ex.Result;
179+
throw;
176180
}
177-
throw;
181+
result = ex.Result;
178182
}
183+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
184+
return result;
179185
}
180186
}
181187

src/MongoDB.Driver.Core/Core/Operations/MapReduceOutputToCollectionOperation.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,9 @@ public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellatio
173173
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
174174
{
175175
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
176-
return operation.Execute(channelBinding, cancellationToken);
176+
var result = operation.Execute(channelBinding, cancellationToken);
177+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
178+
return result;
177179
}
178180
}
179181

@@ -187,7 +189,9 @@ public async Task<BsonDocument> ExecuteAsync(IWriteBinding binding, Cancellation
187189
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
188190
{
189191
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
190-
return await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
192+
var result = await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
193+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
194+
return result;
191195
}
192196
}
193197

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
/* Copyright 2016 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+
using System.Threading;
17+
using System.Threading.Tasks;
18+
using MongoDB.Bson;
19+
using MongoDB.Bson.Serialization.Serializers;
20+
using MongoDB.Driver.Core.Bindings;
21+
using MongoDB.Driver.Core.Misc;
22+
using MongoDB.Driver.Core.WireProtocol.Messages.Encoders;
23+
24+
namespace MongoDB.Driver.Core.Operations
25+
{
26+
/// <summary>
27+
/// Represents a reindex operation.
28+
/// </summary>
29+
public class ReIndexOperation : IWriteOperation<BsonDocument>
30+
{
31+
// fields
32+
private readonly CollectionNamespace _collectionNamespace;
33+
private readonly MessageEncoderSettings _messageEncoderSettings;
34+
private WriteConcern _writeConcern;
35+
36+
// constructors
37+
/// <summary>
38+
/// Initializes a new instance of the <see cref="ReIndexOperation"/> class.
39+
/// </summary>
40+
/// <param name="collectionNamespace">The collection namespace.</param>
41+
/// <param name="messageEncoderSettings">The message encoder settings.</param>
42+
public ReIndexOperation(
43+
CollectionNamespace collectionNamespace,
44+
MessageEncoderSettings messageEncoderSettings)
45+
{
46+
_collectionNamespace = Ensure.IsNotNull(collectionNamespace, nameof(collectionNamespace));
47+
_messageEncoderSettings = Ensure.IsNotNull(messageEncoderSettings, nameof(messageEncoderSettings));
48+
}
49+
50+
// properties
51+
/// <summary>
52+
/// Gets the collection namespace.
53+
/// </summary>
54+
/// <value>
55+
/// The collection namespace.
56+
/// </value>
57+
public CollectionNamespace CollectionNamespace
58+
{
59+
get { return _collectionNamespace; }
60+
}
61+
62+
/// <summary>
63+
/// Gets the message encoder settings.
64+
/// </summary>
65+
/// <value>
66+
/// The message encoder settings.
67+
/// </value>
68+
public MessageEncoderSettings MessageEncoderSettings
69+
{
70+
get { return _messageEncoderSettings; }
71+
}
72+
73+
/// <summary>
74+
/// Gets or sets the write concern.
75+
/// </summary>
76+
/// <value>
77+
/// The write concern.
78+
/// </value>
79+
public WriteConcern WriteConcern
80+
{
81+
get { return _writeConcern; }
82+
set { _writeConcern = value; }
83+
}
84+
85+
// public methods
86+
/// <inheritdoc/>
87+
public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellationToken)
88+
{
89+
Ensure.IsNotNull(binding, nameof(binding));
90+
91+
using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
92+
using (var channel = channelSource.GetChannel(cancellationToken))
93+
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
94+
{
95+
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
96+
var result = operation.Execute(binding, cancellationToken);
97+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
98+
return result;
99+
}
100+
}
101+
102+
/// <inheritdoc/>
103+
public async Task<BsonDocument> ExecuteAsync(IWriteBinding binding, CancellationToken cancellationToken)
104+
{
105+
Ensure.IsNotNull(binding, nameof(binding));
106+
107+
using (var channelSource = await binding.GetWriteChannelSourceAsync(cancellationToken).ConfigureAwait(false))
108+
using (var channel = await channelSource.GetChannelAsync(cancellationToken).ConfigureAwait(false))
109+
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
110+
{
111+
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
112+
var result = await operation.ExecuteAsync(binding, cancellationToken).ConfigureAwait(false);
113+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
114+
return result;
115+
}
116+
}
117+
118+
// private methods
119+
internal BsonDocument CreateCommand(SemanticVersion serverVersion)
120+
{
121+
return new BsonDocument
122+
{
123+
{ "reIndex", _collectionNamespace.CollectionName },
124+
{ "writeConcern", () => _writeConcern.ToBsonDocument(), Feature.CommandsThatWriteAcceptWriteConcern.ShouldSendWriteConcern(serverVersion, _writeConcern) }
125+
};
126+
}
127+
128+
private WriteCommandOperation<BsonDocument> CreateOperation(SemanticVersion serverVersion)
129+
{
130+
var command = CreateCommand(serverVersion);
131+
return new WriteCommandOperation<BsonDocument>(_collectionNamespace.DatabaseNamespace, command, BsonDocumentSerializer.Instance, _messageEncoderSettings);
132+
}
133+
}
134+
}

src/MongoDB.Driver.Core/Core/Operations/RenameCollectionOperation.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,9 @@ public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellatio
139139
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
140140
{
141141
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
142-
return operation.Execute(channelBinding, cancellationToken);
142+
var result = operation.Execute(channelBinding, cancellationToken);
143+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
144+
return result;
143145
}
144146
}
145147

@@ -153,7 +155,9 @@ public async Task<BsonDocument> ExecuteAsync(IWriteBinding binding, Cancellation
153155
using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
154156
{
155157
var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
156-
return await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
158+
var result = await operation.ExecuteAsync(channelBinding, cancellationToken).ConfigureAwait(false);
159+
WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
160+
return result;
157161
}
158162
}
159163
}

0 commit comments

Comments
 (0)