diff --git a/backend/Musify.Infrastructure/Jobs/TemporalUploadsCleanupJob.cs b/backend/Musify.Infrastructure/Jobs/TemporalUploadsCleanupJob.cs index ac20eb7..9249073 100644 --- a/backend/Musify.Infrastructure/Jobs/TemporalUploadsCleanupJob.cs +++ b/backend/Musify.Infrastructure/Jobs/TemporalUploadsCleanupJob.cs @@ -19,7 +19,9 @@ namespace Musify.Infrastructure.Jobs uploadIntentConfiguration.TemporalCleanUpJobIntervalSeconds, uploadIntentConfiguration.TemporalRootPrefix); - while (!stoppingToken.IsCancellationRequested) + using var timer = new PeriodicTimer(TimeSpan.FromSeconds(uploadIntentConfiguration.TemporalCleanUpJobIntervalSeconds)); + + do { try { @@ -29,9 +31,8 @@ namespace Musify.Infrastructure.Jobs { logger.LogError(exception, "Error in TemporalUploadsCleanUpJob"); } - - await Task.Delay(TimeSpan.FromSeconds(uploadIntentConfiguration.TemporalCleanUpJobIntervalSeconds), stoppingToken); } + while (await timer.WaitForNextTickAsync(stoppingToken)); } async Task RunAsync(CancellationToken cancellationToken) diff --git a/backend/Musify.Infrastructure/Jobs/UploadIntentExpirationJob.cs b/backend/Musify.Infrastructure/Jobs/UploadIntentExpirationJob.cs index 6e0cc78..5bf9192 100644 --- a/backend/Musify.Infrastructure/Jobs/UploadIntentExpirationJob.cs +++ b/backend/Musify.Infrastructure/Jobs/UploadIntentExpirationJob.cs @@ -18,7 +18,9 @@ namespace Musify.Infrastructure.Jobs { logger.LogInformation("UploadIntentExpirationJob started (interval: {Interval}s)", uploadIntentConfiguration.ExpirationJobIntervalSeconds); - while (!stoppingToken.IsCancellationRequested) + using var timer = new PeriodicTimer(TimeSpan.FromSeconds(uploadIntentConfiguration.ExpirationJobIntervalSeconds)); + + do { try { @@ -28,9 +30,8 @@ namespace Musify.Infrastructure.Jobs { logger.LogError(exception, "Error in UploadIntentExpirationJob"); } - - await Task.Delay(TimeSpan.FromSeconds(uploadIntentConfiguration.ExpirationJobIntervalSeconds), stoppingToken); } + while (await timer.WaitForNextTickAsync(stoppingToken)); } async Task RunAsync(CancellationToken cancellationToken) diff --git a/backend/Musify.Infrastructure/MassTransit/Activities/Pictures/ResizePictureActivity.cs b/backend/Musify.Infrastructure/MassTransit/Activities/Pictures/ResizePictureActivity.cs index ddf088f..78eac7c 100644 --- a/backend/Musify.Infrastructure/MassTransit/Activities/Pictures/ResizePictureActivity.cs +++ b/backend/Musify.Infrastructure/MassTransit/Activities/Pictures/ResizePictureActivity.cs @@ -30,7 +30,7 @@ namespace Musify.Infrastructure.MassTransit.Activities.Pictures await using var fileStream = File.OpenRead(sourceFilePath); - var resizedPicture = await pictureHandler.ResizePictureAsWebpAsync( + await using var resizedPicture = await pictureHandler.ResizePictureAsWebpAsync( fileStream, executeContext.Arguments.Width, executeContext.Arguments.Height, diff --git a/backend/Musify.Infrastructure/Services/AudioTranscoderService.cs b/backend/Musify.Infrastructure/Services/AudioTranscoderService.cs index c3edd07..610c2a4 100644 --- a/backend/Musify.Infrastructure/Services/AudioTranscoderService.cs +++ b/backend/Musify.Infrastructure/Services/AudioTranscoderService.cs @@ -103,13 +103,16 @@ namespace Musify.Infrastructure.Services logger.LogDebug("[{Operation}] ffmpeg started (PID: {ProcessId}) in {WorkingDirectory}", operationName, process.Id, workingDirectory); + var outputTask = process.StandardOutput.ReadToEndAsync(cancellationToken); + var errorTask = process.StandardError.ReadToEndAsync(cancellationToken); + if (inputStream.CanSeek) inputStream.Position = 0; await inputStream.CopyToAsync(process.StandardInput.BaseStream, cancellationToken); process.StandardInput.Close(); - return await WaitForProcessResultAsync(process, operationName, cancellationToken); + return await WaitForProcessResultAsync(process, outputTask, errorTask, operationName, cancellationToken); } async Task ExecuteFfmpegAsync( @@ -123,7 +126,10 @@ namespace Musify.Infrastructure.Services logger.LogDebug("[{Operation}] ffmpeg started (PID: {ProcessId}) in {WorkingDirectory}", operationName, process.Id, workingDirectory); - return await WaitForProcessResultAsync(process, operationName, cancellationToken); + var outputTask = process.StandardOutput.ReadToEndAsync(cancellationToken); + var errorTask = process.StandardError.ReadToEndAsync(cancellationToken); + + return await WaitForProcessResultAsync(process, outputTask, errorTask, operationName, cancellationToken); } Process BuildProcess(string arguments, string workingDirectory, bool redirectStandardInput) @@ -144,12 +150,11 @@ namespace Musify.Infrastructure.Services async Task WaitForProcessResultAsync( Process process, + Task outputTask, + Task errorTask, string operationName, CancellationToken cancellationToken) { - var errorTask = process.StandardError.ReadToEndAsync(cancellationToken); - var outputTask = process.StandardOutput.ReadToEndAsync(cancellationToken); - using var linkedCancellationTokens = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); linkedCancellationTokens.CancelAfter(audioTranscoderConfiguration.TranscodingTimeout); diff --git a/backend/Musify.Infrastructure/Services/ServicesDependencyInjection.cs b/backend/Musify.Infrastructure/Services/ServicesDependencyInjection.cs index ab5ca1c..ae79471 100644 --- a/backend/Musify.Infrastructure/Services/ServicesDependencyInjection.cs +++ b/backend/Musify.Infrastructure/Services/ServicesDependencyInjection.cs @@ -21,7 +21,7 @@ namespace Musify.Infrastructure.Services serviceDescriptors.AddSingleton(serviceProvider => serviceProvider.GetRequiredService>().Value); - serviceDescriptors.AddScoped(serviceProvider => + serviceDescriptors.AddSingleton(serviceProvider => { var configuration = serviceProvider.GetRequiredService(); var s3Configuration = new AmazonS3Config