static int storage_open_stat_file() { char full_filename[MAX_PATH_SIZE]; IniContext iniContext; int result; get_storage_stat_filename(NULL, full_filename); if (fileExists(full_filename)) { if ((result=iniLoadFromFile(full_filename, &iniContext)) \ != 0) { logError("file: "__FILE__", line: %d, " \ "load from stat file \"%s\" fail, " \ "error code: %d", \ __LINE__, full_filename, result); return result; } if (iniContext.global.count < 12) { iniFreeContext(&iniContext); logError("file: "__FILE__", line: %d, " \ "in stat file \"%s\", item count: %d < 12", \ __LINE__, full_filename, iniContext.global.count); return ENOENT; } g_storage_stat.total_upload_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_UPLOAD, &iniContext, 0); g_storage_stat.success_upload_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_UPLOAD, &iniContext, 0); g_storage_stat.total_append_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_APPEND, &iniContext, 0); g_storage_stat.success_append_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_APPEND, &iniContext, 0); g_storage_stat.total_download_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_DOWNLOAD, &iniContext, 0); g_storage_stat.success_download_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_DOWNLOAD, &iniContext, 0); g_storage_stat.last_source_update = iniGetIntValue(NULL, \ STAT_ITEM_LAST_SOURCE_UPD, &iniContext, 0); g_storage_stat.last_sync_update = iniGetIntValue(NULL, \ STAT_ITEM_LAST_SYNC_UPD, &iniContext, 0); g_storage_stat.total_set_meta_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_SET_META, &iniContext, 0); g_storage_stat.success_set_meta_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_SET_META, &iniContext, 0); g_storage_stat.total_delete_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_DELETE, &iniContext, 0); g_storage_stat.success_delete_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_DELETE, &iniContext, 0); g_storage_stat.total_get_meta_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_GET_META, &iniContext, 0); g_storage_stat.success_get_meta_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_GET_META, &iniContext, 0); g_storage_stat.total_create_link_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_CREATE_LINK, &iniContext, 0); g_storage_stat.success_create_link_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_CREATE_LINK, &iniContext, 0); g_storage_stat.total_delete_link_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_DELETE_LINK, &iniContext, 0); g_storage_stat.success_delete_link_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_DELETE_LINK, &iniContext, 0); g_storage_stat.total_upload_bytes = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_UPLOAD_BYTES, &iniContext, 0); g_storage_stat.success_upload_bytes = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_UPLOAD_BYTES, &iniContext, 0); g_storage_stat.total_append_bytes = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_APPEND_BYTES, &iniContext, 0); g_storage_stat.success_append_bytes = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_APPEND_BYTES, &iniContext, 0); g_storage_stat.total_download_bytes = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_DOWNLOAD_BYTES, &iniContext, 0); g_storage_stat.success_download_bytes = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_DOWNLOAD_BYTES, &iniContext, 0); g_storage_stat.total_sync_in_bytes = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_SYNC_IN_BYTES, &iniContext, 0); g_storage_stat.success_sync_in_bytes = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_SYNC_IN_BYTES, &iniContext, 0); g_storage_stat.total_sync_out_bytes = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_SYNC_OUT_BYTES, &iniContext, 0); g_storage_stat.success_sync_out_bytes = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_SYNC_OUT_BYTES, &iniContext, 0); g_storage_stat.total_file_open_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_FILE_OPEN_COUNT, &iniContext, 0); g_storage_stat.success_file_open_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_FILE_OPEN_COUNT, &iniContext, 0); g_storage_stat.total_file_read_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_FILE_READ_COUNT, &iniContext, 0); g_storage_stat.success_file_read_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_FILE_READ_COUNT, &iniContext, 0); g_storage_stat.total_file_write_count = iniGetInt64Value(NULL, \ STAT_ITEM_TOTAL_FILE_WRITE_COUNT, &iniContext, 0); g_storage_stat.success_file_write_count = iniGetInt64Value(NULL, \ STAT_ITEM_SUCCESS_FILE_WRITE_COUNT, &iniContext, 0); g_dist_path_index_high = iniGetIntValue(NULL, \ STAT_ITEM_DIST_PATH_INDEX_HIGH, &iniContext, 0); g_dist_path_index_low = iniGetIntValue(NULL, \ STAT_ITEM_DIST_PATH_INDEX_LOW, &iniContext, 0); g_dist_write_file_count = iniGetIntValue(NULL, \ STAT_ITEM_DIST_WRITE_FILE_COUNT, &iniContext, 0); iniFreeContext(&iniContext); } else { memset(&g_storage_stat, 0, sizeof(g_storage_stat)); } storage_stat_fd = open(full_filename, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (storage_stat_fd < 0) { logError("file: "__FILE__", line: %d, " \ "open stat file \"%s\" fail, " \ "error no: %d, error info: %s", \ __LINE__, full_filename, errno, STRERROR(errno)); return errno != 0 ? errno : ENOENT; } if ((result=storage_write_to_stat_file()) != 0) { return result; } STORAGE_FCHOWN(storage_stat_fd, full_filename, geteuid(), getegid()) return 0; }
int storage_get_params_from_tracker() { IniContext iniContext; int result; bool use_trunk_file; char reserved_space_str[32]; char *pIdType; if ((result=fdfs_get_ini_context_from_tracker(&g_tracker_group, \ &iniContext, (bool * volatile)&g_continue_flag, \ g_client_bind_addr, g_bind_addr)) != 0) { return result; } g_storage_ip_changed_auto_adjust = iniGetBoolValue(NULL, \ "storage_ip_changed_auto_adjust", \ &iniContext, false); g_store_path_mode = iniGetIntValue(NULL, "store_path", &iniContext, \ FDFS_STORE_PATH_ROUND_ROBIN); if ((result=fdfs_parse_storage_reserved_space(&iniContext, \ &g_storage_reserved_space)) != 0) { iniFreeContext(&iniContext); return result; } if (g_storage_reserved_space.flag == \ TRACKER_STORAGE_RESERVED_SPACE_FLAG_MB) { g_avg_storage_reserved_mb = g_storage_reserved_space.rs.mb \ / g_fdfs_store_paths.count; } else { g_avg_storage_reserved_mb = 0; } g_use_storage_id = iniGetBoolValue(NULL, "use_storage_id", \ &iniContext, false); use_trunk_file = iniGetBoolValue(NULL, "use_trunk_file", \ &iniContext, false); g_slot_min_size = iniGetIntValue(NULL, "slot_min_size", \ &iniContext, 256); g_trunk_file_size = iniGetIntValue(NULL, "trunk_file_size", \ &iniContext, 64 * 1024 * 1024); g_slot_max_size = iniGetIntValue(NULL, "slot_max_size", \ &iniContext, g_trunk_file_size / 2); g_trunk_create_file_advance = iniGetBoolValue(NULL, \ "trunk_create_file_advance", &iniContext, false); if ((result=get_time_item_from_conf(&iniContext, \ "trunk_create_file_time_base", \ &g_trunk_create_file_time_base, 2, 0)) != 0) { iniFreeContext(&iniContext); return result; } g_trunk_create_file_interval = iniGetIntValue(NULL, \ "trunk_create_file_interval", &iniContext, \ 86400); g_trunk_create_file_space_threshold = iniGetInt64Value(NULL, \ "trunk_create_file_space_threshold", \ &iniContext, 0); g_trunk_init_check_occupying = iniGetBoolValue(NULL, \ "trunk_init_check_occupying", &iniContext, false); g_trunk_init_reload_from_binlog = iniGetBoolValue(NULL, \ "trunk_init_reload_from_binlog", &iniContext, false); g_trunk_compress_binlog_min_interval = iniGetIntValue(NULL, \ "trunk_compress_binlog_min_interval", &iniContext, 0); g_store_slave_file_use_link = iniGetBoolValue(NULL, \ "store_slave_file_use_link", &iniContext, false); pIdType = iniGetStrValue(NULL, "id_type_in_filename", &iniContext); if (pIdType != NULL && strcasecmp(pIdType, "id") == 0) { if (g_use_storage_id) { g_id_type_in_filename = FDFS_ID_TYPE_SERVER_ID; } else { g_id_type_in_filename = FDFS_ID_TYPE_IP_ADDRESS; } } else { g_id_type_in_filename = FDFS_ID_TYPE_IP_ADDRESS; } iniFreeContext(&iniContext); if (use_trunk_file && !g_if_use_trunk_file) { if ((result=trunk_sync_init()) != 0) { return result; } } g_if_use_trunk_file = use_trunk_file; logInfo("file: "__FILE__", line: %d, " \ "use_storage_id=%d, " \ "id_type_in_filename=%s, " \ "storage_ip_changed_auto_adjust=%d, " \ "store_path=%d, " \ "reserved_storage_space=%s, " \ "use_trunk_file=%d, " \ "slot_min_size=%d, " \ "slot_max_size=%d MB, " \ "trunk_file_size=%d MB, " \ "trunk_create_file_advance=%d, " \ "trunk_create_file_time_base=%02d:%02d, " \ "trunk_create_file_interval=%d, " \ "trunk_create_file_space_threshold=%d GB, " \ "trunk_init_check_occupying=%d, " \ "trunk_init_reload_from_binlog=%d, " \ "trunk_compress_binlog_min_interval=%d, " \ "store_slave_file_use_link=%d", \ __LINE__, g_use_storage_id, \ g_id_type_in_filename == FDFS_ID_TYPE_SERVER_ID ? "id" : "ip", \ g_storage_ip_changed_auto_adjust, \ g_store_path_mode, fdfs_storage_reserved_space_to_string( \ &g_storage_reserved_space, reserved_space_str), \ g_if_use_trunk_file, g_slot_min_size, \ g_slot_max_size / FDFS_ONE_MB, \ g_trunk_file_size / FDFS_ONE_MB, \ g_trunk_create_file_advance, \ g_trunk_create_file_time_base.hour, \ g_trunk_create_file_time_base.minute, \ g_trunk_create_file_interval, \ (int)(g_trunk_create_file_space_threshold / \ (FDFS_ONE_MB * 1024)), g_trunk_init_check_occupying, \ g_trunk_init_reload_from_binlog, \ g_trunk_compress_binlog_min_interval, \ g_store_slave_file_use_link); if (g_use_storage_id && *g_sync_src_id != '\0' && \ !fdfs_is_server_id_valid(g_sync_src_id)) { if ((result=storage_convert_src_server_id()) == 0) { storage_write_to_sync_ini_file(); } else { if (result == ENOENT) { *g_sync_src_id = '\0'; storage_write_to_sync_ini_file(); } else { return result; } } } return 0; }
static int recovery_reader_init(const char *pBasePath, \ StorageBinLogReader *pReader) { char full_mark_filename[MAX_PATH_SIZE]; IniContext iniContext; int result; memset(pReader, 0, sizeof(StorageBinLogReader)); pReader->mark_fd = -1; pReader->binlog_fd = -1; pReader->binlog_index = g_binlog_index + 1; pReader->binlog_buff.buffer = (char *)malloc( \ STORAGE_BINLOG_BUFFER_SIZE); if (pReader->binlog_buff.buffer == NULL) { logError("file: "__FILE__", line: %d, " \ "malloc %d bytes fail, " \ "errno: %d, error info: %s", \ __LINE__, STORAGE_BINLOG_BUFFER_SIZE, \ errno, STRERROR(errno)); return errno != 0 ? errno : ENOMEM; } pReader->binlog_buff.current = pReader->binlog_buff.buffer; recovery_get_mark_filename(pBasePath, full_mark_filename); memset(&iniContext, 0, sizeof(IniContext)); if ((result=iniLoadFromFile(full_mark_filename, &iniContext)) != 0) { logError("file: "__FILE__", line: %d, " \ "load from mark file \"%s\" fail, " \ "error code: %d", __LINE__, \ full_mark_filename, result); return result; } if (!iniGetBoolValue(NULL, MARK_ITEM_FETCH_BINLOG_DONE, \ &iniContext, false)) { iniFreeContext(&iniContext); logInfo("file: "__FILE__", line: %d, " \ "mark file \"%s\", %s=0, " \ "need to fetch binlog again", __LINE__, \ full_mark_filename, MARK_ITEM_FETCH_BINLOG_DONE); return EAGAIN; } saved_storage_status = iniGetIntValue(NULL, \ MARK_ITEM_SAVED_STORAGE_STATUS, &iniContext, -1); if (saved_storage_status < 0) { iniFreeContext(&iniContext); logError("file: "__FILE__", line: %d, " \ "in mark file \"%s\", %s: %d < 0", __LINE__, \ full_mark_filename, MARK_ITEM_SAVED_STORAGE_STATUS, \ saved_storage_status); return EINVAL; } pReader->binlog_offset = iniGetInt64Value(NULL, \ MARK_ITEM_BINLOG_OFFSET, &iniContext, -1); if (pReader->binlog_offset < 0) { iniFreeContext(&iniContext); logError("file: "__FILE__", line: %d, " \ "in mark file \"%s\", %s: "\ "%"PRId64" < 0", __LINE__, \ full_mark_filename, MARK_ITEM_BINLOG_OFFSET, \ pReader->binlog_offset); return EINVAL; } iniFreeContext(&iniContext); pReader->mark_fd = open(full_mark_filename, O_WRONLY | O_CREAT, 0644); if (pReader->mark_fd < 0) { logError("file: "__FILE__", line: %d, " \ "open mark file \"%s\" fail, " \ "error no: %d, error info: %s", \ __LINE__, full_mark_filename, \ errno, STRERROR(errno)); return errno != 0 ? errno : ENOENT; } if ((result=storage_open_readable_binlog(pReader, \ recovery_get_binlog_filename, pBasePath)) != 0) { return result; } return 0; }
int trunk_reader_init(FDFSStorageBrief *pStorage, TrunkBinLogReader *pReader) { char full_filename[MAX_PATH_SIZE]; IniContext iniContext; int result; int64_t saved_binlog_offset; bool bFileExist; saved_binlog_offset = pReader->binlog_offset; memset(pReader, 0, sizeof(TrunkBinLogReader)); pReader->mark_fd = -1; pReader->binlog_fd = -1; pReader->binlog_buff.buffer = (char *)malloc( \ TRUNK_BINLOG_BUFFER_SIZE); if (pReader->binlog_buff.buffer == NULL) { logError("file: "__FILE__", line: %d, " \ "malloc %d bytes fail, " \ "errno: %d, error info: %s", \ __LINE__, TRUNK_BINLOG_BUFFER_SIZE, \ errno, STRERROR(errno)); return errno != 0 ? errno : ENOMEM; } pReader->binlog_buff.current = pReader->binlog_buff.buffer; if (pStorage == NULL) { strcpy(pReader->storage_id, "0.0.0.0"); } else { strcpy(pReader->storage_id, pStorage->id); } trunk_mark_filename_by_reader(pReader, full_filename); if (pStorage == NULL) { bFileExist = false; pReader->binlog_offset = saved_binlog_offset; } else { bFileExist = fileExists(full_filename); if (!bFileExist && (g_use_storage_id && pStorage != NULL)) { char old_mark_filename[MAX_PATH_SIZE]; trunk_get_mark_filename_by_ip_and_port( \ pStorage->ip_addr, g_server_port, \ old_mark_filename, sizeof(old_mark_filename)); if (fileExists(old_mark_filename)) { if (rename(old_mark_filename, full_filename)!=0) { logError("file: "__FILE__", line: %d, "\ "rename file %s to %s fail" \ ", errno: %d, error info: %s", \ __LINE__, old_mark_filename, \ full_filename, errno, \ STRERROR(errno)); return errno != 0 ? errno : EACCES; } bFileExist = true; } } } if (bFileExist) { memset(&iniContext, 0, sizeof(IniContext)); if ((result=iniLoadFromFile(full_filename, &iniContext)) \ != 0) { logError("file: "__FILE__", line: %d, " \ "load from mark file \"%s\" fail, " \ "error code: %d", \ __LINE__, full_filename, result); return result; } if (iniContext.global.count < 1) { iniFreeContext(&iniContext); logError("file: "__FILE__", line: %d, " \ "in mark file \"%s\", item count: %d < 7", \ __LINE__, full_filename, iniContext.global.count); return ENOENT; } pReader->binlog_offset = iniGetInt64Value(NULL, \ MARK_ITEM_BINLOG_FILE_OFFSET, \ &iniContext, -1); if (pReader->binlog_offset < 0) { iniFreeContext(&iniContext); logError("file: "__FILE__", line: %d, " \ "in mark file \"%s\", binlog_offset: "\ "%"PRId64" < 0", \ __LINE__, full_filename, \ pReader->binlog_offset); return EINVAL; } iniFreeContext(&iniContext); } pReader->last_binlog_offset = pReader->binlog_offset; pReader->mark_fd = open(full_filename, O_WRONLY | O_CREAT, 0644); if (pReader->mark_fd < 0) { logError("file: "__FILE__", line: %d, " \ "open mark file \"%s\" fail, " \ "error no: %d, error info: %s", \ __LINE__, full_filename, \ errno, STRERROR(errno)); return errno != 0 ? errno : ENOENT; } if (!bFileExist && pStorage != NULL) { if ((result=trunk_write_to_mark_file(pReader)) != 0) { return result; } } if ((result=trunk_open_readable_binlog(pReader, \ get_binlog_readable_filename, pReader)) != 0) { return result; } result = trunk_binlog_preread(pReader); if (result != 0 && result != ENOENT) { return result; } return 0; }