Browse Source

Persistence.Cassandra: Improve outdated message ID detection

Olivier Coanet 4 months ago
parent
commit
20855631ef
1 changed files with 11 additions and 2 deletions
  1. 11 2
      src/Abc.Zebus.Persistence.Cassandra/Util/MessageIdExtensions.cs

+ 11 - 2
src/Abc.Zebus.Persistence.Cassandra/Util/MessageIdExtensions.cs

@@ -7,9 +7,18 @@ namespace Abc.Zebus.Persistence.Cassandra.Util
         public static DateTime GetDateTimeForV2OrV3(this MessageId messageId)
         public static DateTime GetDateTimeForV2OrV3(this MessageId messageId)
         {
         {
             var dateTime = messageId.GetDateTime();
             var dateTime = messageId.GetDateTime();
-            var isInvalidDateTime = dateTime.Year > DateTime.UtcNow.Year + 2;
 
 
-            return isInvalidDateTime ? MessageIdV2.GetDateTime(messageId.Value) : dateTime;
+            // Attempt to identify and support broken message IDs from outdated clients.
+            var isInvalidVersion = GetGuidVersion(messageId.Value) != 1;
+            var isInvalidDateTime = dateTime.Year > DateTime.UtcNow.Year + 2 || dateTime.Year < 2000;
+
+            return isInvalidVersion || isInvalidDateTime ? MessageIdV2.GetDateTime(messageId.Value) : dateTime;
+        }
+
+        private static unsafe byte GetGuidVersion(Guid guid)
+        {
+            var bytes = (byte*)&guid;
+            return (byte)((bytes[7] & 0xF0) >> 4);
         }
         }
 
 
         private struct MessageIdV2
         private struct MessageIdV2