protected override void PerformWork(IList <ArraySegment <Message> > items, out int totalCount, out object state) { // The list of cursors represent (streamid, payloadid) var nextCursors = new ulong[_stores.Count]; totalCount = 0; for (var i = 0; i < _stores.Count; ++i) { // Get the mapping for this stream ScaleoutMappingStore store = _stores[i]; // See if we have a cursor for this key Cursor cursor = _cursors[i]; nextCursors[i] = cursor.Id; // Try to find a local mapping for this payload IEnumerator <ScaleoutMapping> enumerator = store.GetEnumerator(cursor.Id); // Stop if we got more than max messages while (totalCount < MaxMessages && enumerator.MoveNext()) { ScaleoutMapping mapping = enumerator.Current; // For each of the event keys we care about, extract all of the messages // from the payload lock (EventKeys) { for (var j = 0; j < EventKeys.Count; ++j) { string eventKey = EventKeys[j]; for (int k = 0; k < mapping.LocalKeyInfo.Count; k++) { LocalEventKeyInfo info = mapping.LocalKeyInfo[k]; if (info.Key.Equals(eventKey, StringComparison.OrdinalIgnoreCase)) { MessageStoreResult <Message> storeResult = info.MessageStore.GetMessages(info.Id, 1); if (storeResult.Messages.Count > 0) { items.Add(storeResult.Messages); totalCount += storeResult.Messages.Count; } } } } } // Update the cursor id nextCursors[i] = mapping.Id; } } state = nextCursors; }
private IEnumerable <Tuple <ScaleoutMapping, int> > GetMappings() { var enumerators = new List <CachedStreamEnumerator>(); var singleStream = _streams.Count == 1; for (var streamIndex = 0; streamIndex < _streams.Count; ++streamIndex) { // Get the mapping for this stream ScaleoutMappingStore store = _streams[streamIndex]; Cursor cursor = _cursors[streamIndex]; // Try to find a local mapping for this payload var enumerator = new CachedStreamEnumerator(store.GetEnumerator(cursor.Id), streamIndex); enumerators.Add(enumerator); } var counter = 0; while (enumerators.Count > 0) { ScaleoutMapping minMapping = null; CachedStreamEnumerator minEnumerator = null; for (int i = enumerators.Count - 1; i >= 0; i--) { counter += 1; CachedStreamEnumerator enumerator = enumerators[i]; ScaleoutMapping mapping; if (enumerator.TryMoveNext(out mapping)) { if (minMapping == null || mapping.ServerCreationTime < minMapping.ServerCreationTime) { minMapping = mapping; minEnumerator = enumerator; } } else { enumerators.RemoveAt(i); } } if (minMapping != null) { minEnumerator.ClearCachedValue(); yield return(Tuple.Create(minMapping, minEnumerator.StreamIndex)); } } _trace.TraceEvent(TraceEventType.Verbose, 0, $"End of mappings (connection ID: {Identity}). Total mappings processed: {counter}"); }
private IEnumerable <Tuple <ScaleoutMapping, int> > GetMappings() { var enumerators = new List <CachedStreamEnumerator>(); for (var streamIndex = 0; streamIndex < _streams.Count; ++streamIndex) { // Get the mapping for this stream ScaleoutMappingStore store = _streams[streamIndex]; Cursor cursor = _cursors[streamIndex]; // Try to find a local mapping for this payload var enumerator = new CachedStreamEnumerator(store.GetEnumerator(cursor.Id), streamIndex); enumerators.Add(enumerator); } while (enumerators.Count > 0) { ScaleoutMapping minMapping = null; CachedStreamEnumerator minEnumerator = null; for (int i = enumerators.Count - 1; i >= 0; i--) { CachedStreamEnumerator enumerator = enumerators[i]; ScaleoutMapping mapping; if (enumerator.TryMoveNext(out mapping)) { if (minMapping == null || mapping.ServerCreationTime < minMapping.ServerCreationTime) { minMapping = mapping; minEnumerator = enumerator; } } else { enumerators.RemoveAt(i); } } if (minMapping != null) { minEnumerator.ClearCachedValue(); yield return(Tuple.Create(minMapping, minEnumerator.StreamIndex)); } } }