private void PruneCacheByMaxResultsPerIndexer(TrackerCache trackerCache) { // Remove queries exceeding max results per indexer var resultsPerQuery = trackerCache.Queries .OrderByDescending(q => q.Value.Created) // newest first .Select(q => new Tuple <string, int>(q.Key, q.Value.Results.Count)).ToList(); var prunedCounter = 0; while (true) { var total = resultsPerQuery.Select(q => q.Item2).Sum(); if (total <= _serverConfig.CacheMaxResultsPerIndexer) { break; } trackerCache.Queries.Remove(resultsPerQuery.Pop().Item1); // remove the older prunedCounter++; } if (_logger.IsDebugEnabled) { _logger.Debug($"CACHE PruneCacheByMaxResultsPerIndexer / Indexer: {trackerCache.TrackerId} / Pruned queries: {prunedCounter}"); PrintCacheStatus(); } }
public void CacheRssResults(IIndexer indexer, IEnumerable <ReleaseInfo> releases) { lock (cache) { var trackerCache = cache.Where(c => c.TrackerId == indexer.ID).FirstOrDefault(); if (trackerCache == null) { trackerCache = new TrackerCache(); trackerCache.TrackerId = indexer.ID; trackerCache.TrackerName = indexer.DisplayName; cache.Add(trackerCache); } foreach (var release in releases.OrderByDescending(i => i.PublishDate)) { var existingItem = trackerCache.Results.Where(i => i.Result.Guid == release.Guid).FirstOrDefault(); if (existingItem == null) { existingItem = new CachedResult(); existingItem.Created = DateTime.Now; trackerCache.Results.Add(existingItem); } existingItem.Result = release; } // Prune cache foreach (var tracker in cache) { tracker.Results = tracker.Results.OrderByDescending(i => i.Created).Take(MAX_RESULTS_PER_TRACKER).ToList(); } } }
public void GetRecursive() { var x = new object(); var y = new object(); var settings = PropertiesSettings.GetOrCreate(); var rec = TrackerCache.GetOrAdd(x, y, settings, p => new Recursive(p, settings)); Assert.AreSame(rec, rec.Value.Next); }
public void GetOrAddUsingReferencePair() { var x = new object(); var y = new object(); var pair = ReferencePair.GetOrCreate(x, y); Assert.AreEqual(pair.Count, 1); var settings = PropertiesSettings.GetOrCreate(ReferenceHandling.Structural); using (var created = TrackerCache.GetOrAdd(x, y, settings, p => p)) { Assert.AreSame(pair, created.Value); Assert.AreEqual(pair.Count, 2); } Assert.AreEqual(1, pair.Count); pair.Dispose(); Assert.AreEqual(0, pair.Count); }
public Recursive(IRefCounted <ReferencePair> pair, MemberSettings settings) { this.Next = TrackerCache.GetOrAdd(pair.Value.X, pair.Value.Y, settings, x => new Recursive(x, settings)); }