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));
 }
Пример #2
0
        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);
    }
Пример #5
0
 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"));
 }
Пример #6
0
 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"));
 }
Пример #7
0
 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"));
 }
Пример #8
0
        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"));
        }
Пример #9
0
        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"));
        }
Пример #10
0
 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();
        }
Пример #12
0
        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
        }
Пример #14
0
        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)));
        }
Пример #15
0
 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);
        }