private List <IndexWorkflowRecord> RemoveFromQueueUntilPunctuation(IndexWorkflowRecordNode from) { List <IndexWorkflowRecord> workflowRecords = new List <IndexWorkflowRecord>(); if (from != null && !from.IsPunctuation()) { workflowRecords.Add(from.WorkflowRecord); } IndexWorkflowRecordNode tmp = from.Next; while (tmp != null && !tmp.IsPunctuation()) { workflowRecords.Add(tmp.WorkflowRecord); tmp = tmp.Next; tmp.Prev.Clean(); } if (tmp == null) { from.Remove(ref State.State.WorkflowRecordsHead, ref _workflowRecordsTail); } else { from.Next = tmp; tmp.Prev = from; from.Remove(ref State.State.WorkflowRecordsHead, ref _workflowRecordsTail); tmp.Remove(ref State.State.WorkflowRecordsHead, ref _workflowRecordsTail); } return(workflowRecords); }
private async Task <Dictionary <IIndexableGrain, HashSet <Guid> > > GetActiveWorkflowsListsFromGrains(IndexWorkflowRecordNode currentWorkflow) { var result = new Dictionary <IIndexableGrain, HashSet <Guid> >(); var grains = new List <IIndexableGrain>(); var activeWorkflowsSetsTasks = new List <Task <Immutable <HashSet <Guid> > > >(); while (!currentWorkflow.IsPunctuation()) { IIndexableGrain g = currentWorkflow.WorkflowRecord.Grain; foreach (var updates in currentWorkflow.WorkflowRecord.MemberUpdates) { IMemberUpdate updt = updates.Value; if (updt.GetOperationType() != IndexOperationType.None && !result.ContainsKey(g)) { result.Add(g, EMPTY_HASHSET); grains.Add(g); activeWorkflowsSetsTasks.Add(g.AsReference <IIndexableGrain>(InsideRuntimeClient.Current.ConcreteGrainFactory, _iGrainType).GetActiveWorkflowIdsList()); } } currentWorkflow = currentWorkflow.Next; } if (activeWorkflowsSetsTasks.Count() > 0) { Immutable <HashSet <Guid> >[] activeWorkflowsSets = await Task.WhenAll(activeWorkflowsSetsTasks); for (int i = 0; i < activeWorkflowsSets.Length; ++i) { result[grains[i]] = activeWorkflowsSets[i].Value; } } return(result); }
private void PopulateUpdatesToIndexes(IndexWorkflowRecordNode currentWorkflow, Dictionary <string, IDictionary <IIndexableGrain, IList <IMemberUpdate> > > updatesToIndexes, Dictionary <IIndexableGrain, HashSet <Guid> > grainsToActiveWorkflows) { bool faultTolerant = IsFaultTolerant; while (!currentWorkflow.IsPunctuation()) { IndexWorkflowRecord workflowRec = currentWorkflow.WorkflowRecord; IIndexableGrain g = workflowRec.Grain; bool existsInActiveWorkflows = false; if (faultTolerant) { HashSet <Guid> activeWorkflowRecs = null; if (grainsToActiveWorkflows.TryGetValue(g, out activeWorkflowRecs)) { if (activeWorkflowRecs.Contains(workflowRec.WorkflowId)) { existsInActiveWorkflows = true; } } } foreach (var updates in currentWorkflow.WorkflowRecord.MemberUpdates) { IMemberUpdate updt = updates.Value; if (updt.GetOperationType() != IndexOperationType.None) { string index = updates.Key; var updatesToIndex = updatesToIndexes[index]; IList <IMemberUpdate> updatesList; if (!updatesToIndex.TryGetValue(g, out updatesList)) { updatesList = new List <IMemberUpdate>(); updatesToIndex.Add(g, updatesList); } if (!faultTolerant || existsInActiveWorkflows) { updatesList.Add(updt); } //if the workflow record does not exist in the list of active work-flows //and the index is fault-tolerant, we should make sure that tentative updates //to unique indexes are undone else if (((IndexMetaData)Indexes[index].Item2).IsUniqueIndex()) { //reverse a possible remaining tentative record from the index updatesList.Add(new MemberUpdateReverseTentative(updt)); } } } currentWorkflow = currentWorkflow.Next; } }
public override string ToString() { int count = 0; var res = new StringBuilder(); IndexWorkflowRecordNode curr = this; do { ++count; res.Append(curr.IsPunctuation() ? "::Punc::" : curr.WorkflowRecord.ToString()).Append(",\n"); curr = curr.Next; } while (curr != null); res.Append("Number of elements: ").Append(count); return(res.ToString()); }
private async Task <Dictionary <IIndexableGrain, HashSet <Guid> > > GetActiveWorkflowsListsFromGrains(IndexWorkflowRecordNode currentWorkflow) { var result = new Dictionary <IIndexableGrain, HashSet <Guid> >(); var grains = new List <IIndexableGrain>(); var activeWorkflowsSetsTasks = new List <Task <Immutable <HashSet <Guid> > > >(); var workflowIds = new HashSet <Guid>(); while (!currentWorkflow.IsPunctuation()) { workflowIds.Add(currentWorkflow.WorkflowRecord.WorkflowId); IIndexableGrain g = currentWorkflow.WorkflowRecord.Grain; foreach (var updates in currentWorkflow.WorkflowRecord.MemberUpdates) { IMemberUpdate updt = updates.Value; if (updt.OperationType != IndexOperationType.None && !result.ContainsKey(g)) { result.Add(g, emptyHashset); grains.Add(g); activeWorkflowsSetsTasks.Add(g.AsReference <IIndexableGrain>(_siloIndexManager, _iGrainType).GetActiveWorkflowIdsList()); } } currentWorkflow = currentWorkflow.Next; } if (activeWorkflowsSetsTasks.Count() > 0) { Immutable <HashSet <Guid> >[] activeWorkflowsSets = await Task.WhenAll(activeWorkflowsSetsTasks); for (int i = 0; i < activeWorkflowsSets.Length; ++i) { // Do not include workflowIds that are not in our work queue. result[grains[i]] = new HashSet <Guid>(activeWorkflowsSets[i].Value.Intersect(workflowIds)); } } return(result); }