コード例 #1
0
        public async Task EnforceMaxCapacity()
        {
            var memeSizePairs = await _databaseContext.Memes.OrderBy(m => m.Created)
                                .Select(m => new { Id = m.Id, ThreadId = m.ThreadId, Size = m.FileSize }).ToListAsync();

            var sum      = memeSizePairs.Sum(m => (long)m.Size);
            var toDelete = new List <long>();

            foreach (var memeSizePair in memeSizePairs)
            {
                if (sum < _maxCapacityBytes)
                {
                    break;
                }
                try
                {
                    await _fileStorageService.Delete($"meme{memeSizePair.Id}.webm");

                    await _fileStorageService.Delete($"meme{memeSizePair.Id}.jpeg");

                    sum -= memeSizePair.Size;
                    toDelete.Add(memeSizePair.Id);
                }
                catch (Exception)
                {
                    _logger.LogError("Could not delete meme {MemeId}", memeSizePair.Id);
                    toDelete.Remove(memeSizePair.Id);
                }
            }

            var memesToDelete = await _databaseContext.Memes.Where(m => toDelete.Contains(m.Id)).ToListAsync();

            _databaseContext.RemoveRange(memesToDelete);
            await _databaseContext.SaveChangesAsync();

            _logger.LogInformation("Deleted {DeletedMemes} memes", memesToDelete.Count);
        }