public static void SetNotQueuedToFailures(BubbleGroup group) { var groups = BubbleGroupManager.GetInner(@group).Where(x => !x.PartiallyLoaded && (x.Service.QueuedBubblesParameters != null && x.Service.QueuedBubblesParameters.SendingBubblesToFailOnServiceStart != null && x.Service.QueuedBubblesParameters.SendingBubblesToFailOnServiceStart.Any())); var failed = new List <Tuple <BubbleGroup, VisualBubble> >(); foreach (var innerGroup in groups) { foreach (var bubble in innerGroup) { if (bubble.Direction == Bubble.BubbleDirection.Outgoing && bubble.Status == Bubble.BubbleStatus.Waiting) { if (innerGroup .Service.QueuedBubblesParameters.SendingBubblesToFailOnServiceStart .FirstOrDefault(x => x == bubble.GetType()) != null) { failed.Add(new Tuple <BubbleGroup, VisualBubble>(innerGroup, bubble)); } } } } if (!failed.Any()) { return; } var somethingUpdated = false; var failuresGroupedByBubbleGroup = failed.GroupBy(x => x.Item1); foreach (var failureGroup in failuresGroupedByBubbleGroup) { var groupOfBubbles = failureGroup.First().Item1; var bubbles = failureGroup.Select(x => x.Item2).ToArray(); foreach (var bubble in bubbles) { bubble.Status = Bubble.BubbleStatus.Failed; } BubbleGroupDatabase.UpdateBubble(groupOfBubbles, bubbles, groupOfBubbles.Bubbles.Count + 100); // 100 is really a tolerance here (just in case) foreach (var bubble in bubbles) { BubbleGroupEvents.RaiseBubbleFailed(bubble, groupOfBubbles); } somethingUpdated = true; } if (somethingUpdated) { BubbleGroupEvents.RaiseBubblesUpdated(@group); BubbleGroupEvents.RaiseRefreshed(@group); } }
public Task <List <VisualBubble> > FetchNext() { return(Task.Factory.StartNew <List <VisualBubble> >(() => { if (_endReached) { return null; } lock (BubbleGroupDatabase.OperationLock) { var groups = BubbleGroupManager.GetInner(_group); var groupCursors = groups.Select(@group => new Tuple <BubbleGroup, long>(@group, -1)).ToList(); var allBubbles = new List <VisualBubble>(); var handles = OpenDatabaseStreams(groups).ToList(); GetMoreBubbles: var result = LoadDatabaseBubblesOnUnitInto(groups, _day, handles, groupCursors, _selection.BubbleTypes, _selection.Comparer); var bubbles = result.Item1; if (bubbles != null) { allBubbles.AddRange(bubbles); } groupCursors = result.Item2; _day++; var endReached = result.Item2.Count(cursor => cursor.Item2 == -2); if (endReached == result.Item2.Count) { _endReached = true; goto ReturnResult; } if (bubbles == null) { goto GetMoreBubbles; } if (allBubbles.Count < 100) { goto GetMoreBubbles; } ReturnResult: CloseDatabaseStreams(handles); allBubbles.TimSort((x, y) => - x.Time.CompareTo(y.Time)); return allBubbles; } })); }
internal static void UnloadFullLoad(BubbleGroup group) { var innerGroups = BubbleGroupManager.GetInner(@group); foreach (var innerGroup in innerGroups) { innerGroup.UnloadFullLoad(); } var unifiedGroup = @group as UnifiedBubbleGroup; if (unifiedGroup != null) { unifiedGroup.UnloadFullUnifiedLoad(); } }
public static void SetNotQueuedToFailures(BubbleGroup group) { var nowUnixTimeStamp = Time.GetNowUnixTimestamp(); var groups = BubbleGroupManager.GetInner(@group).Where(x => (x.Service.QueuedBubblesParameters != null && x.Service.QueuedBubblesParameters.BubblesNotToQueue != null && x.Service.QueuedBubblesParameters.BubblesNotToQueue.Any())); if (!groups.Any()) { return; } foreach (var innerGroup in groups) { if (HasNotQueued(innerGroup)) { if (innerGroup.PartiallyLoaded) { BubbleGroupFactory.LoadFullyIfNeeded(innerGroup); } var bubblesSetToFailed = new List <VisualBubble>(); foreach (var bubble in innerGroup.Bubbles) { if (bubble.Direction == Bubble.BubbleDirection.Outgoing && bubble.Status == Bubble.BubbleStatus.Waiting) { if (innerGroup .Service.QueuedBubblesParameters.BubblesNotToQueue .FirstOrDefault(x => x == bubble.GetType()) != null) { var failBubble = innerGroup .Service.QueuedBubblesParameters.SendingBubblesToFailOnServiceStart .FirstOrDefault(x => x == bubble.GetType()) != null; // Older than 10 minutes, fail it regardless. if (!failBubble && bubble.Time < (nowUnixTimeStamp - 600)) { failBubble = true; } if (failBubble) { RemoveNotQueued(bubble); bubble.Status = Bubble.BubbleStatus.Failed; bubblesSetToFailed.Add(bubble); } } } } if (bubblesSetToFailed.Any()) { BubbleGroupDatabase.UpdateBubble(innerGroup, bubblesSetToFailed.ToArray(), 100); foreach (var bubble in bubblesSetToFailed) { BubbleGroupEvents.RaiseBubbleFailed(bubble, innerGroup); } BubbleGroupEvents.RaiseBubblesUpdated(innerGroup); BubbleGroupEvents.RaiseRefreshed(innerGroup); } } } NotQueuedSanityCheckup(); }