Skip to content

Commit 10cfbad

Browse files
committed
CSHARP-959: wnote and jnote no longer throw errors on pre 2.6 servers.
1 parent 85565d4 commit 10cfbad

File tree

7 files changed

+86
-11
lines changed

7 files changed

+86
-11
lines changed

MongoDB.Driver/Exceptions/ExceptionMapper.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,22 @@ public static Exception Map(WriteConcernResult writeConcernResult)
9090
return new WriteConcernException(errorMessage, writeConcernResult);
9191
}
9292

93+
bool wnoteAndJnoteAreErrors = writeConcernResult.ServerInstance.BuildInfo.Version >= new Version(2, 6, 0);
9394
string lastErrorMessage = null;
9495
if (writeConcernResult.HasLastErrorMessage)
9596
{
9697
lastErrorMessage = writeConcernResult.LastErrorMessage;
9798
}
98-
else if (writeConcernResult.Response.Contains("jnote"))
99+
else if (wnoteAndJnoteAreErrors)
99100
{
100-
lastErrorMessage = writeConcernResult.Response["jnote"].ToString();
101-
}
102-
else if (writeConcernResult.Response.Contains("wnote"))
103-
{
104-
lastErrorMessage = writeConcernResult.Response["wnote"].ToString();
101+
if (writeConcernResult.Response.Contains("jnote"))
102+
{
103+
lastErrorMessage = writeConcernResult.Response["jnote"].ToString();
104+
}
105+
else if (writeConcernResult.Response.Contains("wnote"))
106+
{
107+
lastErrorMessage = writeConcernResult.Response["wnote"].ToString();
108+
}
105109
}
106110

107111
if (lastErrorMessage != null)

MongoDB.Driver/Operations/BulkWriteResultConverter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ public BulkWriteResultConverter()
2828
}
2929

3030
// public methods
31-
public Exception ToWriteConcernException(BulkWriteException bulkWriteException)
31+
public Exception ToWriteConcernException(MongoServerInstance serverInstance, BulkWriteException bulkWriteException)
3232
{
3333
var writeConcernResult = ToWriteConcernResult(bulkWriteException.Result, bulkWriteException);
34+
writeConcernResult.ServerInstance = serverInstance;
3435

3536
var exception = ExceptionMapper.Map(writeConcernResult.Response);
3637
if (exception == null)
@@ -113,7 +114,6 @@ private WriteConcernResult ToWriteConcernResult(BulkWriteResult bulkWriteResult,
113114
{ "upserted", () => upsert.Id, isUpdate && upsert != null },
114115
};
115116
getLastErrorResponse.Merge(details, false); // don't overwrite existing elements
116-
117117
return new WriteConcernResult(getLastErrorResponse);
118118
}
119119
}

MongoDB.Driver/Operations/DeleteOpcodeOperationEmulator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public WriteConcernResult Execute(MongoConnection connection)
5858
var converter = new BulkWriteResultConverter();
5959
if (bulkWriteException != null)
6060
{
61-
throw converter.ToWriteConcernException(bulkWriteException);
61+
throw converter.ToWriteConcernException(serverInstance, bulkWriteException);
6262
}
6363
else
6464
{

MongoDB.Driver/Operations/InsertOpcodeOperationEmulator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public IEnumerable<WriteConcernResult> Execute(MongoConnection connection)
6161
var converter = new BulkWriteResultConverter();
6262
if (bulkWriteException != null)
6363
{
64-
throw converter.ToWriteConcernException(bulkWriteException);
64+
throw converter.ToWriteConcernException(serverInstance, bulkWriteException);
6565
}
6666
else
6767
{

MongoDB.Driver/Operations/UpdateOpcodeOperationEmulator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public WriteConcernResult Execute(MongoConnection connection)
5858
var converter = new BulkWriteResultConverter();
5959
if (bulkWriteException != null)
6060
{
61-
throw converter.ToWriteConcernException(bulkWriteException);
61+
throw converter.ToWriteConcernException(serverInstance, bulkWriteException);
6262
}
6363
else
6464
{

MongoDB.Driver/Operations/WriteOpcodeOperationBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ protected WriteConcernResult ReadWriteConcernResult(MongoConnection connection,
5050
}
5151
var writeConcernResult = replyMessage.Documents[0];
5252
writeConcernResult.Command = sendMessageResult.GetLastErrorCommand;
53+
writeConcernResult.ServerInstance = connection.ServerInstance;
5354

5455
var mappedException = ExceptionMapper.Map(writeConcernResult);
5556
if (mappedException != null)

MongoDB.DriverUnitTests/Exceptions/ExceptionMapperTests.cs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* limitations under the License.
1414
*/
1515

16+
using System;
1617
using MongoDB.Bson;
1718
using MongoDB.Driver;
1819
using NUnit.Framework;
@@ -22,6 +23,14 @@ namespace MongoDB.DriverUnitTests.Exceptions
2223
[TestFixture]
2324
public class ExceptionMapperTests
2425
{
26+
private MongoServerInstance _primary;
27+
28+
[TestFixtureSetUp]
29+
public void Setup()
30+
{
31+
_primary = Configuration.TestServer.Primary;
32+
}
33+
2534
[Test]
2635
public void TestDoesNotThrowExceptionWhenEverythingIsKosherWithAWriteConcernResult()
2736
{
@@ -33,6 +42,7 @@ public void TestDoesNotThrowExceptionWhenEverythingIsKosherWithAWriteConcernResu
3342
};
3443

3544
var writeConcernResult = new WriteConcernResult(response);
45+
writeConcernResult.ServerInstance = _primary;
3646
var ex = ExceptionMapper.Map(writeConcernResult);
3747

3848
Assert.IsNull(ex);
@@ -64,6 +74,7 @@ public void TestThrowsDuplicateKeyExceptionForMongod(int code)
6474
};
6575

6676
var writeConcernResult = new WriteConcernResult(response);
77+
writeConcernResult.ServerInstance = _primary;
6778
var ex = ExceptionMapper.Map(writeConcernResult);
6879

6980
Assert.IsNotNull(ex);
@@ -98,6 +109,7 @@ public void TestThrowsDuplicateKeyExceptionForMongos(int code)
98109
};
99110

100111
var writeConcernResult = new WriteConcernResult(response);
112+
writeConcernResult.ServerInstance = _primary;
101113
var ex = ExceptionMapper.Map(writeConcernResult);
102114

103115
Assert.IsNotNull(ex);
@@ -117,6 +129,7 @@ public void TestThrowsWriteConcernExceptionWhenNotOk()
117129
};
118130

119131
var writeConcernResult = new WriteConcernResult(response);
132+
writeConcernResult.ServerInstance = _primary;
120133
var ex = ExceptionMapper.Map(writeConcernResult);
121134

122135
Assert.IsNotNull(ex);
@@ -136,12 +149,69 @@ public void TestThrowsWriteConcernExceptionWhenOkButHasLastErrorMessage()
136149
};
137150

138151
var writeConcernResult = new WriteConcernResult(response);
152+
writeConcernResult.ServerInstance = _primary;
139153
var ex = ExceptionMapper.Map(writeConcernResult);
140154

141155
Assert.IsNotNull(ex);
142156
Assert.IsInstanceOf<WriteConcernException>(ex);
143157
}
144158

159+
[Test]
160+
public void TestThrowsWriteConcernExceptionWhenOkButHasWNoteOnPre26Servers()
161+
{
162+
var response = new BsonDocument
163+
{
164+
{ "err", BsonNull.Value },
165+
{ "code", 20 },
166+
{ "n", 0 },
167+
{ "connectionId", 1 },
168+
{ "ok", 1 },
169+
{ "wnote", "oops" }
170+
};
171+
172+
var writeConcernResult = new WriteConcernResult(response);
173+
writeConcernResult.ServerInstance = _primary;
174+
var ex = ExceptionMapper.Map(writeConcernResult);
175+
176+
if (_primary.BuildInfo.Version < new Version(2, 6, 0))
177+
{
178+
Assert.IsNull(ex);
179+
}
180+
else
181+
{
182+
Assert.IsNotNull(ex);
183+
Assert.IsInstanceOf<WriteConcernException>(ex);
184+
}
185+
}
186+
187+
[Test]
188+
public void TestThrowsWriteConcernExceptionWhenOkButHasJNoteOnPre26Servers()
189+
{
190+
var response = new BsonDocument
191+
{
192+
{ "err", BsonNull.Value },
193+
{ "code", 20 },
194+
{ "n", 0 },
195+
{ "connectionId", 1 },
196+
{ "ok", 1 },
197+
{ "jnote", "oops" }
198+
};
199+
200+
var writeConcernResult = new WriteConcernResult(response);
201+
writeConcernResult.ServerInstance = _primary;
202+
var ex = ExceptionMapper.Map(writeConcernResult);
203+
204+
if (_primary.BuildInfo.Version < new Version(2, 6, 0))
205+
{
206+
Assert.IsNull(ex);
207+
}
208+
else
209+
{
210+
Assert.IsNotNull(ex);
211+
Assert.IsInstanceOf<WriteConcernException>(ex);
212+
}
213+
}
214+
145215
[Test]
146216
[TestCase(50)]
147217
[TestCase(13475)]

0 commit comments

Comments
 (0)