protected virtual async ValueTask OnArchiveCompleted() { //开始执行事件清理逻辑 var noCleareds = BriefArchiveList.Where(a => !a.EventIsCleared).ToList(); if (noCleareds.Count >= ArchiveOptions.EventClearIntervalArchive) { var minArchive = noCleareds.FirstOrDefault(); if (minArchive != default) { //判断需要清理的event是否都被follow执行过 var versions = await Task.WhenAll(FollowUnit.GetAndSaveVersionFuncs().Select(func => func(Snapshot.Base.StateId, Snapshot.Base.Version))); if (versions.All(v => v >= minArchive.EndVersion)) { //清理归档对应的事件 await ArchiveStorage.EventIsClear(Snapshot.Base.StateId, minArchive.Id); minArchive.EventIsCleared = true; //如果快照的版本小于需要清理的最大事件版本号,则保存快照 if (SnapshotEventVersion < minArchive.EndVersion) { var saveTask = SaveSnapshotAsync(true); if (!saveTask.IsCompletedSuccessfully) { await saveTask; } } await EventStorage.Delete(Snapshot.Base.StateId, minArchive.EndVersion, Snapshot.Base.StartTimestamp); ClearedArchive = minArchive; //只保留一个清理过事件的快照,其它的删除掉 var cleareds = BriefArchiveList.Where(a => a.EventIsCleared).OrderBy(a => a.Index).ToArray(); if (cleareds.Length > 1) { for (int i = 0; i < cleareds.Length - 1; i++) { await DeleteArchive(cleareds[i].Id); BriefArchiveList.Remove(cleareds[i]); } } } } } }
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); } }