MassTransit/MassTransit · error · MongoDbSaveEventException
Write was not acknowledged
Error message
Write was not acknowledged
What it means
MongoDbSaveEventException thrown by RoutingSlipEventPersister.Persist when the UpdateOneAsync result (IsAcknowledged == false) indicates the MongoDB server did not acknowledge the upsert of the routing slip event document. Unacknowledged writes mean the driver/server could not confirm durability, so the library treats the save as failed and throws, allowing the retry policy around it to re-attempt. This occurs only with write concerns that can return unacknowledged results.
Solutions
- Configure the MongoDB client/collection with an acknowledged write concern (w:majority or at least w:1)
- Verify the replica set is healthy and can accept writes
- Check connectivity to mongod/mongos; the retry policy will re-run Persist, but the underlying concern must be fixed
Example fix
// before
var client = new MongoClient(new MongoClientSettings
{
Server = new MongoServerAddress("mongo", 27017),
WriteConcern = WriteConcern.Unacknowledged
});
// after
var client = new MongoClient(new MongoClientSettings
{
Server = new MongoServerAddress("mongo", 27017),
WriteConcern = WriteConcern.WMajority
}); Defensive patterns
Strategy: retry
Validate before calling
var settings = client.Settings;
if (settings.WriteConcern == WriteConcern.Unacknowledged || settings.WriteConcern.W == 0)
throw new InvalidOperationException("Courier persistence requires an acknowledged write concern (w >= 1)."); Try / catch
try
{
await Persist(...);
}
catch (MongoDbSaveEventException ex) when (ex.Message == "Write was not acknowledged")
{
logger.LogWarning(ex, "Routing slip event write not acknowledged for {TrackingNumber}; retrying", trackingNumber);
// retry with backoff; fail the message if retries exhaust
} Prevention
- Configure MongoDB client with WriteConcern.WMajority or at least W1
- Monitor replica set health; unacknowledged writes correlate with cluster instability
- Avoid w:0 / fire-and-forget write concerns anywhere in the persistence chain
When it happens
Trigger: Persisting a routing slip event (Courier) where the MongoDB write with IsUpsert=true completes but result.IsAcknowledged is false — typically when the collection/cluster is configured with w:0 (unacknowledged) write concern or the write failed without an acknowledged response.
Common situations: MongoDB deployments or collection settings using Unacknowledged/ w:0 write concern; replica-set failures where the server cannot confirm the write; misconfigured client settings for Courier persistence.
Related errors
- Multiple documents were modified: {result.ModifiedCount}
- An Activity Name is required
- An Activity ExecuteAddress is required
- An Activity Name is required
- Activity execute address was not specified.
AI-assisted analysis of MassTransit/MassTransit@62ab339afa (2026-09-13).
Data as JSON: /api/errors/702ff9717f99b53a.
Report an issue: GitHub.
Appendix: source
Thrown at src/Persistence/MassTransit.MongoDbIntegration/MongoDbIntegration/Courier/RoutingSlipEventPersister.cs:34
public RoutingSlipEventPersister(IMongoCollection<RoutingSlipDocument> collection)
{
_collection = collection;
_retryPolicy = Retry.Selected<MongoWriteException>().Interval(10, TimeSpan.FromMilliseconds(20));
}
Task IRoutingSlipEventPersister.Persist<T>(Guid trackingNumber, T @event)
{
FilterDefinition<RoutingSlipDocument> filterDefinition = Builders<RoutingSlipDocument>.Filter.Eq(x => x.TrackingNumber, trackingNumber);
UpdateDefinition<RoutingSlipDocument> update = Builders<RoutingSlipDocument>.Update.AddToSet(x => x.Events, @event);
return _retryPolicy.Retry(async () =>
{
var result = await _collection.UpdateOneAsync(filterDefinition, update, new UpdateOptions { IsUpsert = true }).ConfigureAwait(false);
if (!result.IsAcknowledged)
throw new MongoDbSaveEventException(trackingNumber, "Write was not acknowledged");
if (result.UpsertedId == null)
{
if (result.IsModifiedCountAvailable && result.ModifiedCount != 1)
throw new MongoDbSaveEventException(trackingNumber, $"Multiple documents were modified: {result.ModifiedCount}");
}
});
}
}
}
View on GitHub (pinned to 62ab339afa)