diff --git a/src/contrib/cluster/Akka.DistributedData/Serialization/OtherMessageComparer.cs b/src/contrib/cluster/Akka.DistributedData/Serialization/OtherMessageComparer.cs index 902c1a78735..c1e52f2e1d7 100644 --- a/src/contrib/cluster/Akka.DistributedData/Serialization/OtherMessageComparer.cs +++ b/src/contrib/cluster/Akka.DistributedData/Serialization/OtherMessageComparer.cs @@ -7,6 +7,11 @@ namespace Akka.DistributedData.Serialization { internal class OtherMessageComparer : IComparer { + public static OtherMessageComparer Instance { get; } = new OtherMessageComparer(); + + private OtherMessageComparer() + {} + public int Compare(OtherMessage a, OtherMessage b) { if (a == null || b == null) diff --git a/src/contrib/cluster/Akka.DistributedData/Serialization/ReplicatedDataSerializer.cs b/src/contrib/cluster/Akka.DistributedData/Serialization/ReplicatedDataSerializer.cs index 7f6d45e660e..42a894d81f2 100644 --- a/src/contrib/cluster/Akka.DistributedData/Serialization/ReplicatedDataSerializer.cs +++ b/src/contrib/cluster/Akka.DistributedData/Serialization/ReplicatedDataSerializer.cs @@ -385,8 +385,6 @@ private static ORSet ToGenericORSet(ImmutableDictionary /// Called when we're serializing none of the standard object types with ORSet /// @@ -405,7 +403,7 @@ private Proto.Msg.ORSet ORSetUnknownToProto(IORSet o, Proto.Msg.ORSet b) otherElements.Add(otherElement); otherElementsDict[otherElement] = SerializationSupport.VersionVectorToProto(kvp.Value); } - otherElements.Sort(OtherMessageComparer); + otherElements.Sort(OtherMessageComparer.Instance); foreach (var val in otherElements) { @@ -531,9 +529,14 @@ private Proto.Msg.GSet GSetToProto(GSet gset) private Proto.Msg.GSet GSetToProtoUnknown(IGSet g) { var gset = (GSet)g; - var p = new Proto.Msg.GSet(); - p.TypeInfo = GetTypeDescriptor(typeof(T)); - p.OtherElements.Add(gset.Select(x => _ser.OtherMessageToProto(x))); + var otherElements = new List(gset.Select(x => _ser.OtherMessageToProto(x))); + otherElements.Sort(OtherMessageComparer.Instance); + + var p = new Proto.Msg.GSet + { + TypeInfo = GetTypeDescriptor(typeof(T)) + }; + p.OtherElements.Add(otherElements); return p; } @@ -547,25 +550,33 @@ private Proto.Msg.GSet ToProto(IGSet gset) case GSet ints: { var p = GSetToProto(ints); - p.IntElements.Add(ints.Elements); + var intElements = new List(ints.Elements); + intElements.Sort(); + p.IntElements.Add(intElements); return p; } case GSet longs: { var p = GSetToProto(longs); - p.LongElements.Add(longs.Elements); + var longElements = new List(longs.Elements); + longElements.Sort(); + p.LongElements.Add(longElements); return p; } case GSet strings: { var p = GSetToProto(strings); - p.StringElements.Add(strings.Elements); + var stringElements = new List(strings.Elements); + stringElements.Sort(); + p.StringElements.Add(stringElements); return p; } case GSet refs: { var p = GSetToProto(refs); - p.ActorRefElements.Add(refs.Select(Akka.Serialization.Serialization.SerializedActorPath)); + var refElements = new List(refs.Elements); + refElements.Sort(); + p.ActorRefElements.Add(refElements.Select(Akka.Serialization.Serialization.SerializedActorPath)); return p; } default: // unknown type