in src/Microsoft.Health.Dicom.Core/Features/Delete/DeleteService.cs [83:147]
public async Task<(bool success, int retrievedInstanceCount)> CleanupDeletedInstancesAsync(CancellationToken cancellationToken)
{
bool success = true;
int retrievedInstanceCount = 0;
using (ITransactionScope transactionScope = _transactionHandler.BeginTransaction())
{
try
{
var deletedInstanceIdentifiers = (await _indexDataStore
.RetrieveDeletedInstancesAsync(
_deletedInstanceCleanupConfiguration.BatchSize,
_deletedInstanceCleanupConfiguration.MaxRetries,
cancellationToken))
.ToList();
retrievedInstanceCount = deletedInstanceIdentifiers.Count;
foreach (VersionedInstanceIdentifier deletedInstanceIdentifier in deletedInstanceIdentifiers)
{
try
{
Task[] tasks = new[]
{
_fileStore.DeleteFileIfExistsAsync(deletedInstanceIdentifier, cancellationToken),
_metadataStore.DeleteInstanceMetadataIfExistsAsync(deletedInstanceIdentifier, cancellationToken),
};
await Task.WhenAll(tasks);
await _indexDataStore.DeleteDeletedInstanceAsync(deletedInstanceIdentifier, cancellationToken);
}
catch (Exception cleanupException)
{
try
{
int newRetryCount = await _indexDataStore.IncrementDeletedInstanceRetryAsync(deletedInstanceIdentifier, GenerateCleanupAfter(_deletedInstanceCleanupConfiguration.RetryBackOff), cancellationToken);
if (newRetryCount > _deletedInstanceCleanupConfiguration.MaxRetries)
{
_logger.LogCritical(cleanupException, "Failed to cleanup instance {DeletedInstanceIdentifier}. Retry count is now {NewRetryCount} and retry will not be re-attempted.", deletedInstanceIdentifier, newRetryCount);
}
else
{
_logger.LogError(cleanupException, "Failed to cleanup instance {DeletedInstanceIdentifier}. Retry count is now {NewRetryCount}.", deletedInstanceIdentifier, newRetryCount);
}
}
catch (Exception incrementException)
{
_logger.LogCritical(incrementException, "Failed to increment cleanup retry for instance {DeletedInstanceIdentifier}.", deletedInstanceIdentifier);
success = false;
}
}
}
transactionScope.Complete();
}
catch (Exception retrieveException)
{
_logger.LogCritical(retrieveException, "Failed to retrieve instances to cleanup.");
success = false;
}
}
return (success, retrievedInstanceCount);
}