public async Task GetStacksForCleanupAsync()
    {
        var openStack10DaysOldWithReference = StackData.GenerateStack(id: TestConstants.StackId3, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(10), status: StackStatus.Open);

        openStack10DaysOldWithReference.References.Add("test");

        await _repository.AddAsync(new List <Stack> {
            StackData.GenerateStack(id: TestConstants.StackId, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(5), status: StackStatus.Open),
            StackData.GenerateStack(id: TestConstants.StackId2, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(10), status: StackStatus.Open),
            openStack10DaysOldWithReference,
            StackData.GenerateStack(id: TestConstants.StackId4, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(10), status: StackStatus.Fixed)
        }, o => o.ImmediateConsistency());

        var stacks = await _repository.GetStacksForCleanupAsync(TestConstants.OrganizationId, SystemClock.UtcNow.SubtractDays(8));

        Assert.NotNull(stacks);
        Assert.Equal(1, stacks.Total);
        Assert.Equal(1, stacks.Documents.Count);
        Assert.Equal(TestConstants.StackId2, stacks.Documents.Single().Id);

        stacks = await _repository.GetStacksForCleanupAsync(TestConstants.OrganizationId, SystemClock.UtcNow.SubtractDays(1));

        Assert.NotNull(stacks);
        Assert.Equal(2, stacks.Total);
        Assert.Equal(2, stacks.Documents.Count);
        Assert.NotNull(stacks.Documents.SingleOrDefault(s => String.Equals(s.Id, TestConstants.StackId)));
        Assert.NotNull(stacks.Documents.SingleOrDefault(s => String.Equals(s.Id, TestConstants.StackId2)));
    }
示例#2
0
    private async Task EnforceStackRetentionDaysAsync(Organization organization, int retentionDays, JobContext context)
    {
        await RenewLockAsync(context).AnyContext();

        var cutoff       = SystemClock.UtcNow.Date.SubtractDays(retentionDays);
        var stackResults = await _stackRepository.GetStacksForCleanupAsync(organization.Id, cutoff).AnyContext();

        _logger.RetentionEnforcementStackStart(cutoff, organization.Name, organization.Id, stackResults.Total);

        while (stackResults.Documents.Count > 0 && !context.CancellationToken.IsCancellationRequested)
        {
            try {
                await RemoveStacksAsync(stackResults.Documents, context).AnyContext();
            }
            catch (Exception ex) {
                _logger.LogError(ex, "Error removing stacks: {Message}", ex.Message);
            }

            if (context.CancellationToken.IsCancellationRequested || !await stackResults.NextPageAsync().AnyContext())
            {
                break;
            }
        }

        _logger.RetentionEnforcementStackComplete(organization.Name, organization.Id, stackResults.Documents.Count);
    }