Example #1
0
        public override void Reset()
        {
            for (var i = 0; i < Inputs.Length; i++)
            {
                Inputs[i].Tick = -1;
            }

            CurrentInput     = 0;
            LatestInput.Tick = 0;
            for (var i = 0; i < LatestInput.Data.Length; i++)
            {
                LatestInput.Data[i] = 0;
            }

            SnapshotStorage.PurgeAll();
            LastAckedSnapshot = -1;
            LastInputTick     = -1;
            SnapshotRate      = SnapshotRate.Init;
            MapChunk          = 0;
            AuthTries         = 0;
            AccessLevel       = 0;

            if (SendCommandsEnumerator != null)
            {
                SendCommandsEnumerator.Dispose();
                SendCommandsEnumerator = null;
            }
        }
Example #2
0
        /// <summary>
        /// 删除状态
        /// </summary>
        /// <returns></returns>
        protected async ValueTask DeleteSnapshot()
        {
            if (Snapshot.Base.IsOver)
            {
                throw new StateIsOverException(Snapshot.Base.StateId.ToString(), GrainType);
            }
            if (SnapshotEventVersion > 0)
            {
                await SnapshotStorage.Delete(GrainId);

                SnapshotEventVersion = 0;
            }
        }
Example #3
0
        protected async Task Over()
        {
            if (Snapshot.Base.IsOver)
            {
                throw new StateIsOverException(Snapshot.Base.StateId.ToString(), GrainType);
            }
            if (Snapshot.Base.Version != Snapshot.Base.DoingVersion)
            {
                throw new StateInsecurityException(Snapshot.Base.StateId.ToString(), GrainType, Snapshot.Base.DoingVersion, Snapshot.Base.Version);
            }
            if (ArchiveOptions.On && ArchiveOptions.ArchiveEventOnOver)
            {
                var versions = await ObserverUnit.GetAndSaveVersion(Snapshot.Base.StateId, Snapshot.Base.Version);

                if (versions.Any(v => v < Snapshot.Base.Version))
                {
                    throw new ObserverNotCompletedException(GrainType.FullName, Snapshot.Base.StateId.ToString());
                }
            }
            Snapshot.Base.IsOver   = true;
            Snapshot.Base.IsLatest = true;
            if (SnapshotEventVersion != Snapshot.Base.Version)
            {
                var saveTask = SaveSnapshotAsync(true, true);
                if (!saveTask.IsCompletedSuccessfully)
                {
                    await saveTask;
                }
            }
            else
            {
                await SnapshotStorage.Over(Snapshot.Base.StateId, true);
            }
            if (ArchiveOptions.On && ArchiveOptions.ArchiveEventOnOver)
            {
                await ArchiveStorage.DeleteAll(Snapshot.Base.StateId);

                if (ArchiveOptions.EventArchiveType == EventArchiveType.Delete)
                {
                    await EventStorage.DeleteStart(Snapshot.Base.StateId, Snapshot.Base.Version, Snapshot.Base.StartTimestamp);
                }
                else
                {
                    await ArchiveStorage.EventArichive(Snapshot.Base.StateId, Snapshot.Base.Version, Snapshot.Base.StartTimestamp);
                }
            }
            else
            {
                await ArchiveStorage.Over(Snapshot.Base.StateId, true);
            }
        }
Example #4
0
        protected virtual async ValueTask OnRaiseStart(IFullyEvent <PrimaryKey> @event)
        {
            if (Snapshot.Base.Version == 0)
            {
                return;
            }
            if (Snapshot.Base.IsLatest)
            {
                await SnapshotStorage.UpdateIsLatest(Snapshot.Base.StateId, false);

                Snapshot.Base.IsLatest = false;
            }
            if (ClearedArchive != default && @event.Base.Timestamp < ClearedArchive.StartTimestamp)
            {
                throw new EventIsClearedException(@event.GetType().FullName, Serializer.SerializeToString(@event), ClearedArchive.Index);
            }
            if (SnapshotEventVersion > 0)
            {
                if (@event.Base.Timestamp < Snapshot.Base.LatestMinEventTimestamp)
                {
                    await SnapshotStorage.UpdateLatestMinEventTimestamp(Snapshot.Base.StateId, @event.Base.Timestamp);
                }
                if (@event.Base.Timestamp < Snapshot.Base.StartTimestamp)
                {
                    await SnapshotStorage.UpdateStartTimestamp(Snapshot.Base.StateId, @event.Base.Timestamp);
                }
            }
            if (ArchiveOptions.On &&
                LastArchive != default &&
                @event.Base.Timestamp < LastArchive.EndTimestamp)
            {
                foreach (var archive in BriefArchiveList.Where(a => @event.Base.Timestamp < a.EndTimestamp && !a.EventIsCleared).OrderByDescending(v => v.Index))
                {
                    if (@event.Base.Timestamp < archive.EndTimestamp)
                    {
                        await DeleteArchive(archive.Id);

                        if (NewArchive != default)
                        {
                            NewArchive = CombineArchiveInfo(archive, NewArchive);
                        }
                        else
                        {
                            NewArchive = archive;
                        }
                        BriefArchiveList.Remove(archive);
                    }
                }
                LastArchive = BriefArchiveList.LastOrDefault();
            }
        }
Example #5
0
        protected virtual async Task ReadSnapshotAsync()
        {
            if (Logger.IsEnabled(LogLevel.Trace))
            {
                Logger.LogTrace("Start read snapshot  with Id = {0}", GrainId.ToString());
            }
            try
            {
                Snapshot = await SnapshotStorage.Get(GrainId);

                if (Snapshot == default)
                {
                    //从归档中恢复状态
                    if (ArchiveOptions.On && LastArchive != default)
                    {
                        Snapshot = await ArchiveStorage.GetById(LastArchive.Id);
                    }
                }
                if (Snapshot == default)
                {
                    //新建状态
                    var createTask = CreateSnapshot();
                    if (!createTask.IsCompletedSuccessfully)
                    {
                        await createTask;
                    }
                }
                else if (IsTxShadow)
                {
                    Snapshot = new TxSnapshot <PrimaryKey, StateType>()
                    {
                        Base  = new TxSnapshotBase <PrimaryKey>(Snapshot.Base),
                        State = Snapshot.State
                    };
                }
                if (Logger.IsEnabled(LogLevel.Trace))
                {
                    Logger.LogTrace("The snapshot of id = {0} read completed, state version = {1}", GrainId.ToString(), this.Snapshot.Base.Version);
                }
            }
            catch (Exception ex)
            {
                if (Logger.IsEnabled(LogLevel.Critical))
                {
                    Logger.LogCritical(ex, "The snapshot of id = {0} read failed", GrainId.ToString());
                }
                throw;
            }
        }
Example #6
0
        public ServerClient()
        {
            State           = ServerClientState.EMPTY;
            Inputs          = new Input[INPUT_COUNT];
            SnapshotStorage = new SnapshotStorage();

            for (int i = 0; i < Inputs.Length; i++)
            {
                Inputs[i] = new Input()
                {
                    Tick        = -1,
                    PlayerInput = new SnapObj_PlayerInput()
                };
            }
        }
Example #7
0
        public ServerClient()
        {
            State           = ServerClientState.Empty;
            SnapshotStorage = new SnapshotStorage();
            Inputs          = new Input[MaxInputs];
            LatestInput     = new Input();

            for (var i = 0; i < Inputs.Length; i++)
            {
                Inputs[i] = new Input()
                {
                    Tick = -1,
                };
            }
        }
Example #8
0
 protected async ValueTask SaveSnapshotAsync(bool force = false, bool isLatest = false)
 {
     if (Snapshot.Base.Version != Snapshot.Base.DoingVersion)
     {
         throw new StateInsecurityException(Snapshot.Base.StateId.ToString(), GrainType, Snapshot.Base.DoingVersion, Snapshot.Base.Version);
     }
     if (Logger.IsEnabled(LogLevel.Trace))
     {
         Logger.LogTrace(LogEventIds.GrainSnapshot, "Start save snapshot  with Id = {0} ,state version = {1}", GrainId.ToString(), Snapshot.Base.Version);
     }
     //如果版本号差超过设置则更新快照
     if (force || (Snapshot.Base.Version - SnapshotEventVersion >= CoreOptions.SnapshotIntervalVersion))
     {
         var oldLatestMinEventTimestamp = Snapshot.Base.LatestMinEventTimestamp;
         try
         {
             var onSaveSnapshotTask = OnStartSaveSnapshot();
             if (!onSaveSnapshotTask.IsCompletedSuccessfully)
             {
                 await onSaveSnapshotTask;
             }
             Snapshot.Base.LatestMinEventTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
             Snapshot.Base.IsLatest = isLatest;
             if (SnapshotEventVersion == 0)
             {
                 await SnapshotStorage.Insert(Snapshot);
             }
             else
             {
                 await SnapshotStorage.Update(Snapshot);
             }
             SnapshotEventVersion = Snapshot.Base.Version;
             if (Logger.IsEnabled(LogLevel.Trace))
             {
                 Logger.LogTrace(LogEventIds.GrainSnapshot, "The snapshot of id={0} save completed ,state version = {1}", GrainId.ToString(), Snapshot.Base.Version);
             }
         }
         catch (Exception ex)
         {
             Snapshot.Base.LatestMinEventTimestamp = oldLatestMinEventTimestamp;
             if (Logger.IsEnabled(LogLevel.Critical))
             {
                 Logger.LogCritical(LogEventIds.GrainSnapshot, ex, "The snapshot of id= {0} save failed", GrainId.ToString());
             }
             throw;
         }
     }
 }
Example #9
0
        protected async Task Over()
        {
            if (Snapshot.Base.IsOver)
            {
                throw new StateIsOverException(Snapshot.Base.StateId.ToString(), GrainType);
            }
            if (Snapshot.Base.Version != Snapshot.Base.DoingVersion)
            {
                throw new StateInsecurityException(Snapshot.Base.StateId.ToString(), GrainType, Snapshot.Base.DoingVersion, Snapshot.Base.Version);
            }
            if (CoreOptions.ClearEventWhenOver)
            {
                var versions = await Task.WhenAll(FollowUnit.GetAndSaveVersionFuncs().Select(func => func(Snapshot.Base.StateId, Snapshot.Base.Version)));

                if (versions.Any(v => v < Snapshot.Base.Version))
                {
                    throw new FollowNotCompletedException(GrainType.FullName, Snapshot.Base.StateId.ToString());
                }
            }
            Snapshot.Base.IsOver   = true;
            Snapshot.Base.IsLatest = true;
            if (SnapshotEventVersion != Snapshot.Base.Version)
            {
                var saveTask = SaveSnapshotAsync(true, true);
                if (!saveTask.IsCompletedSuccessfully)
                {
                    await saveTask;
                }
            }
            else
            {
                await SnapshotStorage.Over(Snapshot.Base.StateId, true);
            }
            if (CoreOptions.ClearEventWhenOver)
            {
                await ArchiveStorage.DeleteAll(Snapshot.Base.StateId);

                await EventStorage.Delete(Snapshot.Base.StateId, Snapshot.Base.Version, Snapshot.Base.StartTimestamp);
            }
            else
            {
                await ArchiveStorage.Over(Snapshot.Base.StateId, true);
            }
        }
Example #10
0
        protected virtual async Task ReadSnapshotAsync()
        {
            if (Logger.IsEnabled(LogLevel.Trace))
            {
                Logger.LogTrace(LogEventIds.GrainSnapshot, "Start read snapshot  with Id = {0} ,state version = {1}", GrainId.ToString(), Snapshot.Base.Version);
            }
            try
            {
                //从快照中恢复状态
                Snapshot = await SnapshotStorage.Get(GrainId);

                if (Snapshot == default)
                {
                    //从归档中恢复状态
                    if (ArchiveOptions.On && LastArchive != default)
                    {
                        Snapshot = await ArchiveStorage.GetState(LastArchive.Id);
                        await SaveSnapshotAsync(true, false);
                    }
                    if (Snapshot == default)
                    {
                        //新建状态
                        var createTask = CreateState();
                        if (!createTask.IsCompletedSuccessfully)
                        {
                            await createTask;
                        }
                    }
                }
                SnapshotEventVersion = Snapshot.Base.Version;
                if (Logger.IsEnabled(LogLevel.Trace))
                {
                    Logger.LogTrace(LogEventIds.GrainSnapshot, "The snapshot of id = {0} read completed, state version = {1}", GrainId.ToString(), Snapshot.Base.Version);
                }
            }
            catch (Exception ex)
            {
                if (Logger.IsEnabled(LogLevel.Critical))
                {
                    Logger.LogCritical(LogEventIds.GrainSnapshot, ex, "The snapshot of id = {0} read failed", GrainId.ToString());
                }
                throw;
            }
        }
Example #11
0
        protected virtual async Task ReadSnapshotAsync()
        {
            try
            {
                Snapshot = await SnapshotStorage.Get(GrainId);

                if (Snapshot is null)
                {
                    //从归档中恢复状态
                    if (ArchiveOptions.On && LastArchive != null)
                    {
                        Snapshot = await ArchiveStorage.GetById(LastArchive.Id);
                    }
                }
                if (Snapshot is null)
                {
                    //新建状态
                    var createTask = CreateSnapshot();
                    if (!createTask.IsCompletedSuccessfully)
                    {
                        await createTask;
                    }
                }
                else if (IsTxShadow)
                {
                    Snapshot = new TxSnapshot <PrimaryKey, StateType>()
                    {
                        Base  = new TxSnapshotBase <PrimaryKey>(Snapshot.Base),
                        State = Snapshot.State
                    };
                }
                if (Logger.IsEnabled(LogLevel.Trace))
                {
                    Logger.LogTrace("ReadSnapshot completed: {0}->{1}", GrainType.FullName, Serializer.Serialize(Snapshot));
                }
            }
            catch (Exception ex)
            {
                Logger.LogCritical(ex, "ReadSnapshot failed: {0}->{1}", GrainType.FullName, GrainId.ToString());
                throw;
            }
        }
Example #12
0
 protected async ValueTask SaveSnapshotAsync(bool force = false, bool isLatest = false)
 {
     if (Snapshot.Base.Version != Snapshot.Base.DoingVersion)
     {
         throw new StateInsecurityException(Snapshot.Base.StateId.ToString(), GrainType, Snapshot.Base.DoingVersion, Snapshot.Base.Version);
     }
     //如果版本号差超过设置则更新快照
     if ((force && Snapshot.Base.Version > SnapshotEventVersion) ||
         (Snapshot.Base.Version - SnapshotEventVersion >= CoreOptions.SnapshotVersionInterval))
     {
         var oldLatestMinEventTimestamp = Snapshot.Base.LatestMinEventTimestamp;
         try
         {
             var onSaveSnapshotTask = OnStartSaveSnapshot();
             if (!onSaveSnapshotTask.IsCompletedSuccessfully)
             {
                 await onSaveSnapshotTask;
             }
             Snapshot.Base.LatestMinEventTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
             Snapshot.Base.IsLatest = isLatest;
             if (SnapshotEventVersion == 0)
             {
                 await SnapshotStorage.Insert(Snapshot);
             }
             else
             {
                 await SnapshotStorage.Update(Snapshot);
             }
             SnapshotEventVersion = Snapshot.Base.Version;
             if (Logger.IsEnabled(LogLevel.Trace))
             {
                 Logger.LogTrace("SaveSnapshot completed: {0}->{1}", GrainType.FullName, Serializer.Serialize(Snapshot));
             }
         }
         catch (Exception ex)
         {
             Snapshot.Base.LatestMinEventTimestamp = oldLatestMinEventTimestamp;
             Logger.LogCritical(ex, "SaveSnapshot failed: {0}->{1}", GrainType.FullName, GrainId.ToString());
             throw;
         }
     }
 }
Example #13
0
        public override void Reset()
        {
            PlayerName    = string.Empty;
            PlayerClan    = string.Empty;
            PlayerCountry = -1;

            Traffic      = 0;
            TrafficSince = 0;

            for (int i = 0; i < Inputs.Length; i++)
            {
                Inputs[i].Tick = -1;
            }

            CurrentInput = 0;

            SnapshotStorage.PurgeAll();
            LastAckedSnapshot = -1;
            LastInputTick     = -1;
            SnapRate          = SnapRate.INIT;
        }
Example #14
0
        protected virtual async Task ReadSnapshotAsync()
        {
            try
            {
                //从快照中恢复状态
                Snapshot = await SnapshotStorage.Get(GrainId);

                if (Snapshot is null)
                {
                    //从归档中恢复状态
                    if (ArchiveOptions.On && LastArchive != null)
                    {
                        Snapshot = await ArchiveStorage.GetById(LastArchive.Id);
                    }
                    if (Snapshot is null)
                    {
                        //新建状态
                        var createTask = CreateSnapshot();
                        if (!createTask.IsCompletedSuccessfully)
                        {
                            await createTask;
                        }
                    }
                }
                SnapshotEventVersion = Snapshot.Base.Version;
                if (Logger.IsEnabled(LogLevel.Trace))
                {
                    Logger.LogTrace("ReadSnapshot completed: {0}->{1}", GrainType.FullName, Serializer.Serialize(Snapshot));
                }
            }
            catch (Exception ex)
            {
                Logger.LogCritical(ex, "ReadSnapshot failed: {0}->{1}", GrainType.FullName, GrainId.ToString());
                throw;
            }
        }
Example #15
0
        protected async Task Over(OverType overType)
        {
            if (Snapshot.Base.IsOver)
            {
                throw new StateIsOverException(Snapshot.Base.StateId.ToString(), GrainType);
            }
            if (Snapshot.Base.Version != Snapshot.Base.DoingVersion)
            {
                throw new StateInsecurityException(Snapshot.Base.StateId.ToString(), GrainType, Snapshot.Base.DoingVersion, Snapshot.Base.Version);
            }
            if (overType != OverType.None)
            {
                var versions = await ObserverUnit.GetAndSaveVersion(Snapshot.Base.StateId, Snapshot.Base.Version);

                if (versions.Any(v => v < Snapshot.Base.Version))
                {
                    throw new ObserverNotCompletedException(GrainType.FullName, Snapshot.Base.StateId.ToString());
                }
            }
            Snapshot.Base.IsOver   = true;
            Snapshot.Base.IsLatest = true;
            if (SnapshotEventVersion != Snapshot.Base.Version)
            {
                var saveTask = SaveSnapshotAsync(true, true);
                if (!saveTask.IsCompletedSuccessfully)
                {
                    await saveTask;
                }
            }
            else
            {
                await SnapshotStorage.Over(Snapshot.Base.StateId, true);
            }
            if (overType == OverType.ArchivingEvent)
            {
                if (ArchiveOptions.On)
                {
                    await DeleteAllArchive();
                }
                await ArchiveStorage.EventArichive(Snapshot.Base.StateId, Snapshot.Base.Version, Snapshot.Base.StartTimestamp);
            }
            else if (overType == OverType.DeleteEvent)
            {
                if (ArchiveOptions.On)
                {
                    await DeleteAllArchive();
                }
                await EventStorage.DeletePrevious(Snapshot.Base.StateId, Snapshot.Base.Version, Snapshot.Base.StartTimestamp);
            }
            else if (overType == OverType.DeleteAll)
            {
                if (ArchiveOptions.On)
                {
                    await DeleteAllArchive();
                }
                await EventStorage.DeletePrevious(Snapshot.Base.StateId, Snapshot.Base.Version, Snapshot.Base.StartTimestamp);

                if (SnapshotEventVersion > 0)
                {
                    await SnapshotStorage.Delete(GrainId);

                    SnapshotEventVersion = 0;
                }
            }
            else if (ArchiveOptions.On && BriefArchiveList.Count > 0)
            {
                await ArchiveStorage.Over(Snapshot.Base.StateId, true);
            }
        }