[CSHARP-2287] RetryWrites=true in a transaction throws exception when using async writes Created: 04/Jun/18  Updated: 28/Oct/23  Resolved: 25/Jun/18

Status: Closed
Project: C# Driver
Component/s: None
Affects Version/s: 2.7.0
Fix Version/s: 2.7.0

Type: Bug Priority: Major - P3
Reporter: Mohammed Abdel Gader Ibrahim ElAmin [X] Assignee: Robert Stam
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Windows 10 64-bit, MongoDB 4.0.0-rc1, .NET Core 2.1


Epic Link: CSHARP MongoDB 4.0 Support

 Description   

I am using the C# driver 2.7.0-beta0001 and MongoDB 4.0.0-rc1 server and I am trying to update multiple documents on a single replica set server using the new transaction feature and I always get an exception:

MongoDB.Driver.MongoCommandException: Command update failed: BSON field 'OperationSessionInfo.txnNumber' is a duplicate field.
   at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.ProcessResponse(ConnectionId connectionId, CommandMessage responseMessage)
   at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.ExecuteAsync(IConnection connection, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Servers.Server.ServerChannel.ExecuteProtocolAsync[TResult](IWireProtocol`1 protocol, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Operations.RetryableWriteOperationExecutor.ExecuteAsync[TResult](IRetryableWriteOperation`1 operation, RetryableWriteContext context, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Operations.BulkUnmixedWriteOperationBase`1.ExecuteBatchAsync(RetryableWriteContext context, Batch batch, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Operations.BulkUnmixedWriteOperationBase`1.ExecuteBatchesAsync(RetryableWriteContext context, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.ExecuteBatchAsync(RetryableWriteContext context, Batch batch, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.ExecuteAsync(IWriteBinding binding, CancellationToken cancellationToken)
   at MongoDB.Driver.OperationExecutor.ExecuteWriteOperationAsync[TResult](IWriteBinding binding, IWriteOperation`1 operation, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionImpl`1.ExecuteWriteOperationAsync[TResult](IClientSessionHandle session, IWriteOperation`1 operation, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionImpl`1.BulkWriteAsync(IClientSessionHandle session, IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionBase`1.UpdateOneAsync(FilterDefinition`1 filter, UpdateDefinition`1 update, UpdateOptions options, Func`3 bulkWriteAsync)

Here is my code:

 
var client = new MongoClient(ConnectionString);
 
var database = client.GetDatabase(DatabaseName);
 
var Coupons = database.GetCollection<Coupon>("Coupons");
 
var Books = database.GetCollection<Book>("Books");
 
var session = await database.Client.StartSessionAsync();
session.StartTransaction();
 
try {
     Coupons.UpdateOneAsync(session, couponsFilter, couponsUpdate);//Exception happens at this line
 
     Books.UpdateOneAsync(session, booksFilter, booksUpdate); 
 
     await session.CommitTransactionAsync();
} catch (Exception ex) {
     await session.AbortTransactionAsync();
 
     Console.WriteLine(ex.StackTrace);
}



 Comments   
Comment by Githook User [ 25/Jun/18 ]

Author:

{'username': 'rstam', 'name': 'rstam', 'email': 'robert@robertstam.org'}

Message: CSHARP-2287: RetryWrites=true in a transaction throws exception when using async writes.
Branch: master
https://github.com/mongodb/mongo-csharp-driver/commit/dfe12cf0287cbc8c5eab10c002be8dd876ba614c

Comment by Robert Stam [ 13/Jun/18 ]

Good to know. That should make it easy to reproduce. Thanks for the update.

Comment by Mohammed Abdel Gader Ibrahim ElAmin [X] [ 13/Jun/18 ]

By removing the RetryWrites from MongoClientSettings the issue doesn't occur.

var mongoSettings = new MongoClientSettings()
{
    Server = server,
    Credential = credential
};

 

 

Comment by Mohammed Abdel Gader Ibrahim ElAmin [X] [ 09/Jun/18 ]

Here is the rest of the code I used to initialize the client.

var credential = MongoCredential.CreateCredential(Database, Username, Password);
var server = new MongoServerAddress(Host, Port);
var mongoSettings = new MongoClientSettings()
{
Server = server,
Credential = credential,
RetryWrites = true
};
var client = new MongoClient(mongoSettings);
 

Comment by Robert Stam [ 06/Jun/18 ]

I have so far been unable to reproduce this.

Can you share your connection string with me? (replace any confidential information with "xyz").

Generated at Wed Feb 07 21:42:08 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.