Skip to content

Commit 4b385b2

Browse files
author
rstam
committed
CSHARP-797: Add unit test for { j : 1 } when server is run with --nojournal.
1 parent c3ff21e commit 4b385b2

File tree

3 files changed

+135
-3
lines changed

3 files changed

+135
-3
lines changed

MongoDB.Driver/Exceptions/ExceptionMapper.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,25 @@ public static Exception Map(WriteConcernResult writeConcernResult)
9090
return new WriteConcernException(errorMessage, writeConcernResult);
9191
}
9292

93+
string lastErrorMessage = null;
9394
if (writeConcernResult.HasLastErrorMessage)
95+
{
96+
lastErrorMessage = writeConcernResult.LastErrorMessage;
97+
}
98+
else if (writeConcernResult.Response.Contains("jnote"))
99+
{
100+
lastErrorMessage = writeConcernResult.Response["jnote"].ToString();
101+
}
102+
else if (writeConcernResult.Response.Contains("wnote"))
103+
{
104+
lastErrorMessage = writeConcernResult.Response["wnote"].ToString();
105+
}
106+
107+
if (lastErrorMessage != null)
94108
{
95109
var errorMessage = string.Format(
96110
"WriteConcern detected an error '{0}'. (Response was {1}).",
97-
writeConcernResult.LastErrorMessage, writeConcernResult.Response.ToJson());
111+
lastErrorMessage, writeConcernResult.Response.ToJson());
98112
return new WriteConcernException(errorMessage, writeConcernResult);
99113
}
100114

MongoDB.Driver/Operations/BulkWriteBatchResult.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,22 @@ private static WriteConcernError CreateWriteConcernError(BsonDocument writeComma
378378
private static WriteConcernError CreateWriteConcernErrorFromGetLastErrorResponse(BsonDocument getLastErrorResponse)
379379
{
380380
var code = getLastErrorResponse.GetValue("code", 64).ToInt32(); // default = WriteConcernFailed
381-
var message = (string)getLastErrorResponse.GetValue("err", null);
381+
382+
string message = null;
383+
BsonValue value;
384+
if (getLastErrorResponse.TryGetValue("err", out value) && value.BsonType == BsonType.String)
385+
{
386+
message = value.AsString;
387+
}
388+
else if (getLastErrorResponse.TryGetValue("jnote", out value) && value.BsonType == BsonType.String)
389+
{
390+
message = value.AsString;
391+
}
392+
else if (getLastErrorResponse.TryGetValue("wnote", out value) && value.BsonType == BsonType.String)
393+
{
394+
message = value.AsString;
395+
}
396+
382397
var details = new BsonDocument(getLastErrorResponse.Where(e => !new[] { "ok", "code", "err" }.Contains(e.Name)));
383398

384399
return new WriteConcernError(code, message, details);

MongoDB.DriverUnitTests/Operations/BulkWriteOperationTests.cs

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,58 @@ public void TestMixedUpsertsUnordered()
412412
}
413413
}
414414

415+
[Test]
416+
[TestCase(false)]
417+
[TestCase(true)]
418+
public void TestNoJournal(bool ordered)
419+
{
420+
using (_server.RequestStart(null, ReadPreference.Primary))
421+
{
422+
var serverInstance = _server.RequestConnection.ServerInstance;
423+
if (serverInstance.InstanceType == MongoServerInstanceType.StandAlone)
424+
{
425+
_collection.Drop();
426+
var documents = new[]
427+
{
428+
new BsonDocument("x", 1)
429+
};
430+
431+
var bulk = InitializeBulkOperation(_collection, ordered);
432+
bulk.Insert(documents[0]);
433+
434+
var writeConcern = new WriteConcern { Journal = true };
435+
if (IsJournalEnabled(serverInstance))
436+
{
437+
var result = bulk.Execute(writeConcern);
438+
var expectedResult = new ExpectedResult { InsertedCount = 1, RequestCount = 1 };
439+
CheckExpectedResult(expectedResult, result);
440+
Assert.That(_collection.FindAll(), Is.EquivalentTo(documents));
441+
}
442+
else
443+
{
444+
if (serverInstance.Supports(FeatureId.WriteCommands))
445+
{
446+
Assert.Throws<MongoCommandException>(() => { bulk.Execute(writeConcern); });
447+
Assert.AreEqual(0, _collection.Count());
448+
}
449+
else
450+
{
451+
var exception = Assert.Throws<BulkWriteException>(() => { bulk.Execute(writeConcern); });
452+
var result = exception.Result;
453+
454+
var expectedResult = new ExpectedResult { InsertedCount = 1, RequestCount = 1 };
455+
CheckExpectedResult(expectedResult, result);
456+
Assert.That(_collection.FindAll(), Is.EquivalentTo(documents));
457+
458+
Assert.AreEqual(0, exception.UnprocessedRequests.Count);
459+
Assert.IsNotNull(exception.WriteConcernError);
460+
Assert.AreEqual(0, exception.WriteErrors.Count);
461+
}
462+
}
463+
}
464+
}
465+
}
466+
415467
[Test]
416468
public void TestOrderedBatchWithErrors()
417469
{
@@ -1185,6 +1237,35 @@ public void TestUpsertWithOneMatchingDocument(bool ordered)
11851237
}
11861238
}
11871239

1240+
[Test]
1241+
[TestCase(false)]
1242+
[TestCase(true)]
1243+
public void TestW0DoesNotReportErrors(bool ordered)
1244+
{
1245+
using (_server.RequestStart(null, ReadPreference.Primary))
1246+
{
1247+
var serverInstance = _server.RequestConnection.ServerInstance;
1248+
1249+
var documents = new[]
1250+
{
1251+
new BsonDocument("_id", 1),
1252+
new BsonDocument("_id", 1)
1253+
};
1254+
1255+
_collection.Drop();
1256+
var bulk = InitializeBulkOperation(_collection, ordered);
1257+
bulk.Insert(documents[0]);
1258+
bulk.Insert(documents[1]);
1259+
var result = bulk.Execute(WriteConcern.Unacknowledged);
1260+
1261+
var expectedResult = new ExpectedResult { IsAcknowledged = false, RequestCount = 2 };
1262+
CheckExpectedResult(expectedResult, result);
1263+
1264+
var expectedDocuments = new[] { documents[0] };
1265+
Assert.That(_collection.FindAll(), Is.EquivalentTo(expectedDocuments));
1266+
}
1267+
}
1268+
11881269
[Test]
11891270
[TestCase(false)]
11901271
[TestCase(true)]
@@ -1203,7 +1284,7 @@ public void TestW2AgainstStandalone(bool ordered)
12031284

12041285
if (serverInstance.Supports(FeatureId.WriteCommands))
12051286
{
1206-
var exception = Assert.Throws<MongoCommandException>(() => { bulk.Execute(WriteConcern.W2); });
1287+
Assert.Throws<MongoCommandException>(() => { bulk.Execute(WriteConcern.W2); });
12071288
Assert.AreEqual(0, _collection.Count());
12081289
}
12091290
else
@@ -1264,6 +1345,28 @@ private BulkWriteOperation InitializeBulkOperation(MongoCollection collection, b
12641345
return ordered ? collection.InitializeOrderedBulkOperation() : _collection.InitializeUnorderedBulkOperation();
12651346
}
12661347

1348+
private bool IsJournalEnabled(MongoServerInstance serverInstance)
1349+
{
1350+
using (_server.RequestStart(null, serverInstance))
1351+
{
1352+
var adminDatabase = _server.GetDatabase("admin");
1353+
var command = new CommandDocument("getCmdLineOpts", 1);
1354+
var result = adminDatabase.RunCommand(command);
1355+
1356+
BsonValue parsed;
1357+
if (result.Response.TryGetValue("parsed", out parsed))
1358+
{
1359+
BsonValue nojournal;
1360+
if (parsed.AsBsonDocument.TryGetValue("nojournal", out nojournal))
1361+
{
1362+
return !nojournal.ToBoolean();
1363+
}
1364+
}
1365+
1366+
return true;
1367+
}
1368+
}
1369+
12671370
// nested classes
12681371
private class ExpectedResult
12691372
{

0 commit comments

Comments
 (0)