Skip to content

Commit 0210e21

Browse files
authored
Fix GSet elements needs to be sorted (#5093)
1 parent 456d795 commit 0210e21

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

src/contrib/cluster/Akka.DistributedData/Serialization/OtherMessageComparer.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ namespace Akka.DistributedData.Serialization
77
{
88
internal class OtherMessageComparer : IComparer<OtherMessage>
99
{
10+
public static OtherMessageComparer Instance { get; } = new OtherMessageComparer();
11+
12+
private OtherMessageComparer()
13+
{}
14+
1015
public int Compare(OtherMessage a, OtherMessage b)
1116
{
1217
if (a == null || b == null)

src/contrib/cluster/Akka.DistributedData/Serialization/ReplicatedDataSerializer.cs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,6 @@ private static ORSet<T> ToGenericORSet<T>(ImmutableDictionary<object, VersionVec
385385
private static readonly MethodInfo ORSetUnknownMaker =
386386
typeof(ReplicatedDataSerializer).GetMethod(nameof(ORSetUnknownToProto), BindingFlags.Instance | BindingFlags.NonPublic);
387387

388-
private static readonly OtherMessageComparer OtherMessageComparer = new OtherMessageComparer();
389-
390388
/// <summary>
391389
/// Called when we're serializing none of the standard object types with ORSet
392390
/// </summary>
@@ -405,7 +403,7 @@ private Proto.Msg.ORSet ORSetUnknownToProto<T>(IORSet o, Proto.Msg.ORSet b)
405403
otherElements.Add(otherElement);
406404
otherElementsDict[otherElement] = SerializationSupport.VersionVectorToProto(kvp.Value);
407405
}
408-
otherElements.Sort(OtherMessageComparer);
406+
otherElements.Sort(OtherMessageComparer.Instance);
409407

410408
foreach (var val in otherElements)
411409
{
@@ -531,9 +529,14 @@ private Proto.Msg.GSet GSetToProto<T>(GSet<T> gset)
531529
private Proto.Msg.GSet GSetToProtoUnknown<T>(IGSet g)
532530
{
533531
var gset = (GSet<T>)g;
534-
var p = new Proto.Msg.GSet();
535-
p.TypeInfo = GetTypeDescriptor(typeof(T));
536-
p.OtherElements.Add(gset.Select(x => _ser.OtherMessageToProto(x)));
532+
var otherElements = new List<OtherMessage>(gset.Select(x => _ser.OtherMessageToProto(x)));
533+
otherElements.Sort(OtherMessageComparer.Instance);
534+
535+
var p = new Proto.Msg.GSet
536+
{
537+
TypeInfo = GetTypeDescriptor(typeof(T))
538+
};
539+
p.OtherElements.Add(otherElements);
537540
return p;
538541
}
539542

@@ -547,25 +550,33 @@ private Proto.Msg.GSet ToProto(IGSet gset)
547550
case GSet<int> ints:
548551
{
549552
var p = GSetToProto(ints);
550-
p.IntElements.Add(ints.Elements);
553+
var intElements = new List<int>(ints.Elements);
554+
intElements.Sort();
555+
p.IntElements.Add(intElements);
551556
return p;
552557
}
553558
case GSet<long> longs:
554559
{
555560
var p = GSetToProto(longs);
556-
p.LongElements.Add(longs.Elements);
561+
var longElements = new List<long>(longs.Elements);
562+
longElements.Sort();
563+
p.LongElements.Add(longElements);
557564
return p;
558565
}
559566
case GSet<string> strings:
560567
{
561568
var p = GSetToProto(strings);
562-
p.StringElements.Add(strings.Elements);
569+
var stringElements = new List<string>(strings.Elements);
570+
stringElements.Sort();
571+
p.StringElements.Add(stringElements);
563572
return p;
564573
}
565574
case GSet<IActorRef> refs:
566575
{
567576
var p = GSetToProto(refs);
568-
p.ActorRefElements.Add(refs.Select(Akka.Serialization.Serialization.SerializedActorPath));
577+
var refElements = new List<IActorRef>(refs.Elements);
578+
refElements.Sort();
579+
p.ActorRefElements.Add(refElements.Select(Akka.Serialization.Serialization.SerializedActorPath));
569580
return p;
570581
}
571582
default: // unknown type

0 commit comments

Comments
 (0)