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; } }
/// <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; } }
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); } }
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(); } }
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; } }
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() }; } }
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, }; } }
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; } } }
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); } }
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; } }
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; } }
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; } } }
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; }
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; } }
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); } }