internal static Member NewUpMember(string host, int port = 252525, AppVersion version = null) { return(Member.Create( new UniqueAddress(new Address("akka", "myapp", host, port), 1), ImmutableHashSet <string> .Empty, version ?? AppVersion.Create("1.0.0")).Copy(MemberStatus.Up)); }
private static InternalClusterAction.Join JoinFrom(byte[] bytes) { var join = Proto.Msg.Join.Parser.ParseFrom(bytes); AppVersion ver = join.HasAppVersion ? AppVersion.Create(join.AppVersion) : AppVersion.Zero; return(new InternalClusterAction.Join(UniqueAddressFrom(join.Node), join.Roles.ToImmutableHashSet(), ver)); }
private void OnVersionFileDownloadSuccess(byte[] pBytes) { string json = Encoding.UTF8.GetString(pBytes); VersionJson versionJson = JsonUtility.FromJson <VersionJson>(json); Debug.Log(json); AppVersion newVersion = AppVersion.Create(versionJson.version); #if UNITY_ANDROID AppConst.s_AppUrl = versionJson.aOSAppUrl; AppConst.s_AppUrl = versionJson.aOSResUrl; #else AppConst.s_AppUrl = versionJson.iOSAppUrl; AppConst.s_ResUrl = versionJson.iOSResUrl; #endif if (AppVersion.Bigger(newVersion, AppConst.s_AppVersion)) { //需要版更 Target.ShowAlert(2, OnAppUpdate); } else if (newVersion.d > AppConst.s_AppVersion.d) { //需要热更 Target.ShowAlert(3, OnResUpdate); } else { Target.GetFSM().ChangeState(MainState_LoadDll.Instance); } }
private void OnMainFileDownloadSuccess(byte[] pBytes) { string json = Encoding.UTF8.GetString(pBytes); Debug.Log(json); MainJson mainJson = JsonUtility.FromJson <MainJson>(json); Application.targetFrameRate = AppConst.s_FrameRate = mainJson.frameRate; AppConst.s_IsDebug = mainJson.isDebug; AppConst.s_Host = mainJson.host; AppConst.s_AppVersion = AppVersion.Create(mainJson.version); //资源版本取PlayerPrefs存的 if (PlayerPrefs.HasKey("ResVersion")) { AppConst.s_AppVersion.d = PlayerPrefs.GetInt("ResVersion"); } foreach (MainTextJson mainTextJson in mainJson.texts) { GameMain.Instance.m_Texts[mainTextJson.id] = mainTextJson.text; } //下载远程Version配置 string path = AppConst.GetRemoteURL("Version.json"); DownloadManager.Instance.DownloadFileAsync(path, OnVersionFileDownloadSuccess, pProgressCallback: OnVersionFileDowloadProgress); }
public void Version_should_compare_2_digit_version() { AppVersion.Create("1.2").Should().Be(AppVersion.Create("1.2")); AppVersion.Create("1.2").Should().Be(AppVersion.Create("1.2.0")); AppVersion.Create("1.2").Should().NotBe(AppVersion.Create("1.3")); AppVersion.Create("1.2.1").Should().BeGreaterThan(AppVersion.Create("1.2")); AppVersion.Create("2.4").Should().BeGreaterThan(AppVersion.Create("2.3")); AppVersion.Create("3.2").Should().BeLessThan(AppVersion.Create("3.2.7")); }
public void Version_should_compare_extra_without_digits() { AppVersion.Create("foo").Should().Be(AppVersion.Create("foo")); AppVersion.Create("foo").Should().NotBe(AppVersion.Create("bar")); AppVersion.Create("foo").Should().BeLessThan(AppVersion.Create("1.2.3")); AppVersion.Create("foo").Should().BeGreaterThan(AppVersion.Create("bar")); AppVersion.Create("1-foo").Should().NotBe(AppVersion.Create("01-foo")); AppVersion.Create("1-foo").Should().BeGreaterThan(AppVersion.Create("02-foo")); }
public void Version_should_compare_extra() { AppVersion.Create("1.2.3-M1").Should().Be(AppVersion.Create("1.2.3-M1")); AppVersion.Create("1.2-M1").Should().Be(AppVersion.Create("1.2-M1")); AppVersion.Create("1.2.0-M1").Should().Be(AppVersion.Create("1.2-M1")); AppVersion.Create("1.2.3-M1").Should().NotBe(AppVersion.Create("1.2.3-M2")); AppVersion.Create("1.2-M1").Should().BeLessThan(AppVersion.Create("1.2.0")); AppVersion.Create("1.2.0-M1").Should().BeLessThan(AppVersion.Create("1.2.0")); AppVersion.Create("1.2.3-M2").Should().BeGreaterThan(AppVersion.Create("1.2.3-M1")); }
public void Version_should_require_digits() { XAssert.Throws <FormatException>(() => AppVersion.Create("1.x.3")); XAssert.Throws <FormatException>(() => AppVersion.Create("1.2x.3")); XAssert.Throws <FormatException>(() => AppVersion.Create("1.2.x")); XAssert.Throws <FormatException>(() => AppVersion.Create("1.2.3x")); XAssert.Throws <FormatException>(() => AppVersion.Create("x.3")); XAssert.Throws <FormatException>(() => AppVersion.Create("1.x")); XAssert.Throws <FormatException>(() => AppVersion.Create("1.2x")); }
public void Version_should_compare_single_digit_version() { AppVersion.Create("1").Should().Be(AppVersion.Create("1")); AppVersion.Create("1").Should().Be(AppVersion.Create("1.0")); AppVersion.Create("1").Should().Be(AppVersion.Create("1.0.0")); AppVersion.Create("1").Should().NotBe(AppVersion.Create("2")); AppVersion.Create("3").Should().BeGreaterThan(AppVersion.Create("2")); AppVersion.Create("2b").Should().BeGreaterThan(AppVersion.Create("2a")); AppVersion.Create("2020-09-07").Should().BeGreaterThan(AppVersion.Create("2020-08-30")); }
public void A_cluster_must_initially_become_singleton_cluster_when_joining_itself_and_reach_convergence() { ClusterView.Members.Count.Should().Be(0); _cluster.Join(_selfAddress); LeaderActions(); // Joining -> Up AwaitCondition(() => ClusterView.IsSingletonCluster); ClusterView.Self.Address.Should().Be(_selfAddress); ClusterView.Members.Select(m => m.Address).ToImmutableHashSet() .Should().BeEquivalentTo(ImmutableHashSet.Create(_selfAddress)); AwaitAssert(() => ClusterView.Status.Should().Be(MemberStatus.Up)); ClusterView.Self.AppVersion.Should().Be(AppVersion.Create("1.2.3")); ClusterView.Members.FirstOrDefault(i => i.Address == _selfAddress).AppVersion.Should().Be(AppVersion.Create("1.2.3")); ClusterView.State.HasMoreThanOneAppVersion.Should().BeFalse(); }
public void LeastShardAllocationStrategy_must_not_rebalance_when_rolling_update_in_progress() { var member1 = NewUpMember("127.0.0.1", version: AppVersion.Create("1.0.0")); var member2 = NewUpMember("127.0.0.1", version: AppVersion.Create("1.0.1")); // multiple versions to simulate rolling update in progress var allocationStrategy = new TestLeastShardAllocationStrategy(rebalanceThreshold: 2, maxSimultaneousRebalance: 100, () => new CurrentClusterState().Copy(members: ImmutableSortedSet.Create(member1, member2)), () => member1); var allocations = CreateAllocations(aCount: 5, bCount: 5); allocationStrategy.Rebalance(allocations, ImmutableHashSet <string> .Empty).Result.Should().BeEmpty(); allocationStrategy.Rebalance(allocations, ImmutableHashSet.Create("001", "002")).Result.Should().BeEmpty(); allocationStrategy.Rebalance(allocations, ImmutableHashSet.Create("001", "002", "051", "052")).Result.Should().BeEmpty(); }
public void Version_should_compare_dynver_format() { // dynver format AppVersion.Create("1.0.10+3-1234abcd").Should().BeLessThan(AppVersion.Create("1.0.11")); AppVersion.Create("1.0.10+3-1234abcd").Should().BeLessThan(AppVersion.Create("1.0.10+10-1234abcd")); AppVersion.Create("1.2+3-1234abcd").Should().BeLessThan(AppVersion.Create("1.2+10-1234abcd")); AppVersion.Create("1.0.0+3-1234abcd+20140707-1030").Should().BeLessThan(AppVersion.Create("1.0.0+3-1234abcd+20140707-1130")); AppVersion.Create("0.0.0+3-2234abcd").Should().BeLessThan(AppVersion.Create("0.0.0+4-1234abcd")); AppVersion.Create("HEAD+20140707-1030").Should().BeLessThan(AppVersion.Create("HEAD+20140707-1130")); AppVersion.Create("1.0.10-3-1234abcd").Should().BeLessThan(AppVersion.Create("1.0.10-10-1234abcd")); AppVersion.Create("1.0.0-3-1234abcd+20140707-1030").Should().BeLessThan(AppVersion.Create("1.0.0-3-1234abcd+20140707-1130")); // not real dynver, but should still work AppVersion.Create("1.0.10+3a-1234abcd").Should().BeLessThan(AppVersion.Create("1.0.10+3b-1234abcd")); }
public void LeastShardAllocationStrategy_must_prefer_least_shards_latest_version_non_downed_leaving_or_exiting_nodes() { // old version, up var oldMember = NewUpMember("127.0.0.1", version: AppVersion.Create("1.0.0")); // leaving, new version var leavingMember = NewUpMember("127.0.0.2", version: AppVersion.Create("1.0.0")).Copy(MemberStatus.Leaving); // new version, up var newVersionMember1 = NewUpMember("127.0.0.3", version: AppVersion.Create("1.0.1")); // new version, up var newVersionMember2 = NewUpMember("127.0.0.4", version: AppVersion.Create("1.0.1")); // new version, up var newVersionMember3 = NewUpMember("127.0.0.5", version: AppVersion.Create("1.0.1")); var fakeLocalRegion = NewFakeRegion("oldapp", oldMember); var fakeRegionA = NewFakeRegion("leaving", leavingMember); var fakeRegionB = NewFakeRegion("fewest", newVersionMember1); var fakeRegionC = NewFakeRegion("oneshard", newVersionMember2); var fakeRegionD = NewFakeRegion("most", newVersionMember3); var shardsAndMembers = ImmutableList.Create( new Internal.AbstractLeastShardAllocationStrategy.RegionEntry(fakeRegionB, newVersionMember1, ImmutableList <string> .Empty), new Internal.AbstractLeastShardAllocationStrategy.RegionEntry(fakeRegionA, leavingMember, ImmutableList <string> .Empty), new Internal.AbstractLeastShardAllocationStrategy.RegionEntry(fakeRegionD, newVersionMember3, ImmutableList.Create("ShardId2", "ShardId3")), new Internal.AbstractLeastShardAllocationStrategy.RegionEntry(fakeLocalRegion, oldMember, ImmutableList <string> .Empty), new Internal.AbstractLeastShardAllocationStrategy.RegionEntry(fakeRegionC, newVersionMember2, ImmutableList.Create("ShardId1")) ); var sortedRegions = shardsAndMembers.Sort(Internal.AbstractLeastShardAllocationStrategy.ShardSuitabilityOrdering.Instance).Select(i => i.Region); // only node b has the new version sortedRegions.Should().Equal( fakeRegionB, // fewest shards, newest version, up fakeRegionC, // newest version, up fakeRegionD, // most shards, up fakeLocalRegion, // old app version fakeRegionA); // leaving }
private static Gossip GossipFrom(Proto.Msg.Gossip gossip) { var addressMapping = gossip.AllAddresses.Select(UniqueAddressFrom).ToList(); var roleMapping = gossip.AllRoles.ToList(); var hashMapping = gossip.AllHashes.ToList(); var appVersionMapping = gossip.AllAppVersions.Select(i => AppVersion.Create(i)).ToList(); Member MemberFromProto(Proto.Msg.Member member) => Member.Create( addressMapping[member.AddressIndex], member.UpNumber, (MemberStatus)member.Status, member.RolesIndexes.Select(x => roleMapping[x]).ToImmutableHashSet(), appVersionMapping.Any() ? appVersionMapping[member.AppVersionIndex] : AppVersion.Zero ); var members = gossip.Members.Select((Func <Proto.Msg.Member, Member>)MemberFromProto).ToImmutableSortedSet(Member.Ordering); var reachability = ReachabilityFromProto(gossip.Overview.ObserverReachability, addressMapping); var seen = gossip.Overview.Seen.Select(x => addressMapping[x]).ToImmutableHashSet(); var overview = new GossipOverview(seen, reachability); return(new Gossip(members, overview, VectorClockFrom(gossip.Version, hashMapping))); }
public void Version_should_not_support_more_than_3_digits_version() { XAssert.Throws <ArgumentOutOfRangeException>(() => AppVersion.Create("1.2.3.1")); }
public void Can_serialize_Join() { var address = new Address("akka.tcp", "system", "some.host.org", 4711); var uniqueAddress = new UniqueAddress(address, 17); var message = new InternalClusterAction.Join(uniqueAddress, ImmutableHashSet.Create("foo", "bar"), AppVersion.Zero); AssertEqual(message); message = new InternalClusterAction.Join(uniqueAddress, ImmutableHashSet.Create("foo", "bar"), AppVersion.Create("1.2.3")); AssertEqual(message); }