in Sources/aliyun-log-c-sdk/log_persistent_manager.c [56:101]
int save_log_checkpoint(log_persistent_manager * manager)
{
log_persistent_checkpoint * checkpoint = &(manager->checkpoint);
checkpoint->check_sum = checkpoint->start_log_uuid + checkpoint->now_log_uuid +
checkpoint->start_file_offset + checkpoint->now_file_offset;
if (manager->checkpoint_file_size >= MAX_CHECKPOINT_FILE_SIZE)
{
if (manager->checkpoint_file_ptr != NULL)
{
fclose(manager->checkpoint_file_ptr);
manager->checkpoint_file_ptr = NULL;
}
char tmpFilePath[256];
strcpy(tmpFilePath, manager->checkpoint_file_path);
strcat(tmpFilePath, ".bak");
aos_info_log("start switch checkpoint index file %s \n", manager->checkpoint_file_path);
FILE * tmpFile = fopen(tmpFilePath, "wb+");
if (tmpFile == NULL)
return -1;
if (1 !=
fwrite((const void *)(&manager->checkpoint), sizeof(log_persistent_checkpoint), 1, tmpFile))
{
fclose(tmpFile);
return -2;
}
if (fclose(tmpFile) != 0)
return -3;
if (rename(tmpFilePath, manager->checkpoint_file_path) != 0 )
return -4;
manager->checkpoint_file_size = sizeof(log_persistent_checkpoint);
return 0;
}
if (manager->checkpoint_file_ptr == NULL)
{
manager->checkpoint_file_ptr = fopen(manager->checkpoint_file_path, "ab+");
if (manager->checkpoint_file_ptr == NULL)
return -5;
}
if (1 !=
fwrite((const void *)(&manager->checkpoint), sizeof(log_persistent_checkpoint), 1, manager->checkpoint_file_ptr))
return -6;
if (fflush(manager->checkpoint_file_ptr) != 0)
return -7;
manager->checkpoint_file_size += sizeof(log_persistent_checkpoint);
return 0;
}