[CSHARP-2668] Error "ObjectSerializer does not support BSON type 'Timestamp'" when running against replica set Created: 18/Jul/19  Updated: 08/Feb/23

Status: Backlog
Project: C# Driver
Component/s: Serialization
Affects Version/s: 2.8.0
Fix Version/s: None

Type: Bug Priority: Major - P3
Reporter: Daniel Hegener Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Attachments: PNG File image-2019-07-18-23-35-01-511.png     PNG File image-2019-07-18-23-57-24-943.png     PNG File image-2019-07-18-23-59-58-793.png     PNG File image-2019-07-19-00-01-59-708.png    
Issue Links:
Duplicate
is duplicated by CSHARP-2271 ObjectSerializer should support deser... Closed
Related
related to CSHARP-2271 ObjectSerializer should support deser... Closed
Backwards Compatibility: Fully Compatible

 Description   

When attempting to run a command against a MongoDB replica set it fails with the following stack trace:

System.FormatException: ObjectSerializer does not support BSON type 'Timestamp'.
 at MongoDB.Bson.Serialization.Serializers.ObjectSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
 at MongoDB.Bson.Serialization.Serializers.DynamicDocumentBaseSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.Serializers.ObjectSerializer.DeserializeDiscriminatedValue(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.Serializers.ObjectSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
 at MongoDB.Bson.Serialization.Serializers.DynamicDocumentBaseSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.Serializers.ObjectSerializer.DeserializeDiscriminatedValue(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.Serializers.ObjectSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
 at MongoDB.Bson.Serialization.Serializers.DynamicDocumentBaseSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.Serializers.ObjectSerializer.DeserializeDiscriminatedValue(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.Serializers.ObjectSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
 at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
 at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.ProcessResponse(ConnectionId connectionId, CommandMessage responseMessage)
 at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.Execute(IConnection connection, CancellationToken cancellationToken)
 at MongoDB.Driver.Core.WireProtocol.CommandWireProtocol`1.Execute(IConnection connection, CancellationToken cancellationToken)
 at MongoDB.Driver.Core.Servers.Server.ServerChannel.ExecuteProtocol[TResult](IWireProtocol`1 protocol, CancellationToken cancellationToken)
 at MongoDB.Driver.Core.Servers.Server.ServerChannel.Command[TResult](ICoreSession session, ReadPreference readPreference, DatabaseNamespace databaseNamespace, BsonDocument command, IEnumerable`1 commandPayloads, IElementNameValidator commandValidator, BsonDocument additionalOptions, Action`1 postWriteAction, CommandResponseHandling responseHandling, IBsonSerializer`1 resultSerializer, MessageEncoderSettings messageEncoderSettings, CancellationToken cancellationToken)
 at MongoDB.Driver.Core.Operations.CommandOperationBase`1.ExecuteProtocol(IChannelHandle channel, ICoreSessionHandle session, ReadPreference readPreference, CancellationToken cancellationToken)
 at MongoDB.Driver.Core.Operations.CommandOperationBase`1.ExecuteProtocol(IChannelSource channelSource, ICoreSessionHandle session, ReadPreference readPreference, CancellationToken cancellationToken)
 at MongoDB.Driver.Core.Operations.ReadCommandOperation`1.Execute(IReadBinding binding, CancellationToken cancellationToken)
 at MongoDB.Driver.OperationExecutor.ExecuteReadOperation[TResult](IReadBinding binding, IReadOperation`1 operation, CancellationToken cancellationToken)
 at MongoDB.Driver.MongoDatabaseImpl.ExecuteReadOperation[T](IClientSessionHandle session, IReadOperation`1 operation, ReadPreference readPreference, CancellationToken cancellationToken)
 at MongoDB.Driver.MongoDatabaseImpl.RunCommand[TResult](IClientSessionHandle session, Command`1 command, ReadPreference readPreference, CancellationToken cancellationToken)
 at MongoDB.Driver.MongoDatabaseImpl.<>c__DisplayClass37_0`1.<RunCommand>b__0(IClientSessionHandle session)
 at MongoDB.Driver.MongoDatabaseImpl.UsingImplicitSession[TResult](Func`2 func, CancellationToken cancellationToken)
 at MongoDB.Driver.MongoDatabaseImpl.RunCommand[TResult](Command`1 command, ReadPreference readPreference, CancellationToken cancellationToken)
 at Hangfire.Mongo.MongoUtils.MongoExtensions.GetServerTimeUtc(IMongoDatabase database)
 at Hangfire.Mongo.MongoConnection.AnnounceServer(String serverId, ServerContext context)
 at Hangfire.Server.BackgroundProcessingServer.Hangfire.Server.IBackgroundProcess.Execute(BackgroundProcessContext context)
 at Hangfire.Server.AutomaticRetryProcess.Execute(BackgroundProcessContext context)

This is a major issue for us as it prevents our users from using our application against a replica set.

There is a PR already (https://github.com/mongodb/mongo-csharp-driver/pull/312) that contains a tiny fix which could potentially fix the whole problem easily.



 Comments   
Comment by Daniel Hegener [ 18/Jul/19 ]

Oh no, haha, they did an unfortunate merge on the HangFire.Mongo side which reverted that previously mentioned workaround:

otherwise the workaround would have been in our version of the library... sigh

But there's hope nonetheless because

a) they merged the fix again later:

and b) they went for a completely different approach in a later version:

Bottom line for me: I'll try out various versions of HangFire.Mongo now and see if one of them works for us without releasing a patch version of our entire solution.

Nonetheless, I would suggest and appreciate some investigations on your driver's side, too.

Comment by Jeffrey Yemin [ 18/Jul/19 ]

I wonder why they used `dynamic` instead of BsonDocument for the generic type?

Comment by Jeffrey Yemin [ 18/Jul/19 ]

It looks like an isMaster command, which is returning this on a modern replica set:

{
	"hosts" : [
		"localhost:27017",
		"localhost:27018"
	],
	"arbiters" : [
		"localhost:27019"
	],
	"setName" : "repl0",
	"setVersion" : 1,
	"ismaster" : true,
	"secondary" : false,
	"primary" : "localhost:27017",
	"tags" : {
		"dc" : "ny",
		"ordinal" : "one"
	},
	"me" : "localhost:27017",
	"electionId" : ObjectId("7fffffff0000000000000001"),
	"lastWrite" : {
		"opTime" : {
			"ts" : Timestamp(1563485885, 1),
			"t" : NumberLong(1)
		},
		"lastWriteDate" : ISODate("2019-07-18T21:38:05Z"),
		"majorityOpTime" : {
			"ts" : Timestamp(1563485885, 1),
			"t" : NumberLong(1)
		},
		"majorityWriteDate" : ISODate("2019-07-18T21:38:05Z")
	},
	"maxBsonObjectSize" : 16777216,
	"maxMessageSizeBytes" : 48000000,
	"maxWriteBatchSize" : 100000,
	"localTime" : ISODate("2019-07-18T21:38:20.656Z"),
	"logicalSessionTimeoutMinutes" : 30,
	"connectionId" : 36,
	"minWireVersion" : 0,
	"maxWireVersion" : 8,
	"readOnly" : false,
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1563485885, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1563485885, 1)

There are definitely Timestamp values in there that would trip it up if it doesn't know how to deserialize those.

Comment by Daniel Hegener [ 18/Jul/19 ]

The offending code looks like this

dynamic serverStatus = AsyncHelper.RunSync(() => database.RunCommandAsync<dynamic>(new BsonDocument("isMaster", 1)));
object localTime;
if (((IDictionary<string, object>)serverStatus).TryGetValue("localTime", out localTime))
{ return ((DateTime)localTime).ToUniversalTime(); }

which would make the problem a bit like https://jira.mongodb.org/browse/CSHARP-2271.

Comment by Daniel Hegener [ 18/Jul/19 ]

It seems as though my idea might work assuming the API stayed about the same so we can swap it out. Somebody worked around that problem on the HangFire side a while ago:

Comment by Daniel Hegener [ 18/Jul/19 ]

It's actually not us issuing this command. It's the HangFire MongoDB driver (https://github.com/sergeyzwezdin/Hangfire.Mongo) that does it for us. Judging by the stack trace, it would appear like it's something about the MongoDB server time. Mind you, we're using a rather old version 0.2.8 which we will attempt to update through an assembly binding redirect if possible and hope for the issue to disappear.

Comment by Jeffrey Yemin [ 18/Jul/19 ]

Hi dnickless,

Just so we have some context, can you let us know what command you are running?

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