code refine: extent struct FDFSStorePathInfo

v6.03_dev
YuQing 2019-11-17 19:21:55 +08:00
parent 1ac2ced873
commit af4f0754e4
13 changed files with 155 additions and 162 deletions

View File

@ -1,5 +1,5 @@
Version 6.03 2019-11-16
Version 6.03 2019-11-17
* dual IPs support two different types of inner (intranet) IPs
* storage server request tracker server to change it's status
to that of tracker leader when the storage server found
@ -7,7 +7,9 @@ Version 6.03 2019-11-16
* bugfix: fdfs_monitor fix get index of the specified tracker server
* storage server write to data_init_flag and mark file safely
(write to temp file then rename)
* code refine: combine g_fdfs_store_paths and g_path_space_list,
and extent struct FDFSStorePathInfo
NOTE: the tracker and storage server must upgrade together
Version 6.02 2019-11-12

View File

@ -30,6 +30,7 @@
#include "tracker_types.h"
#include "tracker_proto.h"
#include "storage_global.h"
#include "trunk_mgr/trunk_shared.h"
#include "storage_func.h"
#include "storage_sync.h"
#include "tracker_client.h"
@ -65,7 +66,7 @@ static int storage_do_fetch_binlog(ConnectionInfo *pSrcStorage, \
int64_t file_bytes;
int result;
pBasePath = g_fdfs_store_paths.paths[store_path_index];
pBasePath = g_fdfs_store_paths.paths[store_path_index].path;
recovery_get_binlog_filename(pBasePath, full_binlog_filename);
memset(out_buff, 0, sizeof(out_buff));
@ -534,7 +535,7 @@ static int recovery_download_file_to_local(StorageBinLogRecord *pRecord,
{
bTrunkFile = false;
sprintf(local_filename, "%s/data/%s",
g_fdfs_store_paths.paths[pRecord->store_path_index],
g_fdfs_store_paths.paths[pRecord->store_path_index].path,
pRecord->true_filename);
}
@ -684,7 +685,7 @@ static int storage_do_recovery(const char *pBasePath, StorageBinLogReader *pRead
break;
}
sprintf(local_filename, "%s/data/%s", \
g_fdfs_store_paths.paths[store_path_index], \
g_fdfs_store_paths.paths[store_path_index].path, \
record.true_filename);
if ((result=storage_split_filename_ex( \
@ -695,7 +696,7 @@ static int storage_do_recovery(const char *pBasePath, StorageBinLogReader *pRead
break;
}
sprintf(src_filename, "%s/data/%s", \
g_fdfs_store_paths.paths[store_path_index], \
g_fdfs_store_paths.paths[store_path_index].path, \
record.true_filename);
if (symlink(src_filename, local_filename) == 0)
{
@ -916,7 +917,7 @@ static int storage_do_split_trunk_binlog(const int store_path_index,
int record_length;
int result;
pBasePath = g_fdfs_store_paths.paths[store_path_index];
pBasePath = g_fdfs_store_paths.paths[store_path_index].path;
recovery_get_full_filename(pBasePath, \
RECOVERY_BINLOG_FILENAME".tmp", tmpFullFilename);
fp = fopen(tmpFullFilename, "w");
@ -1087,7 +1088,7 @@ static int storage_disk_recovery_split_trunk_binlog(const int store_path_index)
StorageBinLogReader reader;
int result;
pBasePath = g_fdfs_store_paths.paths[store_path_index];
pBasePath = g_fdfs_store_paths.paths[store_path_index].path;
if ((result=recovery_reader_init(pBasePath, &reader)) != 0)
{
storage_reader_destroy(&reader);
@ -1107,7 +1108,7 @@ int storage_disk_recovery_start(const int store_path_index)
int result;
char *pBasePath;
pBasePath = g_fdfs_store_paths.paths[store_path_index];
pBasePath = g_fdfs_store_paths.paths[store_path_index].path;
if ((result=recovery_init_mark_file(pBasePath, false)) != 0)
{
return result;

View File

@ -246,9 +246,9 @@ static int fdfs_dump_global_vars(char *buff, const int buffSize)
total_len += snprintf(buff + total_len, buffSize - total_len,
"\tg_fdfs_store_paths.paths[%d]=%s, " \
"total=%d MB, free=%d MB\n", i, \
g_fdfs_store_paths.paths[i], \
g_path_space_list[i].total_mb, \
g_path_space_list[i].free_mb);
g_fdfs_store_paths.paths[i].path, \
g_fdfs_store_paths.paths[i].total_mb, \
g_fdfs_store_paths.paths[i].free_mb);
}
if (total_len < buffSize - 1)

View File

@ -842,7 +842,7 @@ static int storage_check_and_make_data_dirs()
for (i=0; i<g_fdfs_store_paths.count; i++)
{
if ((result=storage_make_data_dirs(g_fdfs_store_paths.paths[i], \
if ((result=storage_make_data_dirs(g_fdfs_store_paths.paths[i].path,
&pathCreated)) != 0)
{
return result;
@ -856,7 +856,7 @@ static int storage_check_and_make_data_dirs()
}
}
result = storage_disk_recovery_restore(g_fdfs_store_paths.paths[i]);
result = storage_disk_recovery_restore(g_fdfs_store_paths.paths[i].path);
if (result == EAGAIN) //need to re-fetch binlog
{
if ((result=storage_disk_recovery_start(i)) != 0)
@ -864,7 +864,7 @@ static int storage_check_and_make_data_dirs()
return result;
}
result=storage_disk_recovery_restore(g_fdfs_store_paths.paths[i]);
result=storage_disk_recovery_restore(g_fdfs_store_paths.paths[i].path);
}
if (result != 0)
@ -1024,7 +1024,6 @@ static int init_fsync_pthread_cond()
static int storage_load_paths(IniContext *pItemContext)
{
int result;
int bytes;
result = storage_load_paths_from_conf_file(pItemContext);
if (result != 0)
@ -1032,16 +1031,6 @@ static int storage_load_paths(IniContext *pItemContext)
return result;
}
bytes = sizeof(FDFSStorePathInfo) * g_fdfs_store_paths.count;
g_path_space_list = (FDFSStorePathInfo *)malloc(bytes);
if (g_path_space_list == NULL)
{
logError("file: "__FILE__", line: %d, " \
"malloc %d bytes fail, errno: %d, error info: %s", \
__LINE__, bytes, errno, STRERROR(errno));
return errno != 0 ? errno : ENOMEM;
}
memset(g_path_space_list, 0, bytes);
return 0;
}
@ -1996,10 +1985,10 @@ int storage_func_destroy()
{
for (i=0; i<g_fdfs_store_paths.count; i++)
{
if (g_fdfs_store_paths.paths[i] != NULL)
if (g_fdfs_store_paths.paths[i].path != NULL)
{
free(g_fdfs_store_paths.paths[i]);
g_fdfs_store_paths.paths[i] = NULL;
free(g_fdfs_store_paths.paths[i].path);
g_fdfs_store_paths.paths[i].path = NULL;
}
}
@ -2185,7 +2174,7 @@ int storage_logic_to_local_full_filename(const char *logic_filename,
}
snprintf(full_filename, filename_size, "%s/data/%s",
g_fdfs_store_paths.paths[*store_path_index], true_filename);
g_fdfs_store_paths.paths[*store_path_index].path, true_filename);
return 0;
}

View File

@ -15,7 +15,6 @@
#include "storage_global.h"
volatile bool g_continue_flag = true;
FDFSStorePathInfo *g_path_space_list = NULL;
int g_subdir_count_per_path = DEFAULT_DATA_DIR_COUNT_PER_PATH;
int g_server_port = FDFS_STORAGE_SERVER_DEF_PORT;

View File

@ -21,7 +21,6 @@
#include "client_global.h"
#include "fdht_types.h"
#include "fastcommon/local_ip_func.h"
#include "trunk_shared.h"
#ifdef WITH_HTTPD
#include "fdfs_http_shared.h"
@ -51,12 +50,6 @@ typedef struct
int last_sync_src_timestamp;
} FDFSStorageServer;
typedef struct
{
int total_mb; //total spaces
int free_mb; //free spaces
} FDFSStorePathInfo;
typedef struct
{
signed char my_status; //my status from tracker server
@ -68,8 +61,6 @@ typedef struct
extern volatile bool g_continue_flag;
extern FDFSStorePathInfo *g_path_space_list;
/* subdirs under store path, g_subdir_count * g_subdir_count 2 level subdirs */
extern int g_subdir_count_per_path;

View File

@ -789,7 +789,7 @@ static int storage_do_delete_meta_file(struct fast_task_info *pTask)
}
sprintf(meta_filename, "%s/data/%s"FDFS_STORAGE_META_FILE_EXT, \
g_fdfs_store_paths.paths[store_path_index], true_filename);
g_fdfs_store_paths.paths[store_path_index].path, true_filename);
}
else
{
@ -1022,7 +1022,7 @@ static int storage_do_delete_meta_file(struct fast_task_info *pTask)
else
{
sprintf(pFileContext->filename, "%s/data/%s", \
g_fdfs_store_paths.paths[store_path_index], \
g_fdfs_store_paths.paths[store_path_index].path, \
true_filename);
}
@ -2012,15 +2012,15 @@ int storage_get_storage_path_index(int *store_path_index)
*store_path_index = 0;
}
if (!storage_check_reserved_space_path(g_path_space_list \
[*store_path_index].total_mb, g_path_space_list \
if (!storage_check_reserved_space_path(g_fdfs_store_paths.paths \
[*store_path_index].total_mb, g_fdfs_store_paths.paths \
[*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_fdfs_store_paths.paths[i].total_mb, \
g_fdfs_store_paths.paths[i].free_mb, \
g_avg_storage_reserved_mb))
{
*store_path_index = i;
@ -2240,7 +2240,7 @@ static int storage_get_filename(StorageClientInfo *pClientInfo,
}
sprintf(full_filename, "%s/data/%s",
g_fdfs_store_paths.paths[store_path_index], filename);
g_fdfs_store_paths.paths[store_path_index].path, filename);
if (!fileExists(full_filename))
{
break;
@ -2499,7 +2499,7 @@ static int storage_service_upload_file_done(struct fast_task_info *pTask)
}
snprintf(pFileContext->filename, sizeof(pFileContext->filename), \
"%s/data/%s", g_fdfs_store_paths.paths[master_store_path_index], \
"%s/data/%s", g_fdfs_store_paths.paths[master_store_path_index].path, \
filename);
sprintf(pFileContext->fname2log, \
"%c"FDFS_STORAGE_DATA_DIR_FORMAT"/%s", \
@ -2878,12 +2878,12 @@ static int storage_service_do_create_link(struct fast_task_info *pTask, \
else
{
sprintf(full_filename, "%s/data/%s", \
g_fdfs_store_paths.paths[store_path_index], \
g_fdfs_store_paths.paths[store_path_index].path, \
filename);
}
sprintf(src_full_filename, "%s/data/%s", \
g_fdfs_store_paths.paths[store_path_index], \
g_fdfs_store_paths.paths[store_path_index].path, \
pSrcFileInfo->src_true_filename);
if (symlink(src_full_filename, full_filename) != 0)
{
@ -3337,7 +3337,7 @@ static int storage_server_set_metadata(struct fast_task_info *pTask)
pFileContext->timestamp2log = g_current_time;
sprintf(pFileContext->filename, "%s/data/%s%s", \
g_fdfs_store_paths.paths[store_path_index], true_filename, \
g_fdfs_store_paths.paths[store_path_index].path, true_filename, \
FDFS_STORAGE_META_FILE_EXT);
sprintf(pFileContext->fname2log,"%s%s", \
filename, FDFS_STORAGE_META_FILE_EXT);
@ -3595,7 +3595,7 @@ static int query_file_info_deal_response(struct fast_task_info *pTask,
snprintf(pFileContext->fname2log, sizeof(pFileContext->fname2log),
"%s", filename);
snprintf(pFileContext->filename, sizeof(pFileContext->filename),
"%s/data/%s", g_fdfs_store_paths.paths[store_path_index],
"%s/data/%s", g_fdfs_store_paths.paths[store_path_index].path,
true_filename);
return push_calc_crc32_to_dio_queue(pTask,
@ -3772,7 +3772,7 @@ static int storage_server_query_file_info(struct fast_task_info *pTask)
{
char full_filename[MAX_PATH_SIZE + 128];
sprintf(full_filename, "%s/data/%s",
g_fdfs_store_paths.paths[store_path_index],
g_fdfs_store_paths.paths[store_path_index].path,
true_filename);
if ((len=readlink(full_filename, src_filename, \
sizeof(src_filename))) < 0)
@ -4156,7 +4156,6 @@ static int storage_server_fetch_one_path_binlog_dealer( \
char *pBasePath;
int result;
int record_len;
int base_path_len;
int len;
int store_path_index;
struct stat stat_buf;
@ -4180,8 +4179,7 @@ static int storage_server_fetch_one_path_binlog_dealer( \
store_path_index = pFileContext->extra_info.upload.trunk_info. \
path.store_path_index;
pBasePath = g_fdfs_store_paths.paths[store_path_index];
base_path_len = strlen(pBasePath);
pBasePath = g_fdfs_store_paths.paths[store_path_index].path;
pOutBuff = pTask->data;
bLast = false;
@ -4202,7 +4200,8 @@ static int storage_server_fetch_one_path_binlog_dealer( \
break;
}
if (g_fdfs_store_paths.paths[record.store_path_index] != pBasePath)
if (g_fdfs_store_paths.paths[record.store_path_index].
path != pBasePath)
{
continue;
}
@ -4231,7 +4230,7 @@ static int storage_server_fetch_one_path_binlog_dealer( \
else
{
snprintf(full_filename, sizeof(full_filename), "%s/data/%s",
g_fdfs_store_paths.paths[record.store_path_index],
g_fdfs_store_paths.paths[record.store_path_index].path,
record.true_filename);
if (lstat(full_filename, &stat_buf) != 0)
{
@ -4326,7 +4325,7 @@ static int storage_server_fetch_one_path_binlog_dealer( \
break;
}
if (len <= base_path_len)
if (len <= g_fdfs_store_paths.paths[store_path_index].path_len)
{
logWarning("file: "__FILE__", line: %d, " \
"invalid symbol link file: %s, " \
@ -4346,11 +4345,11 @@ static int storage_server_fetch_one_path_binlog_dealer( \
}
//full filename format: ${base_path}/data/filename
pOutBuff += sprintf(pOutBuff, "%d %c %s %s/%s\n", \
(int)record.timestamp, \
record.op_type, record.filename, \
diskLogicPath, \
src_filename + base_path_len + 6);
pOutBuff += sprintf(pOutBuff, "%d %c %s %s/%s\n",
(int)record.timestamp,
record.op_type, record.filename,
diskLogicPath, src_filename + g_fdfs_store_paths.
paths[store_path_index].path_len + 6);
}
if (pTask->size - (pOutBuff - pTask->data) <
@ -4663,8 +4662,8 @@ static int storage_upload_file(struct fast_task_info *pTask, bool bAppenderFile)
{
char reserved_space_str[32];
if (!storage_check_reserved_space_path(g_path_space_list \
[store_path_index].total_mb, g_path_space_list \
if (!storage_check_reserved_space_path(g_fdfs_store_paths.paths \
[store_path_index].total_mb, g_fdfs_store_paths.paths \
[store_path_index].free_mb - (file_bytes/FDFS_ONE_MB), \
g_avg_storage_reserved_mb))
{
@ -4672,12 +4671,12 @@ static int storage_upload_file(struct fast_task_info *pTask, bool bAppenderFile)
"no space to upload file, "
"free space: %d MB is too small, file bytes: " \
"%"PRId64", reserved space: %s", \
__LINE__, g_path_space_list[store_path_index].\
__LINE__, g_fdfs_store_paths.paths[store_path_index].\
free_mb, file_bytes, \
fdfs_storage_reserved_space_to_string_ex( \
g_storage_reserved_space.flag, \
g_avg_storage_reserved_mb, \
g_path_space_list[store_path_index]. \
g_fdfs_store_paths.paths[store_path_index]. \
total_mb, g_storage_reserved_space.rs.ratio,\
reserved_space_str));
return ENOSPC;
@ -4758,7 +4757,7 @@ static int storage_server_check_appender_file(struct fast_task_info *pTask,
}
snprintf(pFileContext->filename, sizeof(pFileContext->filename),
"%s/data/%s", g_fdfs_store_paths.paths[*store_path_index],
"%s/data/%s", g_fdfs_store_paths.paths[*store_path_index].path,
true_filename);
if (lstat(pFileContext->filename, stat_buf) == 0)
{
@ -5517,8 +5516,8 @@ static int storage_upload_slave_file(struct fast_task_info *pTask)
return result;
}
if (!storage_check_reserved_space_path(g_path_space_list \
[store_path_index].total_mb, g_path_space_list \
if (!storage_check_reserved_space_path(g_fdfs_store_paths.paths \
[store_path_index].total_mb, g_fdfs_store_paths.paths \
[store_path_index].free_mb - (file_bytes / FDFS_ONE_MB), \
g_avg_storage_reserved_mb))
{
@ -5526,11 +5525,11 @@ static int storage_upload_slave_file(struct fast_task_info *pTask)
"no space to upload file, "
"free space: %d MB is too small, file bytes: " \
"%"PRId64", reserved space: %s", __LINE__,\
g_path_space_list[store_path_index].free_mb, \
g_fdfs_store_paths.paths[store_path_index].free_mb, \
file_bytes, fdfs_storage_reserved_space_to_string_ex(\
g_storage_reserved_space.flag, \
g_avg_storage_reserved_mb, \
g_path_space_list[store_path_index].total_mb, \
g_fdfs_store_paths.paths[store_path_index].total_mb, \
g_storage_reserved_space.rs.ratio, \
reserved_space_str));
return ENOSPC;
@ -5573,7 +5572,7 @@ static int storage_upload_slave_file(struct fast_task_info *pTask)
}
snprintf(pFileContext->filename, sizeof(pFileContext->filename), \
"%s/data/%s", g_fdfs_store_paths.paths[store_path_index], filename);
"%s/data/%s", g_fdfs_store_paths.paths[store_path_index].path, filename);
if (fileExists(pFileContext->filename))
{
logError("file: "__FILE__", line: %d, " \
@ -5871,7 +5870,7 @@ static int storage_sync_copy_file(struct fast_task_info *pTask, \
sprintf(pFileContext->filename, "%s/data/.cp" \
"%"PRId64".tmp", \
g_fdfs_store_paths.paths[store_path_index], \
g_fdfs_store_paths.paths[store_path_index].path, \
temp_file_sequence++);
pthread_mutex_unlock(&g_storage_thread_lock);
@ -6732,11 +6731,11 @@ static int storage_do_sync_link_file(struct fast_task_info *pTask)
else
{
snprintf(pFileContext->filename, sizeof(pFileContext->filename), \
"%s/data/%s", g_fdfs_store_paths.paths[dest_store_path_index], \
"%s/data/%s", g_fdfs_store_paths.paths[dest_store_path_index].path, \
dest_true_filename);
snprintf(src_full_filename, sizeof(src_full_filename), \
"%s/data/%s", g_fdfs_store_paths.paths[src_store_path_index], \
"%s/data/%s", g_fdfs_store_paths.paths[src_store_path_index].path, \
src_true_filename);
if (symlink(src_full_filename, pFileContext->filename) != 0)
{
@ -7106,7 +7105,7 @@ static int storage_server_get_metadata(struct fast_task_info *pTask)
}
sprintf(pFileContext->filename, "%s/data/%s%s", \
g_fdfs_store_paths.paths[store_path_index], \
g_fdfs_store_paths.paths[store_path_index].path, \
true_filename, FDFS_STORAGE_META_FILE_EXT);
if (lstat(pFileContext->filename, &stat_buf) == 0)
{
@ -7308,7 +7307,7 @@ static int storage_server_download_file(struct fast_task_info *pTask)
else
{
sprintf(pFileContext->filename, "%s/data/%s", \
g_fdfs_store_paths.paths[store_path_index], true_filename);
g_fdfs_store_paths.paths[store_path_index].path, true_filename);
}
pFileContext->calc_crc32 = false;
@ -7560,7 +7559,7 @@ static int storage_sync_delete_file(struct fast_task_info *pTask)
{
pClientInfo->deal_func = dio_delete_normal_file;
sprintf(pFileContext->filename, "%s/data/%s", \
g_fdfs_store_paths.paths[store_path_index], true_filename);
g_fdfs_store_paths.paths[store_path_index].path, true_filename);
}
strcpy(pFileContext->fname2log, filename);
@ -7695,7 +7694,7 @@ static int storage_server_delete_file(struct fast_task_info *pTask)
{
pClientInfo->deal_func = dio_delete_normal_file;
sprintf(pFileContext->filename, "%s/data/%s", \
g_fdfs_store_paths.paths[store_path_index], true_filename);
g_fdfs_store_paths.paths[store_path_index].path, true_filename);
}
if ((pFileContext->extra_info.upload.file_type & _FILE_TYPE_LINK) && \
@ -7706,12 +7705,11 @@ static int storage_server_delete_file(struct fast_task_info *pTask)
char src_fname2log[128];
char *src_true_filename;
int src_filename_len;
int base_path_len;
int src_store_path_index;
int i;
sprintf(full_filename, "%s/data/%s", \
g_fdfs_store_paths.paths[store_path_index], true_filename);
g_fdfs_store_paths.paths[store_path_index].path, true_filename);
do
{
if ((src_filename_len=readlink(full_filename, \
@ -7742,11 +7740,11 @@ static int storage_server_delete_file(struct fast_task_info *pTask)
return result;
}
base_path_len = strlen(g_fdfs_store_paths.paths \
[store_path_index]);
if (src_filename_len > base_path_len && memcmp( \
src_filename, g_fdfs_store_paths.paths \
[store_path_index], base_path_len) == 0)
if (src_filename_len > g_fdfs_store_paths.paths
[store_path_index].path_len && memcmp(
src_filename, g_fdfs_store_paths.paths
[store_path_index].path, g_fdfs_store_paths.
paths[store_path_index].path_len) == 0)
{
src_store_path_index = store_path_index;
}
@ -7755,10 +7753,9 @@ static int storage_server_delete_file(struct fast_task_info *pTask)
src_store_path_index = -1;
for (i=0; i<g_fdfs_store_paths.count; i++)
{
base_path_len = strlen(g_fdfs_store_paths.paths[i]);
if (src_filename_len > base_path_len && \
memcmp(src_filename, g_fdfs_store_paths.paths\
[i], base_path_len) == 0)
if (src_filename_len > g_fdfs_store_paths.paths[i].path_len &&
memcmp(src_filename, g_fdfs_store_paths.paths
[i].path, g_fdfs_store_paths.paths[i].path_len) == 0)
{
src_store_path_index = i;
break;
@ -7774,8 +7771,9 @@ static int storage_server_delete_file(struct fast_task_info *pTask)
}
}
src_true_filename = src_filename + (base_path_len + \
(sizeof("/data/") -1));
src_true_filename = src_filename + (g_fdfs_store_paths.
paths[src_store_path_index].path_len +
(sizeof("/data/") -1));
snprintf(src_fname2log, sizeof(src_fname2log), \
"%c"FDFS_STORAGE_DATA_DIR_FORMAT"/%s", \
FDFS_STORAGE_STORE_PATH_PREFIX_CHAR, \
@ -7916,7 +7914,7 @@ static int storage_create_link_core(struct fast_task_info *pTask, \
}
snprintf(full_filename, sizeof(full_filename), \
"%s/data/%s", g_fdfs_store_paths.paths[store_path_index], \
"%s/data/%s", g_fdfs_store_paths.paths[store_path_index].path, \
filename);
if (fileExists(full_filename))
{

View File

@ -185,7 +185,7 @@ static int storage_sync_copy_file(ConnectionInfo *pStorageServer, \
{
file_offset = 0;
sprintf(full_filename, "%s/data/%s", \
g_fdfs_store_paths.paths[pRecord->store_path_index], \
g_fdfs_store_paths.paths[pRecord->store_path_index].path, \
pRecord->true_filename);
}
@ -350,7 +350,7 @@ static int storage_sync_modify_file(ConnectionInfo *pStorageServer, \
}
snprintf(full_filename, sizeof(full_filename), \
"%s/data/%s", g_fdfs_store_paths.paths[pRecord->store_path_index], \
"%s/data/%s", g_fdfs_store_paths.paths[pRecord->store_path_index].path, \
pRecord->true_filename);
if (lstat(full_filename, &stat_buf) != 0)
{
@ -520,7 +520,7 @@ static int storage_sync_truncate_file(ConnectionInfo *pStorageServer, \
}
snprintf(full_filename, sizeof(full_filename), \
"%s/data/%s", g_fdfs_store_paths.paths[pRecord->store_path_index], \
"%s/data/%s", g_fdfs_store_paths.paths[pRecord->store_path_index].path, \
pRecord->true_filename);
if (lstat(full_filename, &stat_buf) != 0)
{
@ -841,7 +841,7 @@ static int storage_sync_link_file(ConnectionInfo *pStorageServer, \
int src_filename_len;
snprintf(full_filename, sizeof(full_filename), \
"%s/data/%s", g_fdfs_store_paths.paths[pRecord->store_path_index], \
"%s/data/%s", g_fdfs_store_paths.paths[pRecord->store_path_index].path, \
pRecord->true_filename);
src_filename_len = readlink(full_filename, src_full_filename, \
sizeof(src_full_filename) - 1);
@ -884,7 +884,7 @@ static int storage_sync_link_file(ConnectionInfo *pStorageServer, \
src_path_index++)
{
if (strcmp(src_full_filename, \
g_fdfs_store_paths.paths[src_path_index]) == 0)
g_fdfs_store_paths.paths[src_path_index].path) == 0)
{
break;
}
@ -998,7 +998,7 @@ static int storage_sync_rename_file(ConnectionInfo *pStorageServer,
}
snprintf(full_filename, sizeof(full_filename), "%s/data/%s",
g_fdfs_store_paths.paths[pRecord->store_path_index],
g_fdfs_store_paths.paths[pRecord->store_path_index].path,
pRecord->true_filename);
if (lstat(full_filename, &stat_buf) != 0)
{

View File

@ -2203,7 +2203,7 @@ static int tracker_report_df_stat(ConnectionInfo *pTrackerServer,
for (i=0; i<g_fdfs_store_paths.count; i++)
{
if (statvfs(g_fdfs_store_paths.paths[i], &sbuf) != 0)
if (statvfs(g_fdfs_store_paths.paths[i].path, &sbuf) != 0)
{
logError("file: "__FILE__", line: %d, " \
"call statfs fail, errno: %d, error info: %s.",\
@ -2216,12 +2216,12 @@ static int tracker_report_df_stat(ConnectionInfo *pTrackerServer,
return errno != 0 ? errno : EACCES;
}
g_path_space_list[i].total_mb = ((int64_t)(sbuf.f_blocks) * \
g_fdfs_store_paths.paths[i].total_mb = ((int64_t)(sbuf.f_blocks) * \
sbuf.f_frsize) / FDFS_ONE_MB;
g_path_space_list[i].free_mb = ((int64_t)(sbuf.f_bavail) * \
g_fdfs_store_paths.paths[i].free_mb = ((int64_t)(sbuf.f_bavail) * \
sbuf.f_frsize) / FDFS_ONE_MB;
long2buff(g_path_space_list[i].total_mb, pStatBuff->sz_total_mb);
long2buff(g_path_space_list[i].free_mb, pStatBuff->sz_free_mb);
long2buff(g_fdfs_store_paths.paths[i].total_mb, pStatBuff->sz_total_mb);
long2buff(g_fdfs_store_paths.paths[i].free_mb, pStatBuff->sz_free_mb);
pStatBuff++;
}
@ -2235,12 +2235,12 @@ static int tracker_report_df_stat(ConnectionInfo *pTrackerServer,
store_path_index = -1;
for (i=0; i<g_fdfs_store_paths.count; i++)
{
if (g_path_space_list[i].free_mb > \
if (g_fdfs_store_paths.paths[i].free_mb > \
g_avg_storage_reserved_mb \
&& g_path_space_list[i].free_mb > max_free_mb)
&& g_fdfs_store_paths.paths[i].free_mb > max_free_mb)
{
store_path_index = i;
max_free_mb = g_path_space_list[i].free_mb;
max_free_mb = g_fdfs_store_paths.paths[i].free_mb;
}
}
if (g_store_path_index != store_path_index)

View File

@ -1953,8 +1953,8 @@ int trunk_create_trunk_file_advance(void *args)
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;
total_mb_sum += g_fdfs_store_paths.paths[i].total_mb;
free_mb_sum += g_fdfs_store_paths.paths[i].free_mb;
}
if (!storage_check_reserved_space_path(total_mb_sum, free_mb_sum \

View File

@ -32,46 +32,47 @@ void trunk_shared_init()
base64_init_ex(&g_fdfs_base64_context, 0, '-', '_', '.');
}
char **storage_load_paths_from_conf_file_ex(IniContext *pItemContext, \
const char *szSectionName, const bool bUseBasePath, \
int *path_count, int *err_no)
FDFSStorePathInfo *storage_load_paths_from_conf_file_ex(
IniContext *pItemContext, const char *szSectionName,
const bool bUseBasePath, int *path_count, int *err_no)
{
char item_name[64];
char **store_paths;
FDFSStorePathInfo *store_paths;
char *pPath;
int bytes;
int i;
*path_count = iniGetIntValue(szSectionName, "store_path_count",
pItemContext, 1);
if (*path_count <= 0)
{
logError("file: "__FILE__", line: %d, " \
"store_path_count: %d is invalid!", \
logError("file: "__FILE__", line: %d, "
"store_path_count: %d is invalid!",
__LINE__, *path_count);
*err_no = EINVAL;
return NULL;
}
store_paths = (char **)malloc(sizeof(char *) * (*path_count));
bytes = sizeof(FDFSStorePathInfo) * (*path_count);
store_paths = (FDFSStorePathInfo *)malloc(bytes);
if (store_paths == NULL)
{
logError("file: "__FILE__", line: %d, " \
"malloc %d bytes fail, " \
"errno: %d, error info: %s", \
__LINE__, (int)sizeof(char *) * (*path_count), \
errno, STRERROR(errno));
logError("file: "__FILE__", line: %d, "
"malloc %d bytes fail, "
"errno: %d, error info: %s", __LINE__,
bytes, errno, STRERROR(errno));
*err_no = errno != 0 ? errno : ENOMEM;
return NULL;
}
memset(store_paths, 0, sizeof(char *) * (*path_count));
memset(store_paths, 0, bytes);
pPath = iniGetStrValue(szSectionName, "store_path0", pItemContext);
if (pPath == NULL)
{
if (!bUseBasePath)
{
logError("file: "__FILE__", line: %d, " \
"conf file must have item " \
logError("file: "__FILE__", line: %d, "
"conf file must have item "
"\"store_path0\"!", __LINE__);
*err_no = ENOENT;
free(store_paths);
@ -80,13 +81,15 @@ char **storage_load_paths_from_conf_file_ex(IniContext *pItemContext, \
pPath = g_fdfs_base_path;
}
store_paths[0] = strdup(pPath);
if (store_paths[0] == NULL)
store_paths[0].path_len = strlen(pPath);
store_paths[0].path = strdup(pPath);
if (store_paths[0].path == NULL)
{
logError("file: "__FILE__", line: %d, " \
"malloc %d bytes fail, " \
"errno: %d, error info: %s", \
__LINE__, (int)strlen(pPath), \
logError("file: "__FILE__", line: %d, "
"malloc %d bytes fail, "
"errno: %d, error info: %s",
__LINE__, (int)strlen(pPath),
errno, STRERROR(errno));
*err_no = errno != 0 ? errno : ENOMEM;
free(store_paths);
@ -97,12 +100,12 @@ char **storage_load_paths_from_conf_file_ex(IniContext *pItemContext, \
for (i=1; i<*path_count; i++)
{
sprintf(item_name, "store_path%d", i);
pPath = iniGetStrValue(szSectionName, item_name, \
pPath = iniGetStrValue(szSectionName, item_name,
pItemContext);
if (pPath == NULL)
{
logError("file: "__FILE__", line: %d, " \
"conf file must have item \"%s\"!", \
logError("file: "__FILE__", line: %d, "
"conf file must have item \"%s\"!",
__LINE__, item_name);
*err_no = ENOENT;
break;
@ -111,24 +114,25 @@ char **storage_load_paths_from_conf_file_ex(IniContext *pItemContext, \
chopPath(pPath);
if (!fileExists(pPath))
{
logError("file: "__FILE__", line: %d, " \
"\"%s\" can't be accessed, " \
"errno: %d, error info: %s", __LINE__, \
logError("file: "__FILE__", line: %d, "
"\"%s\" can't be accessed, "
"errno: %d, error info: %s", __LINE__,
pPath, errno, STRERROR(errno));
*err_no = errno != 0 ? errno : ENOENT;
break;
}
if (!isDir(pPath))
{
logError("file: "__FILE__", line: %d, " \
"\"%s\" is not a directory!", \
logError("file: "__FILE__", line: %d, "
"\"%s\" is not a directory!",
__LINE__, pPath);
*err_no = ENOTDIR;
break;
}
store_paths[i] = strdup(pPath);
if (store_paths[i] == NULL)
store_paths[i].path_len = strlen(pPath);
store_paths[i].path = strdup(pPath);
if (store_paths[i].path == NULL)
{
logError("file: "__FILE__", line: %d, " \
"malloc %d bytes fail, " \
@ -143,9 +147,9 @@ char **storage_load_paths_from_conf_file_ex(IniContext *pItemContext, \
{
for (i=0; i<*path_count; i++)
{
if (store_paths[i] != NULL)
if (store_paths[i].path != NULL)
{
free(store_paths[i]);
free(store_paths[i].path);
}
}
free(store_paths);
@ -163,7 +167,7 @@ int storage_load_paths_from_conf_file(IniContext *pItemContext)
pPath = iniGetStrValue(NULL, "base_path", pItemContext);
if (pPath == NULL)
{
logError("file: "__FILE__", line: %d, " \
logError("file: "__FILE__", line: %d, "
"conf file must have item \"base_path\"!", __LINE__);
return ENOENT;
}
@ -172,20 +176,20 @@ int storage_load_paths_from_conf_file(IniContext *pItemContext)
chopPath(g_fdfs_base_path);
if (!fileExists(g_fdfs_base_path))
{
logError("file: "__FILE__", line: %d, " \
"\"%s\" can't be accessed, error info: %s", \
logError("file: "__FILE__", line: %d, "
"\"%s\" can't be accessed, error info: %s",
__LINE__, STRERROR(errno), g_fdfs_base_path);
return errno != 0 ? errno : ENOENT;
}
if (!isDir(g_fdfs_base_path))
{
logError("file: "__FILE__", line: %d, " \
"\"%s\" is not a directory!", \
logError("file: "__FILE__", line: %d, "
"\"%s\" is not a directory!",
__LINE__, g_fdfs_base_path);
return ENOTDIR;
}
g_fdfs_store_paths.paths = storage_load_paths_from_conf_file_ex( \
g_fdfs_store_paths.paths = storage_load_paths_from_conf_file_ex(
pItemContext, NULL, true, &g_fdfs_store_paths.count, &result);
return result;
@ -259,7 +263,7 @@ int storage_split_filename(const char *logic_filename, \
SPLIT_FILENAME_BODY(logic_filename, filename_len, true_filename, \
store_path_index, true);
*ppStorePath = g_fdfs_store_paths.paths[store_path_index];
*ppStorePath = g_fdfs_store_paths.paths[store_path_index].path;
return 0;
}
@ -325,7 +329,7 @@ char *trunk_get_full_filename_ex(const FDFSStorePaths *pStorePaths, \
char short_filename[64];
char *pStorePath;
pStorePath = pStorePaths->paths[pTrunkInfo->path.store_path_index];
pStorePath = pStorePaths->paths[pTrunkInfo->path.store_path_index].path;
TRUNK_GET_FILENAME(pTrunkInfo->file.id, short_filename);
snprintf(full_filename, buff_size, \
@ -547,7 +551,7 @@ int trunk_file_do_lstat_func_ex(const FDFSStorePaths *pStorePaths, \
if (filename_len != FDFS_TRUNK_FILENAME_LENGTH) //not trunk file
{
snprintf(full_filename, sizeof(full_filename), "%s/data/%s", \
pStorePaths->paths[store_path_index], true_filename);
pStorePaths->paths[store_path_index].path, true_filename);
if (stat_func == FDFS_STAT_FUNC_STAT)
{
@ -576,7 +580,7 @@ int trunk_file_do_lstat_func_ex(const FDFSStorePaths *pStorePaths, \
if (!IS_TRUNK_FILE(file_size)) //slave file
{
snprintf(full_filename, sizeof(full_filename), "%s/data/%s", \
pStorePaths->paths[store_path_index], true_filename);
pStorePaths->paths[store_path_index].path, true_filename);
if (stat_func == FDFS_STAT_FUNC_STAT)
{

View File

@ -48,6 +48,20 @@
#define TRUNK_GET_FILENAME(file_id, filename) \
sprintf(filename, "%06d", file_id)
typedef struct
{
int total_mb; //total spaces
int free_mb; //free spaces
int path_len; //the length of store path
char *path; //file store path
char *mark; //path mark to avoid confusion
} FDFSStorePathInfo;
typedef struct {
int count; //store path count
FDFSStorePathInfo *paths; //file store paths
} FDFSStorePaths;
#ifdef __cplusplus
extern "C" {
#endif
@ -84,9 +98,9 @@ typedef struct tagFDFSTrunkFullInfo {
FDFSTrunkFileInfo file;
} FDFSTrunkFullInfo;
char **storage_load_paths_from_conf_file_ex(IniContext *pItemContext, \
const char *szSectionName, const bool bUseBasePath, \
int *path_count, int *err_no);
FDFSStorePathInfo *storage_load_paths_from_conf_file_ex(
IniContext *pItemContext, const char *szSectionName,
const bool bUseBasePath, int *path_count, int *err_no);
int storage_load_paths_from_conf_file(IniContext *pItemContext);
void trunk_shared_init();

View File

@ -464,11 +464,6 @@ typedef struct {
} rs;
} FDFSStorageReservedSpace;
typedef struct {
int count; //store path count
char **paths; //file store paths
} FDFSStorePaths;
typedef struct {
TrackerServerInfo *pTrackerServer;
int running_time; //running seconds, more means higher weight