Beispiel #1
0
        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();
            }
        }
Beispiel #2
0
        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));
 }