int log_ring_file_clean()

in Sources/aliyun-log-c-sdk/log_ring_file.c [237:274]


int log_ring_file_clean(log_ring_file *file, uint64_t startOffset,
                        uint64_t endOffset)
{
    if (endOffset > file->nowOffset)
    {
        aos_error_log("try to clean invalid ring file %s, start %lld, end %lld, now %lld",
                      file->filePath,
                      startOffset,
                      endOffset,
                      file->nowOffset);
        return -1;
    }
    if ((file->nowOffset - endOffset) / file->maxFileSize >= file->maxFileCount - 1)
    {
        // no need to clean
        return 0;
    }
    memset(file->fileUseFlags, 0, sizeof(int) * file->maxFileCount);
    for (int64_t i = endOffset / file->maxFileSize; i <= file->nowOffset / file->maxFileSize; ++i)
    {
        file->fileUseFlags[i % file->maxFileCount] = 1;
    }
    aos_info_log("remove file %s , offset from %lld to %lld, file offset %lld, index from %d to %d",
                 file->filePath,
                 startOffset,
                 endOffset,
                 file->nowOffset,
                 endOffset / file->maxFileSize,
                 file->nowOffset / file->maxFileSize);
    for (int i = 0; i < file->maxFileCount; ++i)
    {
        if (file->fileUseFlags[i] != 0)
            continue;
        log_ring_file_remove_file(file, i);
    }

    return 0;
}