@@ -347,8 +347,25 @@ private JournalEntry ToJournalEntry(IPersistentRepresentation message)
347
347
} ;
348
348
}
349
349
350
+ private static long ToTicks ( BsonTimestamp bson )
351
+ {
352
+
353
+
354
+ // BSON Timestamps are stored natively as Unix epoch seconds + an ordinal value
355
+
356
+ // need to use BsonTimestamp.Timestamp because the ordinal value doesn't actually have any
357
+ // bearing on the time - it's used to try to somewhat order the events that all occurred concurrently
358
+ // according to the MongoDb clock. No need to include that data in the EventEnvelope.Timestamp field
359
+ // which is used entirely for end-user purposes.
360
+ //
361
+ // See https://docs.mongodb.com/manual/reference/bson-types/#timestamps
362
+
363
+ return DateTimeOffset . FromUnixTimeSeconds ( bson . Timestamp ) . Ticks ;
364
+ }
365
+
350
366
private Persistent ToPersistenceRepresentation ( JournalEntry entry , IActorRef sender )
351
367
{
368
+
352
369
if ( _settings . LegacySerialization )
353
370
{
354
371
var manifest = string . IsNullOrEmpty ( entry . Manifest ) ? entry . Payload . GetType ( ) . TypeQualifiedName ( ) : entry . Manifest ;
@@ -360,7 +377,7 @@ private Persistent ToPersistenceRepresentation(JournalEntry entry, IActorRef sen
360
377
manifest ,
361
378
entry . IsDeleted ,
362
379
sender ,
363
- timestamp : entry . Ordering . Timestamp ) ;
380
+ timestamp : ToTicks ( entry . Ordering ) ) ; // MongoDb timestamps are stored as Unix Epoch
364
381
}
365
382
366
383
var legacy = entry . SerializerId . HasValue || ! string . IsNullOrEmpty ( entry . Manifest ) ;
@@ -373,7 +390,7 @@ private Persistent ToPersistenceRepresentation(JournalEntry entry, IActorRef sen
373
390
// it the timestamp is not defined in the binary payload
374
391
if ( output . Timestamp == 0L )
375
392
{
376
- output = ( Persistent ) output . WithTimestamp ( entry . Ordering . Timestamp ) ;
393
+ output = ( Persistent ) output . WithTimestamp ( ToTicks ( entry . Ordering ) ) ;
377
394
}
378
395
379
396
return output ;
@@ -402,14 +419,14 @@ private Persistent ToPersistenceRepresentation(JournalEntry entry, IActorRef sen
402
419
}
403
420
404
421
if ( deserialized is Persistent p )
405
- return ( Persistent ) p . WithTimestamp ( entry . Ordering . Timestamp ) ;
422
+ return ( Persistent ) p . WithTimestamp ( ToTicks ( entry . Ordering ) ) ;
406
423
407
- return new Persistent ( deserialized , entry . SequenceNr , entry . PersistenceId , entry . Manifest , entry . IsDeleted , sender , timestamp : entry . Ordering . Timestamp ) ;
424
+ return new Persistent ( deserialized , entry . SequenceNr , entry . PersistenceId , entry . Manifest , entry . IsDeleted , sender , timestamp : ToTicks ( entry . Ordering ) ) ;
408
425
}
409
426
else // backwards compat for object serialization - Payload was already deserialized by BSON
410
427
{
411
428
return new Persistent ( entry . Payload , entry . SequenceNr , entry . PersistenceId , entry . Manifest ,
412
- entry . IsDeleted , sender , timestamp : entry . Ordering . Timestamp ) ;
429
+ entry . IsDeleted , sender , timestamp : ToTicks ( entry . Ordering ) ) ;
413
430
}
414
431
415
432
}
0 commit comments