public static IEnumerable <KeyValuePair <Key, Value> > EnumerateMergedTablesPreCached(RazorCache cache, string baseFileName, IEnumerable <PageRef> tableSpecs, ExceptionHandling exceptionHandling, Action <string> logger) { var tables = tableSpecs.Select(pageRef => new SortedBlockTable(cache, baseFileName, pageRef.Level, pageRef.Version)).ToList(); try { foreach (var pair in MergeEnumerator.Merge(tables.Select(t => t.Enumerate().ToList().AsEnumerable()), t => t.Key)) { yield return(pair); } } finally { tables.ForEach(t => t.Close()); } }
IEnumerable <KeyValuePair <Key, Value> > InternalEnumerateFromKey(byte[] startingKey) { if (startingKey == null) { yield break; } var enumerators = new List <IEnumerable <KeyValuePair <Key, Value> > > (); Key key = new Key(startingKey, 0); var rotatedMemTable = _rotatedJournaledMemTable; // Captures a copy of the rotated table if one exists. enumerators.Add(_currentJournaledMemTable.EnumerateSnapshotFromKey(key)); // Selects the main MemTable. if (rotatedMemTable != null) { enumerators.Add(rotatedMemTable.EnumerateSnapshotFromKey(key)); } // Checks the files on disk. using (var manifestSnapshot = _manifest.GetLatestManifest()) { List <SortedBlockTable> tables = new List <SortedBlockTable> (); try { for (int i = 0; i < manifestSnapshot.NumLevels; i++) { tables.AddRange(manifestSnapshot.GetPagesAtLevel(i).OrderByDescending(page => page.Version).Select(page => new SortedBlockTable(_cache, _manifest.BaseFileName, page.Level, page.Version))); } enumerators.AddRange(tables.Select(t => t.EnumerateFromKey(_cache, key))); foreach (var pair in MergeEnumerator.Merge(enumerators, t => t.Key)) { yield return(pair); } } finally { tables.ForEach(table => table.Close()); // Closes all tables. } } }