{"record":{"id":"702ff9717f99b53a","repo":"MassTransit/MassTransit","slug":"write-was-not-acknowledged","errorCode":null,"errorMessage":"Write was not acknowledged","messagePattern":"Write was not acknowledged","errorType":"exception","errorClass":"MongoDbSaveEventException","httpStatus":null,"severity":"error","filePath":"src/Persistence/MassTransit.MongoDbIntegration/MongoDbIntegration/Courier/RoutingSlipEventPersister.cs","lineNumber":34,"sourceCode":"        public RoutingSlipEventPersister(IMongoCollection<RoutingSlipDocument> collection)\n        {\n            _collection = collection;\n\n            _retryPolicy = Retry.Selected<MongoWriteException>().Interval(10, TimeSpan.FromMilliseconds(20));\n        }\n\n        Task IRoutingSlipEventPersister.Persist<T>(Guid trackingNumber, T @event)\n        {\n            FilterDefinition<RoutingSlipDocument> filterDefinition = Builders<RoutingSlipDocument>.Filter.Eq(x => x.TrackingNumber, trackingNumber);\n\n            UpdateDefinition<RoutingSlipDocument> update = Builders<RoutingSlipDocument>.Update.AddToSet(x => x.Events, @event);\n\n            return _retryPolicy.Retry(async () =>\n            {\n                var result = await _collection.UpdateOneAsync(filterDefinition, update, new UpdateOptions { IsUpsert = true }).ConfigureAwait(false);\n\n                if (!result.IsAcknowledged)\n                    throw new MongoDbSaveEventException(trackingNumber, \"Write was not acknowledged\");\n\n                if (result.UpsertedId == null)\n                {\n                    if (result.IsModifiedCountAvailable && result.ModifiedCount != 1)\n                        throw new MongoDbSaveEventException(trackingNumber, $\"Multiple documents were modified: {result.ModifiedCount}\");\n                }\n            });\n        }\n    }\n}\n","sourceCodeStart":16,"sourceCodeEnd":45,"githubUrl":"https://github.com/MassTransit/MassTransit/blob/62ab339afa3bac2e9b3fe1769d0d35d7e44778e9/src/Persistence/MassTransit.MongoDbIntegration/MongoDbIntegration/Courier/RoutingSlipEventPersister.cs#L16-L45","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nvar client = new MongoClient(new MongoClientSettings\n{\n    Server = new MongoServerAddress(\"mongo\", 27017),\n    WriteConcern = WriteConcern.Unacknowledged\n});\n// after\nvar client = new MongoClient(new MongoClientSettings\n{\n    Server = new MongoServerAddress(\"mongo\", 27017),\n    WriteConcern = WriteConcern.WMajority\n});","handlingStrategy":"retry","validationCode":"var settings = client.Settings;\nif (settings.WriteConcern == WriteConcern.Unacknowledged || settings.WriteConcern.W == 0)\n    throw new InvalidOperationException(\"Courier persistence requires an acknowledged write concern (w >= 1).\");","typeGuard":null,"tryCatchPattern":"try\n{\n    await Persist(...);\n}\ncatch (MongoDbSaveEventException ex) when (ex.Message == \"Write was not acknowledged\")\n{\n    logger.LogWarning(ex, \"Routing slip event write not acknowledged for {TrackingNumber}; retrying\", trackingNumber);\n    // retry with backoff; fail the message if retries exhaust\n}","preventionTips":["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"],"tags":["mongodb","write-concern","courier","routing-slip","persistence"],"backgroundTag":"database-write-failed","analyzedSha":"62ab339afa3bac2e9b3fe1769d0d35d7e44778e9","analyzedAt":"2026-09-13T22:47:47.593Z","contentChangedAt":"2026-09-13T22:47:47.593Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}