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

  1. Configure the MongoDB client/collection with an acknowledged write concern (w:majority or at least w:1)
  2. Verify the replica set is healthy and can accept writes
  3. 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

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


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)