Skip to content

Commit b9ce185

Browse files
* Add app-version to the Member information, (Migrated from akka/akka#29546) (#4577)
* will be used in rolling update features * configured with akka.cluster.app-version Co-authored-by: Aaron Stannard <aaron@petabridge.com>
1 parent 22d313b commit b9ce185

23 files changed

+1937
-265
lines changed

build.fsx

+1
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ Target "Protobuf" <| fun _ ->
545545
|> append (sprintf "-I=%s" (__SOURCE_DIRECTORY__ @@ "/src/protobuf/common") )
546546
|> append (sprintf "--csharp_out=internal_access:%s" (__SOURCE_DIRECTORY__ @@ destinationPath))
547547
|> append "--csharp_opt=file_extension=.g.cs"
548+
|> append "--experimental_allow_proto3_optional"
548549
|> append (__SOURCE_DIRECTORY__ @@ "/src/protobuf" @@ protoName)
549550
|> toText
550551

build.ps1

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ $DotNetVersion = "3.1.105";
3535
$DotNetInstallerUri = "https://dot.net/v1/dotnet-install.ps1";
3636
$NugetVersion = "4.3.0";
3737
$NugetUrl = "https://dist.nuget.org/win-x86-commandline/v$NugetVersion/nuget.exe"
38-
$ProtobufVersion = "3.4.0"
38+
$ProtobufVersion = "3.13.0"
3939
$DocfxVersion = "2.48.1"
4040

4141
$IncrementalistVersion = "0.2.2";

src/core/Akka.API.Tests/CoreAPISpec.ApproveCluster.approved.txt

+3
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ namespace Akka.Cluster
7373
public CurrentClusterState() { }
7474
public CurrentClusterState(System.Collections.Immutable.ImmutableSortedSet<Akka.Cluster.Member> members, System.Collections.Immutable.ImmutableHashSet<Akka.Cluster.Member> unreachable, System.Collections.Immutable.ImmutableHashSet<Akka.Actor.Address> seenBy, Akka.Actor.Address leader, System.Collections.Immutable.ImmutableDictionary<string, Akka.Actor.Address> roleLeaderMap) { }
7575
public System.Collections.Immutable.ImmutableHashSet<string> AllRoles { get; }
76+
public bool HasMoreThanOneAppVersion { get; }
7677
public Akka.Actor.Address Leader { get; }
7778
public System.Collections.Immutable.ImmutableSortedSet<Akka.Cluster.Member> Members { get; }
7879
public System.Collections.Immutable.ImmutableHashSet<Akka.Actor.Address> SeenBy { get; }
@@ -184,6 +185,7 @@ namespace Akka.Cluster
184185
{
185186
public ClusterSettings(Akka.Configuration.Config config, string systemName) { }
186187
public bool AllowWeaklyUpMembers { get; }
188+
public Akka.Util.AkkaVersion AppVersion { get; }
187189
public System.Nullable<System.TimeSpan> AutoDownUnreachableAfter { get; }
188190
[System.ObsoleteAttribute("Use Cluster.DowningProvider.DownRemovalMargin [1.1.2]")]
189191
public System.TimeSpan DownRemovalMargin { get; }
@@ -230,6 +232,7 @@ namespace Akka.Cluster
230232
public static readonly System.Collections.Generic.IComparer<Akka.Actor.Address> AddressOrdering;
231233
public static readonly System.Collections.Generic.IComparer<Akka.Cluster.Member> AgeOrdering;
232234
public Akka.Actor.Address Address { get; }
235+
public Akka.Util.AkkaVersion AppVersion { get; }
233236
public System.Collections.Immutable.ImmutableHashSet<string> Roles { get; }
234237
public Akka.Cluster.MemberStatus Status { get; }
235238
public Akka.Cluster.UniqueAddress UniqueAddress { get; }

src/core/Akka.API.Tests/CoreAPISpec.ApproveCore.approved.txt

+13
Original file line numberDiff line numberDiff line change
@@ -4677,6 +4677,19 @@ namespace Akka.Serialization
46774677
}
46784678
namespace Akka.Util
46794679
{
4680+
public class AkkaVersion : System.IComparable<Akka.Util.AkkaVersion>, System.IEquatable<Akka.Util.AkkaVersion>
4681+
{
4682+
public static readonly Akka.Util.AkkaVersion Zero;
4683+
public string Version { get; }
4684+
public int CompareTo(Akka.Util.AkkaVersion other) { }
4685+
public static Akka.Util.AkkaVersion Create(string version) { }
4686+
public bool Equals(Akka.Util.AkkaVersion other) { }
4687+
public override bool Equals(object obj) { }
4688+
public override int GetHashCode() { }
4689+
public override string ToString() { }
4690+
public static bool ==(Akka.Util.AkkaVersion first, Akka.Util.AkkaVersion second) { }
4691+
public static bool !=(Akka.Util.AkkaVersion first, Akka.Util.AkkaVersion second) { }
4692+
}
46804693
public class AtomicBoolean
46814694
{
46824695
public AtomicBoolean(bool initialValue = False) { }

src/core/Akka.Cluster.Tests.Performance/Serialization/ClusterMessageSerializerSpec.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Akka.Cluster.Routing;
1212
using Akka.Cluster.Serialization;
1313
using Akka.Routing;
14+
using Akka.Util;
1415
using Akka.Util.Internal;
1516
using NBench;
1617

@@ -36,8 +37,8 @@ public class ClusterMessageSerializerSpec
3637

3738
internal Lazy<InternalClusterAction.Welcome> WelcomeMessage { get; } = new Lazy<InternalClusterAction.Welcome>(() =>
3839
{
39-
var member1 = new Member(new UniqueAddress(new Address("akka.tcp", "system", "some.host.org", 4718), 34), 1, MemberStatus.Joining, ImmutableHashSet<string>.Empty);
40-
var member2 = new Member(new UniqueAddress(new Address("akka.tcp", "system", "some.host.org", 4710), 35), 1, MemberStatus.Joining, ImmutableHashSet<string>.Empty);
40+
var member1 = new Member(new UniqueAddress(new Address("akka.tcp", "system", "some.host.org", 4718), 34), 1, MemberStatus.Joining, ImmutableHashSet<string>.Empty, AkkaVersion.Zero);
41+
var member2 = new Member(new UniqueAddress(new Address("akka.tcp", "system", "some.host.org", 4710), 35), 1, MemberStatus.Joining, ImmutableHashSet<string>.Empty, AkkaVersion.Zero);
4142

4243
var node1 = new VectorClock.Node("node1");
4344
var node2 = new VectorClock.Node("node2");

src/core/Akka.Cluster.Tests/ClusterConfigSpec.cs

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Akka.Dispatch;
1212
using Akka.Remote;
1313
using Akka.TestKit;
14+
using Akka.Util;
1415
using FluentAssertions;
1516
using Xunit;
1617

@@ -45,6 +46,7 @@ public void Clustering_must_be_able_to_parse_generic_cluster_config_elements()
4546
settings.MinNrOfMembers.Should().Be(1);
4647
settings.MinNrOfMembersOfRole.Should().Equal(ImmutableDictionary<string, int>.Empty);
4748
settings.Roles.Should().BeEquivalentTo(ImmutableHashSet<string>.Empty);
49+
settings.AppVersion.Should().Be(AkkaVersion.Zero);
4850
settings.UseDispatcher.Should().Be(Dispatchers.InternalDispatcherId);
4951
settings.GossipDifferentViewProbability.Should().Be(0.8);
5052
settings.ReduceGossipDifferentViewProbability.Should().Be(400);

src/core/Akka.Cluster.Tests/ClusterSpec.cs

+5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using Xunit;
1818
using FluentAssertions;
1919
using Xunit.Abstractions;
20+
using Akka.Util;
2021

2122
namespace Akka.Cluster.Tests
2223
{
@@ -34,6 +35,7 @@ public class ClusterSpec : AkkaSpec
3435
periodic-tasks-initial-delay = 120 s
3536
publish-stats-interval = 0 s # always, when it happens
3637
run-coordinated-shutdown-when-down = off
38+
app-version = ""1.2.3""
3739
}
3840
akka.actor.serialize-messages = on
3941
akka.actor.provider = ""Akka.Cluster.ClusterActorRefProvider, Akka.Cluster""
@@ -78,6 +80,9 @@ public void A_cluster_must_initially_become_singleton_cluster_when_joining_itsel
7880
ClusterView.Members.Select(m => m.Address).ToImmutableHashSet()
7981
.Should().BeEquivalentTo(ImmutableHashSet.Create(_selfAddress));
8082
AwaitAssert(() => ClusterView.Status.Should().Be(MemberStatus.Up));
83+
ClusterView.Self.AppVersion.Should().Be(AkkaVersion.Create("1.2.3"));
84+
ClusterView.Members.FirstOrDefault(i => i.Address == _selfAddress).AppVersion.Should().Be(AkkaVersion.Create("1.2.3"));
85+
ClusterView.State.HasMoreThanOneAppVersion.Should().BeFalse();
8186
}
8287

8388
[Fact]

src/core/Akka.Cluster.Tests/MemberOrderingSpec.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Collections.Immutable;
1010
using System.Linq;
1111
using Akka.Actor;
12+
using Akka.Util;
1213
using Akka.Util.Internal.Collections;
1314
using FluentAssertions;
1415
using Xunit;
@@ -20,7 +21,7 @@ public class MemberOrderingSpec
2021
[Fact]
2122
public void MemberOrdering_must_order_members_by_host_and_port()
2223
{
23-
var members = new SortedSet<Member>
24+
var members = new SortedSet<Member>
2425
{
2526
TestMember.Create(Address.Parse("akka://sys@darkstar:1112"), MemberStatus.Up),
2627
TestMember.Create(Address.Parse("akka://sys@darkstar:1113"), MemberStatus.Joining),
@@ -55,7 +56,7 @@ public void MemberOrdering_must_have_stable_equals_and_hash_code()
5556
{
5657
var address = new Address("akka.tcp", "sys1", "host1", 9000);
5758
var m1 = TestMember.Create(address, MemberStatus.Joining);
58-
var m11 = Member.Create(new UniqueAddress(address, -3), ImmutableHashSet<string>.Empty);
59+
var m11 = Member.Create(new UniqueAddress(address, -3), ImmutableHashSet<string>.Empty, AkkaVersion.Zero);
5960
var m2 = m1.Copy(status: MemberStatus.Up);
6061
var m22 = m11.Copy(status: MemberStatus.Up);
6162
var m3 = TestMember.Create(address.WithPort(10000), MemberStatus.Up);
@@ -88,7 +89,7 @@ public void MemberOrdering_must_consistent_ordering_and_equals()
8889

8990
//different uid
9091
var a = TestMember.Create(address1, MemberStatus.Joining);
91-
var b = Member.Create(new UniqueAddress(address1, -3), ImmutableHashSet<string>.Empty);
92+
var b = Member.Create(new UniqueAddress(address1, -3), ImmutableHashSet<string>.Empty, AkkaVersion.Zero);
9293
Member.Ordering.Compare(a, b).Should().Be(1);
9394
Member.Ordering.Compare(b, a).Should().Be(-1);
9495
}

src/core/Akka.Cluster.Tests/Serialization/ClusterMessageSerializerSpec.cs

+8-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Akka.TestKit;
1313
using Xunit;
1414
using FluentAssertions;
15+
using Akka.Util;
1516

1617
namespace Akka.Cluster.Tests.Serialization
1718
{
@@ -22,9 +23,9 @@ public ClusterMessageSerializerSpec()
2223
{
2324
}
2425

25-
private static readonly Member a1 = TestMember.Create(new Address("akka.tcp", "sys", "a", 2552), MemberStatus.Joining);
26-
private static readonly Member b1 = TestMember.Create(new Address("akka.tcp", "sys", "b", 2552), MemberStatus.Up, ImmutableHashSet.Create("r1"));
27-
private static readonly Member c1 = TestMember.Create(new Address("akka.tcp", "sys", "c", 2552), MemberStatus.Leaving, ImmutableHashSet.Create("r2"));
26+
private static readonly Member a1 = TestMember.Create(new Address("akka.tcp", "sys", "a", 2552), MemberStatus.Joining, appVersion: AkkaVersion.Create("1.0.0"));
27+
private static readonly Member b1 = TestMember.Create(new Address("akka.tcp", "sys", "b", 2552), MemberStatus.Up, ImmutableHashSet.Create("r1"), appVersion: AkkaVersion.Create("1.1.0"));
28+
private static readonly Member c1 = TestMember.Create(new Address("akka.tcp", "sys", "c", 2552), MemberStatus.Leaving, ImmutableHashSet.Create("r2"), appVersion: AkkaVersion.Create("1.1.0"));
2829
private static readonly Member d1 = TestMember.Create(new Address("akka.tcp", "sys", "d", 2552), MemberStatus.Exiting, ImmutableHashSet.Create("r1", "r2"));
2930
private static readonly Member e1 = TestMember.Create(new Address("akka.tcp", "sys", "e", 2552), MemberStatus.Down, ImmutableHashSet.Create("r3"));
3031

@@ -93,7 +94,10 @@ public void Can_serialize_Join()
9394
{
9495
var address = new Address("akka.tcp", "system", "some.host.org", 4711);
9596
var uniqueAddress = new UniqueAddress(address, 17);
96-
var message = new InternalClusterAction.Join(uniqueAddress, ImmutableHashSet.Create("foo", "bar"));
97+
var message = new InternalClusterAction.Join(uniqueAddress, ImmutableHashSet.Create("foo", "bar"), AkkaVersion.Zero);
98+
AssertEqual(message);
99+
100+
message = new InternalClusterAction.Join(uniqueAddress, ImmutableHashSet.Create("foo", "bar"), AkkaVersion.Create("1.2.3"));
97101
AssertEqual(message);
98102
}
99103

src/core/Akka.Cluster.Tests/SplitBrainStrategySpec.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace Akka.Cluster.Tests
1818
public class SplitBrainStrategySpec
1919
{
2020
private static Member Member(Address address, int upNumber = 1, MemberStatus status = MemberStatus.Up, string role = null) =>
21-
new Member(new UniqueAddress(address, ThreadLocalRandom.Current.Next()), upNumber, status, role == null ? ImmutableHashSet<string>.Empty : ImmutableHashSet.Create(role));
21+
new Member(new UniqueAddress(address, ThreadLocalRandom.Current.Next()), upNumber, status, role == null ? ImmutableHashSet<string>.Empty : ImmutableHashSet.Create(role), AkkaVersion.Zero);
2222

2323
private static ImmutableSortedSet<Member> Members(params Member[] members) => ImmutableSortedSet.CreateRange(Akka.Cluster.Member.AgeOrdering, members);
2424

src/core/Akka.Cluster.Tests/TestMember.cs

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Collections.Immutable;
99
using Akka.Actor;
1010
using Akka.Annotations;
11+
using Akka.Util;
1112

1213
namespace Akka.Cluster.Tests
1314
{
@@ -17,14 +18,14 @@ namespace Akka.Cluster.Tests
1718
[InternalApi]
1819
public static class TestMember
1920
{
20-
public static Member Create(Address address, MemberStatus status, int uid = 0)
21+
public static Member Create(Address address, MemberStatus status, int uid = 0, AkkaVersion appVersion = null)
2122
{
22-
return Create(address, status, ImmutableHashSet.Create<string>(), uid);
23+
return Create(address, status, ImmutableHashSet.Create<string>(), uid, appVersion: appVersion);
2324
}
2425

25-
public static Member Create(Address address, MemberStatus status, ImmutableHashSet<string> roles, int uid = 0, int upNumber = 0)
26+
public static Member Create(Address address, MemberStatus status, ImmutableHashSet<string> roles, int uid = 0, int upNumber = 0, AkkaVersion appVersion = null)
2627
{
27-
return Member.Create(new UniqueAddress(address, uid), upNumber, status, roles);
28+
return Member.Create(new UniqueAddress(address, uid), upNumber, status, roles, appVersion ?? AkkaVersion.Zero);
2829
}
2930
}
3031
}

0 commit comments

Comments
 (0)