int trunk_create_trunk_file_advance(void *args) { int64_t total_mb_sum; int64_t free_mb_sum; int64_t alloc_space; FDFSTrunkNode *pTrunkNode; int result; int i; int file_count; if (!g_trunk_create_file_advance) { logError("file: "__FILE__", line: %d, " \ "do not need create trunk file advancely!", __LINE__); return EINVAL; } if (!g_if_trunker_self) { logError("file: "__FILE__", line: %d, " \ "I am not trunk server!", __LINE__); return ENOENT; } alloc_space = g_trunk_create_file_space_threshold - \ g_trunk_total_free_space; if (alloc_space <= 0) { logDebug("file: "__FILE__", line: %d, " \ "do not need create trunk file!", __LINE__); return 0; } total_mb_sum = 0; free_mb_sum = 0; for (i=0; i<g_fdfs_store_paths.count; i++) { total_mb_sum += g_path_space_list[i].total_mb; free_mb_sum += g_path_space_list[i].free_mb; } if (!storage_check_reserved_space_path(total_mb_sum, free_mb_sum \ - (alloc_space / FDFS_ONE_MB), g_storage_reserved_space.rs.mb)) { logError("file: "__FILE__", line: %d, " \ "free space is not enough!", __LINE__); return ENOSPC; } result = 0; file_count = alloc_space / g_trunk_file_size; for (i=0; i<file_count; i++) { pTrunkNode = trunk_create_trunk_file(-1, &result); if (pTrunkNode != NULL) { result = trunk_add_free_block(pTrunkNode, false); if (result != 0) { break; } } } if (result == 0) { logDebug("file: "__FILE__", line: %d, " \ "create trunk file count: %d", __LINE__, file_count); } return result; }
static int trunk_create_next_file(FDFSTrunkFullInfo *pTrunkInfo) { char buff[32]; int i; int result; int filename_len; char short_filename[64]; char full_filename[MAX_PATH_SIZE]; int store_path_index; int sub_path_high; int sub_path_low; store_path_index = g_store_path_index; if (g_store_path_mode == FDFS_STORE_PATH_LOAD_BALANCE) { if (store_path_index < 0) { return ENOSPC; } } else { if (store_path_index >= g_fdfs_store_paths.count) { store_path_index = 0; } if (!storage_check_reserved_space_path(g_path_space_list \ [store_path_index].total_mb, g_path_space_list \ [store_path_index].free_mb, g_avg_storage_reserved_mb)) { for (i=0; i<g_fdfs_store_paths.count; i++) { if (storage_check_reserved_space_path( \ g_path_space_list[i].total_mb, \ g_path_space_list[i].free_mb, \ g_avg_storage_reserved_mb)) { store_path_index = i; g_store_path_index = i; break; } } if (i == g_fdfs_store_paths.count) { return ENOSPC; } } g_store_path_index++; if (g_store_path_index >= g_fdfs_store_paths.count) { g_store_path_index = 0; } } pTrunkInfo->path.store_path_index = store_path_index; while (1) { pthread_mutex_lock(&trunk_file_lock); pTrunkInfo->file.id = ++g_current_trunk_file_id; result = storage_write_to_sync_ini_file(); pthread_mutex_unlock(&trunk_file_lock); if (result != 0) { return result; } int2buff(pTrunkInfo->file.id, buff); base64_encode_ex(&g_fdfs_base64_context, buff, sizeof(int), \ short_filename, &filename_len, false); storage_get_store_path(short_filename, filename_len, \ &sub_path_high, &sub_path_low); pTrunkInfo->path.sub_path_high = sub_path_high; pTrunkInfo->path.sub_path_low = sub_path_low; trunk_get_full_filename(pTrunkInfo, full_filename, \ sizeof(full_filename)); if (!fileExists(full_filename)) { break; } } if ((result=trunk_init_file(full_filename)) != 0) { return result; } return 0; }