Skip to content

Commit

Permalink
Merge pull request #1027 from qdraw/feature/202301_thumbnail_improvments
Browse files Browse the repository at this point in the history
Feature/202301 thumbnail improvments
  • Loading branch information
qdraw authored Jan 23, 2023
2 parents 8dfd371 + 4174684 commit baca8a0
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
using System;
using System.Threading.Tasks;

namespace starsky.feature.thumbnail.Interfaces;

public interface IDatabaseThumbnailGenerationService
{
Task StartBackgroundQueue();
Task StartBackgroundQueue(DateTime startTime, TimeSpan timeout);
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public DatabaseThumbnailGenerationService(IQuery query, IWebLogger logger, IWebS
_updateStatusGeneratedThumbnailService = updateStatusGeneratedThumbnailService;
}

public async Task StartBackgroundQueue()
public async Task StartBackgroundQueue(DateTime startTime, TimeSpan timeout)
{
var thumbnailItems = await _thumbnailQuery.UnprocessedGeneratedThumbnails();
var queryItems = await _query.GetObjectsByFileHashAsync(thumbnailItems.Select(p => p.FileHash).ToList());
Expand All @@ -53,15 +53,30 @@ public async Task StartBackgroundQueue()
// When the CPU is to high its gives a Error 500
await _bgTaskQueue.QueueBackgroundWorkItemAsync(async _ =>
{
await WorkThumbnailGeneration(chuckedItems.ToList(), queryItems);
await FilterAndWorkThumbnailGeneration(startTime, timeout,
chuckedItems.ToList(), queryItems);
}, "DatabaseThumbnailGenerationService");
}
}

internal async Task<IEnumerable<ThumbnailItem>> FilterAndWorkThumbnailGeneration(
DateTime startTime, TimeSpan timeout,
List<ThumbnailItem> chuckedItems,
List<FileIndexItem> queryItems)
{
if ( startTime.Add(timeout) < DateTime.UtcNow )
return await WorkThumbnailGeneration(chuckedItems, queryItems);

_logger.LogInformation("Cancel job due timeout");
return new List<ThumbnailItem>();
}

internal async Task<IEnumerable<ThumbnailItem>> WorkThumbnailGeneration(
List<ThumbnailItem> chuckedItems,
List<FileIndexItem> fileIndexItems)
{
var resultData = new List<FileIndexItem>();

foreach ( var item in chuckedItems )
{
var fileIndexItem = fileIndexItems.FirstOrDefault(p => p.FileHash == item.FileHash);
Expand All @@ -81,9 +96,10 @@ internal async Task<IEnumerable<ThumbnailItem>> WorkThumbnailGeneration(
await _updateStatusGeneratedThumbnailService.UpdateStatusAsync(
generationResultModels);
fileIndexItem.SetLastEdited();
resultData.Add(fileIndexItem);
}

var filteredData = fileIndexItems
var filteredData = resultData
.Where(p => p.Status == FileIndexItem.ExifStatus.Ok).ToList();

if ( !filteredData.Any() )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Microsoft.Extensions.Hosting;
using starsky.feature.thumbnail.Interfaces;
using starsky.foundation.injection;
using starsky.foundation.platform.Extensions;
using starsky.foundation.platform.Interfaces;
using starsky.foundation.platform.Models;

Expand Down Expand Up @@ -78,10 +79,10 @@ await timer.WaitForNextTickAsync(cancellationToken))
{
await using var asyncScope = _factory.CreateAsyncScope();
var service = asyncScope.ServiceProvider.GetRequiredService<IDatabaseThumbnailGenerationService>();
await service.StartBackgroundQueue();
await service.StartBackgroundQueue(DateTime.UtcNow, Period);
_executionCount++;
_logger.LogInformation(
$"Executed {nameof(PeriodicThumbnailScanHostedService)} - Count: {_executionCount}");
$"Executed {nameof(PeriodicThumbnailScanHostedService)} - Count: {_executionCount} ({DateTime.UtcNow:hh:mm:ss})");
return true;
}
catch (Exception ex)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using System.Threading.Tasks;
using starsky.feature.thumbnail.Interfaces;

Expand All @@ -7,7 +8,7 @@ public class FakeIDatabaseThumbnailGenerationService : IDatabaseThumbnailGenerat
{
public int Count { get; set; }

public Task StartBackgroundQueue()
public Task StartBackgroundQueue(DateTime startTime, TimeSpan timeout)
{
Count++;
return Task.CompletedTask;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
Expand All @@ -24,8 +25,9 @@ public async Task StartBackgroundQueue_NoContentSoNotFired()
bgTaskQueue,
new UpdateStatusGeneratedThumbnailService(new FakeIThumbnailQuery())
);

await databaseThumbnailGenerationService.StartBackgroundQueue();

await databaseThumbnailGenerationService.StartBackgroundQueue(
DateTime.UtcNow, TimeSpan.FromMinutes(1));

Assert.AreEqual(0,bgTaskQueue.Count());
}
Expand All @@ -47,10 +49,12 @@ public async Task StartBackgroundQueue_OneItemSoTrigger()
new UpdateStatusGeneratedThumbnailService(new FakeIThumbnailQuery())
);

await databaseThumbnailGenerationService.StartBackgroundQueue();
await databaseThumbnailGenerationService.StartBackgroundQueue(
DateTime.UtcNow, TimeSpan.FromMinutes(1));

Assert.AreEqual(1,bgTaskQueue.Count());
}


[TestMethod]
public async Task WorkThumbnailGeneration_ZeroItems()
Expand Down Expand Up @@ -143,4 +147,74 @@ public async Task WorkThumbnailGeneration_MatchItem()
Assert.AreEqual(1,result.Count);
Assert.AreEqual(null,result.FirstOrDefault()!.Large);
}

[TestMethod]
public async Task FilterWorkThumbnailGeneration_MatchItem()
{
var bgTaskQueue = new FakeThumbnailBackgroundTaskQueue();
var thumbnailQuery = new FakeIThumbnailQuery(new List<ThumbnailItem>
{
new ThumbnailItem("12",null,null,null,null)
});

var databaseThumbnailGenerationService = new DatabaseThumbnailGenerationService(
new FakeIQuery(), new FakeIWebLogger(), new FakeIWebSocketConnectionsService(),
new FakeIThumbnailService(),
thumbnailQuery,
bgTaskQueue,
new UpdateStatusGeneratedThumbnailService(new FakeIThumbnailQuery())
);

var result = (await databaseThumbnailGenerationService.FilterAndWorkThumbnailGeneration(
new DateTime(2000,01,01), TimeSpan.FromHours(1),
new List<ThumbnailItem>
{
new ThumbnailItem("23478928939438234",null,null,null,null)
}, new List<FileIndexItem>
{
new FileIndexItem()
{
FileHash = "23478928939438234",
Status = FileIndexItem.ExifStatus.Ok
}
})).ToList();

Assert.AreEqual(1,result.Count);
Assert.AreEqual(null,result.FirstOrDefault()!.Large);
}


[TestMethod]
public async Task FilterWorkThumbnailGeneration_Timeout()
{
var bgTaskQueue = new FakeThumbnailBackgroundTaskQueue();
var thumbnailQuery = new FakeIThumbnailQuery(new List<ThumbnailItem>
{
new ThumbnailItem("12",null,null,null,null)
});

var databaseThumbnailGenerationService = new DatabaseThumbnailGenerationService(
new FakeIQuery(), new FakeIWebLogger(), new FakeIWebSocketConnectionsService(),
new FakeIThumbnailService(),
thumbnailQuery,
bgTaskQueue,
new UpdateStatusGeneratedThumbnailService(new FakeIThumbnailQuery())
);

var result = (await databaseThumbnailGenerationService.FilterAndWorkThumbnailGeneration(
new DateTime(3000,01,01), TimeSpan.FromHours(1),
new List<ThumbnailItem>
{
new ThumbnailItem("2437998234",null,null,null,null)
}, new List<FileIndexItem>
{
new FileIndexItem()
{
FileHash = "2437998234",
Status = FileIndexItem.ExifStatus.Ok
}
})).ToList();

Assert.AreEqual(0,result.Count);
}
}

0 comments on commit baca8a0

Please sign in to comment.