From 09491325cc6be55604efcddb79fc449ba70535fb Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Fri, 25 Nov 2022 15:38:44 +0800 Subject: [PATCH] bugfixed: clear task extra data correctly when the connection broken --- HISTORY | 3 + INSTALL | 6 +- client/fdfs_appender_test.c | 6 +- client/fdfs_appender_test1.c | 6 +- client/fdfs_test.c | 6 +- client/fdfs_test1.c | 6 +- client/test/Makefile.in | 2 +- client/test/fdfs_monitor.c | 597 +-------------------------- client/test/fdfs_test.c | 692 +------------------------------- client/test/fdfs_test1.c | 659 +----------------------------- common/fdfs_global.c | 2 +- php_client/fastdfs_client.c | 9 +- storage/storage_dio.c | 13 +- storage/storage_dump.c | 4 +- storage/storage_func.c | 4 +- storage/storage_service.c | 9 +- storage/storage_service.h | 25 +- storage/tracker_client_thread.c | 5 +- tracker/tracker_dump.c | 4 +- tracker/tracker_func.c | 4 +- 20 files changed, 71 insertions(+), 1991 deletions(-) mode change 100644 => 120000 client/test/fdfs_monitor.c mode change 100644 => 120000 client/test/fdfs_test.c mode change 100644 => 120000 client/test/fdfs_test1.c diff --git a/HISTORY b/HISTORY index fc82f1a..91f548f 100644 --- a/HISTORY +++ b/HISTORY @@ -1,4 +1,7 @@ +Version 6.9.1 2022-11-25 + * bugfixed: clear task extra data correctly when the connection broken + Version 6.09 2022-09-14 * use libfastcommon V1.60 and libserverframe 1.1.19 * use atomic counter instead of mutex lock diff --git a/INSTALL b/INSTALL index 0a73035..9e9f48e 100644 --- a/INSTALL +++ b/INSTALL @@ -11,7 +11,7 @@ Chinese language: http://www.fastken.com/ # command lines as: git clone https://github.com/happyfish100/libfastcommon.git - cd libfastcommon; git checkout V1.0.60 + cd libfastcommon; git checkout V1.0.64 ./make.sh clean && ./make.sh && ./make.sh install @@ -21,7 +21,7 @@ Chinese language: http://www.fastken.com/ # command lines as: git clone https://github.com/happyfish100/libserverframe.git - cd libserverframe; git checkout V1.1.18 + cd libserverframe; git checkout V1.1.23 ./make.sh clean && ./make.sh && ./make.sh install # step 3. download fastdfs source codes and install it, @@ -30,7 +30,7 @@ Chinese language: http://www.fastken.com/ # command lines as: git clone https://github.com/happyfish100/fastdfs.git - cd fastdfs; git checkout V6.09 + cd fastdfs; git checkout V6.9.1 ./make.sh clean && ./make.sh && ./make.sh install diff --git a/client/fdfs_appender_test.c b/client/fdfs_appender_test.c index 122aecb..69e7f8c 100644 --- a/client/fdfs_appender_test.c +++ b/client/fdfs_appender_test.c @@ -79,13 +79,13 @@ int main(int argc, char *argv[]) const char *file_ext_name; struct stat stat_buf; - printf("This is FastDFS client test program v%d.%02d\n" \ + printf("This is FastDFS client test program v%d.%d.%d\n" \ "\nCopyright (C) 2008, Happy Fish / YuQing\n" \ "\nFastDFS may be copied only under the terms of the GNU General\n" \ "Public License V3, which may be found in the FastDFS source kit.\n" \ "Please visit the FastDFS Home Page http://www.fastken.com/ \n" \ -"for more detail.\n\n" \ -, g_fdfs_version.major, g_fdfs_version.minor); +"for more detail.\n\n", g_fdfs_version.major, g_fdfs_version.minor, +g_fdfs_version.patch); if (argc < 3) { diff --git a/client/fdfs_appender_test1.c b/client/fdfs_appender_test1.c index b6d883b..41fd64e 100644 --- a/client/fdfs_appender_test1.c +++ b/client/fdfs_appender_test1.c @@ -78,13 +78,13 @@ int main(int argc, char *argv[]) const char *file_ext_name; struct stat stat_buf; - printf("This is FastDFS client test program v%d.%02d\n" \ + printf("This is FastDFS client test program v%d.%d.%d\n" \ "\nCopyright (C) 2008, Happy Fish / YuQing\n" \ "\nFastDFS may be copied only under the terms of the GNU General\n" \ "Public License V3, which may be found in the FastDFS source kit.\n" \ "Please visit the FastDFS Home Page http://www.fastken.com/ \n" \ -"for more detail.\n\n" \ -, g_fdfs_version.major, g_fdfs_version.minor); +"for more detail.\n\n", g_fdfs_version.major, g_fdfs_version.minor, +g_fdfs_version.patch); if (argc < 3) { diff --git a/client/fdfs_test.c b/client/fdfs_test.c index 0f902bd..f49b835 100644 --- a/client/fdfs_test.c +++ b/client/fdfs_test.c @@ -80,13 +80,13 @@ int main(int argc, char *argv[]) int store_path_index; FDFSFileInfo file_info; - printf("This is FastDFS client test program v%d.%02d\n" \ + printf("This is FastDFS client test program v%d.%d.%d\n" \ "\nCopyright (C) 2008, Happy Fish / YuQing\n" \ "\nFastDFS may be copied only under the terms of the GNU General\n" \ "Public License V3, which may be found in the FastDFS source kit.\n" \ "Please visit the FastDFS Home Page http://www.fastken.com/ \n" \ -"for more detail.\n\n" \ -, g_fdfs_version.major, g_fdfs_version.minor); +"for more detail.\n\n", g_fdfs_version.major, g_fdfs_version.minor, +g_fdfs_version.patch); if (argc < 3) { diff --git a/client/fdfs_test1.c b/client/fdfs_test1.c index 633bfc0..c915793 100644 --- a/client/fdfs_test1.c +++ b/client/fdfs_test1.c @@ -78,13 +78,13 @@ int main(int argc, char *argv[]) int store_path_index; FDFSFileInfo file_info; - printf("This is FastDFS client test program v%d.%02d\n" \ + printf("This is FastDFS client test program v%d.%d.%d\n" \ "\nCopyright (C) 2008, Happy Fish / YuQing\n" \ "\nFastDFS may be copied only under the terms of the GNU General\n" \ "Public License V3, which may be found in the FastDFS source kit.\n" \ "Please visit the FastDFS Home Page http://www.fastken.com/ \n" \ -"for more detail.\n\n" \ -, g_fdfs_version.major, g_fdfs_version.minor); +"for more detail.\n\n", g_fdfs_version.major, g_fdfs_version.minor, +g_fdfs_version.patch); if (argc < 3) { diff --git a/client/test/Makefile.in b/client/test/Makefile.in index 4a5a55e..e0f90dd 100644 --- a/client/test/Makefile.in +++ b/client/test/Makefile.in @@ -3,7 +3,7 @@ COMPILE = $(CC) $(CFLAGS) INC_PATH = -I/usr/include/fastcommon -I/usr/include/fastdfs \ -I/usr/local/include/fastcommon -I/usr/local/include/fastdfs -LIB_PATH = -L/usr/local/lib -lfastcommon -lfdfsclient $(LIBS) +LIB_PATH = -L/usr/local/lib -lfastcommon -lserverframe -lfdfsclient $(LIBS) TARGET_PATH = $(TARGET_PATH) ALL_OBJS = diff --git a/client/test/fdfs_monitor.c b/client/test/fdfs_monitor.c deleted file mode 100644 index 742cf56..0000000 --- a/client/test/fdfs_monitor.c +++ /dev/null @@ -1,596 +0,0 @@ -/** -* Copyright (C) 2008 Happy Fish / YuQing -* -* FastDFS may be copied only under the terms of the GNU General -* Public License V3, which may be found in the FastDFS source kit. -* Please visit the FastDFS Home Page http://www.fastken.com/ for more detail. -**/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "fastcommon/sockopt.h" -#include "fastcommon/logger.h" -#include "client_global.h" -#include "fdfs_global.h" -#include "fdfs_client.h" - -static ConnectionInfo *pTrackerServer; - -static int list_all_groups(const char *group_name); - -static void usage(char *argv[]) -{ - printf("Usage: %s [-h ] " - "[list|delete|set_trunk_server [storage_id]]\n" - "\tthe tracker server format: host[:port], " - "the tracker default port is %d\n\n", - argv[0], FDFS_TRACKER_SERVER_DEF_PORT); -} - -int main(int argc, char *argv[]) -{ - char *conf_filename; - int result; - char *op_type; - char *tracker_server; - int arg_index; - char *group_name; - - if (argc < 2) - { - usage(argv); - return 1; - } - - tracker_server = NULL; - conf_filename = argv[1]; - arg_index = 2; - - if (arg_index >= argc) - { - op_type = "list"; - } - else - { - int len; - - len = strlen(argv[arg_index]); - if (len >= 2 && strncmp(argv[arg_index], "-h", 2) == 0) - { - if (len == 2) - { - arg_index++; - if (arg_index >= argc) - { - usage(argv); - return 1; - } - - tracker_server = argv[arg_index++]; - } - else - { - tracker_server = argv[arg_index] + 2; - arg_index++; - } - - if (arg_index < argc) - { - op_type = argv[arg_index++]; - } - else - { - op_type = "list"; - } - } - else - { - op_type = argv[arg_index++]; - } - } - - log_init(); - g_log_context.log_level = LOG_DEBUG; - ignore_signal_pipe(); - - if ((result=fdfs_client_init(conf_filename)) != 0) - { - return result; - } - load_log_level_ex(conf_filename); - - if (tracker_server == NULL) - { - if (g_tracker_group.server_count > 1) - { - srand(time(NULL)); - rand(); //discard the first - g_tracker_group.server_index = (int)( \ - (g_tracker_group.server_count * (double)rand()) \ - / (double)RAND_MAX); - } - } - else - { - int i; - ConnectionInfo conn; - - if ((result=conn_pool_parse_server_info(tracker_server, &conn, - FDFS_TRACKER_SERVER_DEF_PORT)) != 0) - { - printf("resolve ip address of tracker server: %s " - "fail!, error info: %s\n", tracker_server, hstrerror(h_errno)); - return result; - } - - for (i=0; iip_addr, pTrackerServer->port); - - if (arg_index < argc) - { - group_name = argv[arg_index++]; - } - else - { - group_name = NULL; - } - - if (strcmp(op_type, "list") == 0) - { - if (group_name == NULL) - { - result = list_all_groups(NULL); - } - else - { - result = list_all_groups(group_name); - } - } - else if (strcmp(op_type, "delete") == 0) - { - if (arg_index >= argc) - { - if ((result=tracker_delete_group(&g_tracker_group, \ - group_name)) == 0) - { - printf("delete group: %s success\n", \ - group_name); - } - else - { - printf("delete group: %s fail, " \ - "error no: %d, error info: %s\n", \ - group_name, result, STRERROR(result)); - } - } - else - { - char *storage_id; - - storage_id = argv[arg_index++]; - if ((result=tracker_delete_storage(&g_tracker_group, \ - group_name, storage_id)) == 0) - { - printf("delete storage server %s::%s success\n", \ - group_name, storage_id); - } - else - { - printf("delete storage server %s::%s fail, " \ - "error no: %d, error info: %s\n", \ - group_name, storage_id, \ - result, STRERROR(result)); - } - } - } - else if (strcmp(op_type, "set_trunk_server") == 0) - { - char *storage_id; - char new_trunk_server_id[FDFS_STORAGE_ID_MAX_SIZE]; - - if (group_name == NULL) - { - usage(argv); - return 1; - } - if (arg_index >= argc) - { - storage_id = ""; - } - else - { - storage_id = argv[arg_index++]; - } - - if ((result=tracker_set_trunk_server(&g_tracker_group, \ - group_name, storage_id, new_trunk_server_id)) == 0) - { - printf("set trunk server %s::%s success, " \ - "new trunk server: %s\n", group_name, \ - storage_id, new_trunk_server_id); - } - else - { - printf("set trunk server %s::%s fail, " \ - "error no: %d, error info: %s\n", \ - group_name, storage_id, \ - result, STRERROR(result)); - } - } - else - { - printf("Invalid command %s\n\n", op_type); - usage(argv); - } - - tracker_close_connection_ex(pTrackerServer, true); - fdfs_client_destroy(); - return 0; -} - -static int list_storages(FDFSGroupStat *pGroupStat) -{ - int result; - int storage_count; - FDFSStorageInfo storage_infos[FDFS_MAX_SERVERS_EACH_GROUP]; - FDFSStorageInfo *p; - FDFSStorageInfo *pStorage; - FDFSStorageInfo *pStorageEnd; - FDFSStorageStat *pStorageStat; - char szJoinTime[32]; - char szUpTime[32]; - char szLastHeartBeatTime[32]; - char szSrcUpdTime[32]; - char szSyncUpdTime[32]; - char szSyncedTimestamp[32]; - char szSyncedDelaySeconds[128]; - char szHostname[128]; - char szHostnamePrompt[128+8]; - int k; - int max_last_source_update; - - printf( "group name = %s\n" \ - "disk total space = %"PRId64" MB\n" \ - "disk free space = %"PRId64" MB\n" \ - "trunk free space = %"PRId64" MB\n" \ - "storage server count = %d\n" \ - "active server count = %d\n" \ - "storage server port = %d\n" \ - "storage HTTP port = %d\n" \ - "store path count = %d\n" \ - "subdir count per path = %d\n" \ - "current write server index = %d\n" \ - "current trunk file id = %d\n\n", \ - pGroupStat->group_name, \ - pGroupStat->total_mb, \ - pGroupStat->free_mb, \ - pGroupStat->trunk_free_mb, \ - pGroupStat->count, \ - pGroupStat->active_count, \ - pGroupStat->storage_port, \ - pGroupStat->storage_http_port, \ - pGroupStat->store_path_count, \ - pGroupStat->subdir_count_per_path, \ - pGroupStat->current_write_server, \ - pGroupStat->current_trunk_file_id - ); - - result = tracker_list_servers(pTrackerServer, \ - pGroupStat->group_name, NULL, \ - storage_infos, FDFS_MAX_SERVERS_EACH_GROUP, \ - &storage_count); - if (result != 0) - { - return result; - } - - k = 0; - pStorageEnd = storage_infos + storage_count; - for (pStorage=storage_infos; pStoragestat.last_source_update - > max_last_source_update) - { - max_last_source_update = \ - p->stat.last_source_update; - } - } - - pStorageStat = &(pStorage->stat); - if (max_last_source_update == 0) - { - *szSyncedDelaySeconds = '\0'; - } - else - { - if (pStorageStat->last_synced_timestamp == 0) - { - strcpy(szSyncedDelaySeconds, "(never synced)"); - } - else - { - int delay_seconds; - int remain_seconds; - int day; - int hour; - int minute; - int second; - char szDelayTime[64]; - - delay_seconds = (int)(max_last_source_update - - pStorageStat->last_synced_timestamp); - if (delay_seconds < 0) - { - delay_seconds = 0; - } - day = delay_seconds / (24 * 3600); - remain_seconds = delay_seconds % (24 * 3600); - hour = remain_seconds / 3600; - remain_seconds %= 3600; - minute = remain_seconds / 60; - second = remain_seconds % 60; - - if (day != 0) - { - sprintf(szDelayTime, "%d days " \ - "%02dh:%02dm:%02ds", \ - day, hour, minute, second); - } - else if (hour != 0) - { - sprintf(szDelayTime, "%02dh:%02dm:%02ds", \ - hour, minute, second); - } - else if (minute != 0) - { - sprintf(szDelayTime, "%02dm:%02ds", minute, second); - } - else - { - sprintf(szDelayTime, "%ds", second); - } - - sprintf(szSyncedDelaySeconds, "(%s delay)", szDelayTime); - } - } - - getHostnameByIp(pStorage->ip_addr, szHostname, sizeof(szHostname)); - if (*szHostname != '\0') - { - sprintf(szHostnamePrompt, " (%s)", szHostname); - } - else - { - *szHostnamePrompt = '\0'; - } - - if (pStorage->up_time != 0) - { - formatDatetime(pStorage->up_time, \ - "%Y-%m-%d %H:%M:%S", \ - szUpTime, sizeof(szUpTime)); - } - else - { - *szUpTime = '\0'; - } - - printf( "\tStorage %d:\n" \ - "\t\tid = %s\n" \ - "\t\tip_addr = %s%s %s\n" \ - "\t\thttp domain = %s\n" \ - "\t\tversion = %s\n" \ - "\t\tjoin time = %s\n" \ - "\t\tup time = %s\n" \ - "\t\ttotal storage = %d MB\n" \ - "\t\tfree storage = %d MB\n" \ - "\t\tupload priority = %d\n" \ - "\t\tstore_path_count = %d\n" \ - "\t\tsubdir_count_per_path = %d\n" \ - "\t\tstorage_port = %d\n" \ - "\t\tstorage_http_port = %d\n" \ - "\t\tcurrent_write_path = %d\n" \ - "\t\tsource storage id = %s\n" \ - "\t\tif_trunk_server = %d\n" \ - "\t\tconnection.alloc_count = %d\n" \ - "\t\tconnection.current_count = %d\n" \ - "\t\tconnection.max_count = %d\n" \ - "\t\ttotal_upload_count = %"PRId64"\n" \ - "\t\tsuccess_upload_count = %"PRId64"\n" \ - "\t\ttotal_append_count = %"PRId64"\n" \ - "\t\tsuccess_append_count = %"PRId64"\n" \ - "\t\ttotal_modify_count = %"PRId64"\n" \ - "\t\tsuccess_modify_count = %"PRId64"\n" \ - "\t\ttotal_truncate_count = %"PRId64"\n" \ - "\t\tsuccess_truncate_count = %"PRId64"\n" \ - "\t\ttotal_set_meta_count = %"PRId64"\n" \ - "\t\tsuccess_set_meta_count = %"PRId64"\n" \ - "\t\ttotal_delete_count = %"PRId64"\n" \ - "\t\tsuccess_delete_count = %"PRId64"\n" \ - "\t\ttotal_download_count = %"PRId64"\n" \ - "\t\tsuccess_download_count = %"PRId64"\n" \ - "\t\ttotal_get_meta_count = %"PRId64"\n" \ - "\t\tsuccess_get_meta_count = %"PRId64"\n" \ - "\t\ttotal_create_link_count = %"PRId64"\n" \ - "\t\tsuccess_create_link_count = %"PRId64"\n"\ - "\t\ttotal_delete_link_count = %"PRId64"\n" \ - "\t\tsuccess_delete_link_count = %"PRId64"\n" \ - "\t\ttotal_upload_bytes = %"PRId64"\n" \ - "\t\tsuccess_upload_bytes = %"PRId64"\n" \ - "\t\ttotal_append_bytes = %"PRId64"\n" \ - "\t\tsuccess_append_bytes = %"PRId64"\n" \ - "\t\ttotal_modify_bytes = %"PRId64"\n" \ - "\t\tsuccess_modify_bytes = %"PRId64"\n" \ - "\t\tstotal_download_bytes = %"PRId64"\n" \ - "\t\tsuccess_download_bytes = %"PRId64"\n" \ - "\t\ttotal_sync_in_bytes = %"PRId64"\n" \ - "\t\tsuccess_sync_in_bytes = %"PRId64"\n" \ - "\t\ttotal_sync_out_bytes = %"PRId64"\n" \ - "\t\tsuccess_sync_out_bytes = %"PRId64"\n" \ - "\t\ttotal_file_open_count = %"PRId64"\n" \ - "\t\tsuccess_file_open_count = %"PRId64"\n" \ - "\t\ttotal_file_read_count = %"PRId64"\n" \ - "\t\tsuccess_file_read_count = %"PRId64"\n" \ - "\t\ttotal_file_write_count = %"PRId64"\n" \ - "\t\tsuccess_file_write_count = %"PRId64"\n" \ - "\t\tlast_heart_beat_time = %s\n" \ - "\t\tlast_source_update = %s\n" \ - "\t\tlast_sync_update = %s\n" \ - "\t\tlast_synced_timestamp = %s %s\n", \ - ++k, pStorage->id, pStorage->ip_addr, \ - szHostnamePrompt, get_storage_status_caption( \ - pStorage->status), pStorage->domain_name, \ - pStorage->version, \ - formatDatetime(pStorage->join_time, \ - "%Y-%m-%d %H:%M:%S", \ - szJoinTime, sizeof(szJoinTime)), \ - szUpTime, pStorage->total_mb, \ - pStorage->free_mb, \ - pStorage->upload_priority, \ - pStorage->store_path_count, \ - pStorage->subdir_count_per_path, \ - pStorage->storage_port, \ - pStorage->storage_http_port, \ - pStorage->current_write_path, \ - pStorage->src_id, \ - pStorage->if_trunk_server, \ - pStorageStat->connection.alloc_count, \ - pStorageStat->connection.current_count, \ - pStorageStat->connection.max_count, \ - pStorageStat->total_upload_count, \ - pStorageStat->success_upload_count, \ - pStorageStat->total_append_count, \ - pStorageStat->success_append_count, \ - pStorageStat->total_modify_count, \ - pStorageStat->success_modify_count, \ - pStorageStat->total_truncate_count, \ - pStorageStat->success_truncate_count, \ - pStorageStat->total_set_meta_count, \ - pStorageStat->success_set_meta_count, \ - pStorageStat->total_delete_count, \ - pStorageStat->success_delete_count, \ - pStorageStat->total_download_count, \ - pStorageStat->success_download_count, \ - pStorageStat->total_get_meta_count, \ - pStorageStat->success_get_meta_count, \ - pStorageStat->total_create_link_count, \ - pStorageStat->success_create_link_count, \ - pStorageStat->total_delete_link_count, \ - pStorageStat->success_delete_link_count, \ - pStorageStat->total_upload_bytes, \ - pStorageStat->success_upload_bytes, \ - pStorageStat->total_append_bytes, \ - pStorageStat->success_append_bytes, \ - pStorageStat->total_modify_bytes, \ - pStorageStat->success_modify_bytes, \ - pStorageStat->total_download_bytes, \ - pStorageStat->success_download_bytes, \ - pStorageStat->total_sync_in_bytes, \ - pStorageStat->success_sync_in_bytes, \ - pStorageStat->total_sync_out_bytes, \ - pStorageStat->success_sync_out_bytes, \ - pStorageStat->total_file_open_count, \ - pStorageStat->success_file_open_count, \ - pStorageStat->total_file_read_count, \ - pStorageStat->success_file_read_count, \ - pStorageStat->total_file_write_count, \ - pStorageStat->success_file_write_count, \ - formatDatetime(pStorageStat->last_heart_beat_time, \ - "%Y-%m-%d %H:%M:%S", \ - szLastHeartBeatTime, sizeof(szLastHeartBeatTime)), \ - formatDatetime(pStorageStat->last_source_update, \ - "%Y-%m-%d %H:%M:%S", \ - szSrcUpdTime, sizeof(szSrcUpdTime)), \ - formatDatetime(pStorageStat->last_sync_update, \ - "%Y-%m-%d %H:%M:%S", \ - szSyncUpdTime, sizeof(szSyncUpdTime)), \ - formatDatetime(pStorageStat->last_synced_timestamp, \ - "%Y-%m-%d %H:%M:%S", \ - szSyncedTimestamp, sizeof(szSyncedTimestamp)),\ - szSyncedDelaySeconds); - } - - return 0; -} - -static int list_all_groups(const char *group_name) -{ - int result; - int group_count; - FDFSGroupStat group_stats[FDFS_MAX_GROUPS]; - FDFSGroupStat *pGroupStat; - FDFSGroupStat *pGroupEnd; - int i; - - result = tracker_list_groups(pTrackerServer, \ - group_stats, FDFS_MAX_GROUPS, \ - &group_count); - if (result != 0) - { - tracker_close_all_connections(); - fdfs_client_destroy(); - return result; - } - - pGroupEnd = group_stats + group_count; - if (group_name == NULL) - { - printf("group count: %d\n", group_count); - i = 0; - for (pGroupStat=group_stats; pGroupStatgroup_name, group_name) == 0) - { - list_storages(pGroupStat); - break; - } - } - } - - return 0; -} - diff --git a/client/test/fdfs_monitor.c b/client/test/fdfs_monitor.c new file mode 120000 index 0000000..9f42ff4 --- /dev/null +++ b/client/test/fdfs_monitor.c @@ -0,0 +1 @@ +../fdfs_monitor.c \ No newline at end of file diff --git a/client/test/fdfs_test.c b/client/test/fdfs_test.c deleted file mode 100644 index 0f902bd..0000000 --- a/client/test/fdfs_test.c +++ /dev/null @@ -1,691 +0,0 @@ -/** -* Copyright (C) 2008 Happy Fish / YuQing -* -* FastDFS may be copied only under the terms of the GNU General -* Public License V3, which may be found in the FastDFS source kit. -* Please visit the FastDFS Home Page http://www.fastken.com/ for more detail. -**/ - -#include -#include -#include -#include -#include -#include -#include -#include "fdfs_client.h" -#include "fdfs_global.h" -#include "fastcommon/base64.h" -#include "fastcommon/sockopt.h" -#include "fastcommon/logger.h" -#include "fdfs_http_shared.h" - -int writeToFileCallback(void *arg, const int64_t file_size, const char *data, \ - const int current_size) -{ - if (arg == NULL) - { - return EINVAL; - } - - if (fwrite(data, current_size, 1, (FILE *)arg) != 1) - { - return errno != 0 ? errno : EIO; - } - - return 0; -} - -int uploadFileCallback(void *arg, const int64_t file_size, int sock) -{ - int64_t total_send_bytes; - char *filename; - - if (arg == NULL) - { - return EINVAL; - } - - filename = (char *)arg; - return tcpsendfile(sock, filename, file_size, \ - SF_G_NETWORK_TIMEOUT, &total_send_bytes); -} - -int main(int argc, char *argv[]) -{ - char *conf_filename; - char *local_filename; - ConnectionInfo *pTrackerServer; - ConnectionInfo *pStorageServer; - int result; - ConnectionInfo storageServer; - char group_name[FDFS_GROUP_NAME_MAX_LEN + 1]; - char remote_filename[256]; - char master_filename[256]; - FDFSMetaData meta_list[32]; - int meta_count; - int i; - FDFSMetaData *pMetaList; - char token[32 + 1]; - char file_id[128]; - char file_url[256]; - char szDatetime[20]; - char szPortPart[16]; - int url_len; - time_t ts; - char *file_buff; - int64_t file_size; - char *operation; - char *meta_buff; - int store_path_index; - FDFSFileInfo file_info; - - printf("This is FastDFS client test program v%d.%02d\n" \ -"\nCopyright (C) 2008, Happy Fish / YuQing\n" \ -"\nFastDFS may be copied only under the terms of the GNU General\n" \ -"Public License V3, which may be found in the FastDFS source kit.\n" \ -"Please visit the FastDFS Home Page http://www.fastken.com/ \n" \ -"for more detail.\n\n" \ -, g_fdfs_version.major, g_fdfs_version.minor); - - if (argc < 3) - { - printf("Usage: %s \n" \ - "\toperation: upload, download, getmeta, setmeta, " \ - "delete and query_servers\n", argv[0]); - return 1; - } - - log_init(); - g_log_context.log_level = LOG_DEBUG; - - conf_filename = argv[1]; - operation = argv[2]; - if ((result=fdfs_client_init(conf_filename)) != 0) - { - return result; - } - - pTrackerServer = tracker_get_connection(); - if (pTrackerServer == NULL) - { - fdfs_client_destroy(); - return errno != 0 ? errno : ECONNREFUSED; - } - - pStorageServer = NULL; - *group_name = '\0'; - local_filename = NULL; - if (strcmp(operation, "upload") == 0) - { - int upload_type; - char *prefix_name; - const char *file_ext_name; - char slave_filename[256]; - int slave_filename_len; - - if (argc < 4) - { - printf("Usage: %s upload " \ - " [FILE | BUFF | CALLBACK] \n",\ - argv[0]); - fdfs_client_destroy(); - return EINVAL; - } - - local_filename = argv[3]; - if (argc == 4) - { - upload_type = FDFS_UPLOAD_BY_FILE; - } - else - { - if (strcmp(argv[4], "BUFF") == 0) - { - upload_type = FDFS_UPLOAD_BY_BUFF; - } - else if (strcmp(argv[4], "CALLBACK") == 0) - { - upload_type = FDFS_UPLOAD_BY_CALLBACK; - } - else - { - upload_type = FDFS_UPLOAD_BY_FILE; - } - } - - store_path_index = 0; - - { - ConnectionInfo storageServers[FDFS_MAX_SERVERS_EACH_GROUP]; - ConnectionInfo *pServer; - ConnectionInfo *pServerEnd; - int storage_count; - - if ((result=tracker_query_storage_store_list_without_group( \ - pTrackerServer, storageServers, \ - FDFS_MAX_SERVERS_EACH_GROUP, &storage_count, \ - group_name, &store_path_index)) == 0) - { - printf("tracker_query_storage_store_list_without_group: \n"); - pServerEnd = storageServers + storage_count; - for (pServer=storageServers; pServerip_addr, pServer->port); - } - printf("\n"); - } - } - - if ((result=tracker_query_storage_store(pTrackerServer, \ - &storageServer, group_name, &store_path_index)) != 0) - { - fdfs_client_destroy(); - printf("tracker_query_storage fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - return result; - } - - printf("group_name=%s, ip_addr=%s, port=%d\n", \ - group_name, storageServer.ip_addr, \ - storageServer.port); - - if ((pStorageServer=tracker_make_connection(&storageServer, \ - &result)) == NULL) - { - fdfs_client_destroy(); - return result; - } - - memset(&meta_list, 0, sizeof(meta_list)); - meta_count = 0; - strcpy(meta_list[meta_count].name, "ext_name"); - strcpy(meta_list[meta_count].value, "jpg"); - meta_count++; - strcpy(meta_list[meta_count].name, "width"); - strcpy(meta_list[meta_count].value, "160"); - meta_count++; - strcpy(meta_list[meta_count].name, "height"); - strcpy(meta_list[meta_count].value, "80"); - meta_count++; - strcpy(meta_list[meta_count].name, "file_size"); - strcpy(meta_list[meta_count].value, "115120"); - meta_count++; - - file_ext_name = fdfs_get_file_ext_name(local_filename); - *group_name = '\0'; - - if (upload_type == FDFS_UPLOAD_BY_FILE) - { - result = storage_upload_by_filename(pTrackerServer, \ - pStorageServer, store_path_index, \ - local_filename, file_ext_name, \ - meta_list, meta_count, \ - group_name, remote_filename); - - printf("storage_upload_by_filename\n"); - } - else if (upload_type == FDFS_UPLOAD_BY_BUFF) - { - char *file_content; - if ((result=getFileContent(local_filename, \ - &file_content, &file_size)) == 0) - { - result = storage_upload_by_filebuff(pTrackerServer, \ - pStorageServer, store_path_index, \ - file_content, file_size, file_ext_name, \ - meta_list, meta_count, \ - group_name, remote_filename); - free(file_content); - } - - printf("storage_upload_by_filebuff\n"); - } - else - { - struct stat stat_buf; - - if (stat(local_filename, &stat_buf) == 0 && \ - S_ISREG(stat_buf.st_mode)) - { - file_size = stat_buf.st_size; - result = storage_upload_by_callback(pTrackerServer, \ - pStorageServer, store_path_index, \ - uploadFileCallback, local_filename, \ - file_size, file_ext_name, \ - meta_list, meta_count, \ - group_name, remote_filename); - } - - printf("storage_upload_by_callback\n"); - } - - if (result != 0) - { - printf("upload file fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - tracker_close_connection_ex(pStorageServer, true); - fdfs_client_destroy(); - return result; - } - - if (g_tracker_server_http_port == 80) - { - *szPortPart = '\0'; - } - else - { - sprintf(szPortPart, ":%d", g_tracker_server_http_port); - } - - sprintf(file_id, "%s/%s", group_name, remote_filename); - url_len = sprintf(file_url, "http://%s%s/%s", \ - pStorageServer->ip_addr, szPortPart, file_id); - if (g_anti_steal_token) - { - ts = time(NULL); - fdfs_http_gen_token(&g_anti_steal_secret_key, file_id, \ - ts, token); - sprintf(file_url + url_len, "?token=%s&ts=%d", \ - token, (int)ts); - } - - printf("group_name=%s, remote_filename=%s\n", \ - group_name, remote_filename); - - fdfs_get_file_info(group_name, remote_filename, &file_info); - printf("source ip address: %s\n", file_info.source_ip_addr); - printf("file timestamp=%s\n", formatDatetime( - file_info.create_timestamp, "%Y-%m-%d %H:%M:%S", \ - szDatetime, sizeof(szDatetime))); - printf("file size=%"PRId64"\n", file_info.file_size); - printf("file crc32=%u\n", file_info.crc32); - printf("example file url: %s\n", file_url); - - strcpy(master_filename, remote_filename); - *remote_filename = '\0'; - if (upload_type == FDFS_UPLOAD_BY_FILE) - { - prefix_name = "_big"; - result = storage_upload_slave_by_filename(pTrackerServer, - NULL, local_filename, master_filename, \ - prefix_name, file_ext_name, \ - meta_list, meta_count, \ - group_name, remote_filename); - - printf("storage_upload_slave_by_filename\n"); - } - else if (upload_type == FDFS_UPLOAD_BY_BUFF) - { - char *file_content; - prefix_name = "1024x1024"; - if ((result=getFileContent(local_filename, \ - &file_content, &file_size)) == 0) - { - result = storage_upload_slave_by_filebuff(pTrackerServer, \ - NULL, file_content, file_size, master_filename, - prefix_name, file_ext_name, \ - meta_list, meta_count, \ - group_name, remote_filename); - free(file_content); - } - - printf("storage_upload_slave_by_filebuff\n"); - } - else - { - struct stat stat_buf; - - prefix_name = "-small"; - if (stat(local_filename, &stat_buf) == 0 && \ - S_ISREG(stat_buf.st_mode)) - { - file_size = stat_buf.st_size; - result = storage_upload_slave_by_callback(pTrackerServer, \ - NULL, uploadFileCallback, local_filename, \ - file_size, master_filename, prefix_name, \ - file_ext_name, meta_list, meta_count, \ - group_name, remote_filename); - } - - printf("storage_upload_slave_by_callback\n"); - } - - if (result != 0) - { - printf("upload slave file fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - tracker_close_connection_ex(pStorageServer, true); - fdfs_client_destroy(); - return result; - } - - if (g_tracker_server_http_port == 80) - { - *szPortPart = '\0'; - } - else - { - sprintf(szPortPart, ":%d", g_tracker_server_http_port); - } - - sprintf(file_id, "%s/%s", group_name, remote_filename); - url_len = sprintf(file_url, "http://%s%s/%s", \ - pStorageServer->ip_addr, szPortPart, file_id); - if (g_anti_steal_token) - { - ts = time(NULL); - fdfs_http_gen_token(&g_anti_steal_secret_key, file_id, \ - ts, token); - sprintf(file_url + url_len, "?token=%s&ts=%d", \ - token, (int)ts); - } - - printf("group_name=%s, remote_filename=%s\n", \ - group_name, remote_filename); - - fdfs_get_file_info(group_name, remote_filename, &file_info); - - printf("source ip address: %s\n", file_info.source_ip_addr); - printf("file timestamp=%s\n", formatDatetime( - file_info.create_timestamp, "%Y-%m-%d %H:%M:%S", \ - szDatetime, sizeof(szDatetime))); - printf("file size=%"PRId64"\n", file_info.file_size); - printf("file crc32=%u\n", file_info.crc32); - printf("example file url: %s\n", file_url); - - if (fdfs_gen_slave_filename(master_filename, \ - prefix_name, file_ext_name, \ - slave_filename, &slave_filename_len) == 0) - { - - if (strcmp(remote_filename, slave_filename) != 0) - { - printf("slave_filename=%s\n" \ - "remote_filename=%s\n" \ - "not equal!\n", \ - slave_filename, remote_filename); - } - } - } - else if (strcmp(operation, "download") == 0 || - strcmp(operation, "getmeta") == 0 || - strcmp(operation, "setmeta") == 0 || - strcmp(operation, "query_servers") == 0 || - strcmp(operation, "delete") == 0) - { - if (argc < 5) - { - printf("Usage: %s %s " \ - " \n", \ - argv[0], operation); - fdfs_client_destroy(); - return EINVAL; - } - - snprintf(group_name, sizeof(group_name), "%s", argv[3]); - snprintf(remote_filename, sizeof(remote_filename), \ - "%s", argv[4]); - if (strcmp(operation, "setmeta") == 0 || - strcmp(operation, "delete") == 0) - { - result = tracker_query_storage_update(pTrackerServer, \ - &storageServer, group_name, remote_filename); - } - else if (strcmp(operation, "query_servers") == 0) - { - ConnectionInfo storageServers[FDFS_MAX_SERVERS_EACH_GROUP]; - int server_count; - - result = tracker_query_storage_list(pTrackerServer, \ - storageServers, FDFS_MAX_SERVERS_EACH_GROUP, \ - &server_count, group_name, remote_filename); - - if (result != 0) - { - printf("tracker_query_storage_list fail, "\ - "group_name=%s, filename=%s, " \ - "error no: %d, error info: %s\n", \ - group_name, remote_filename, \ - result, STRERROR(result)); - } - else - { - printf("server list (%d):\n", server_count); - for (i=0; i= 6) - { - local_filename = argv[5]; - if (strcmp(local_filename, "CALLBACK") == 0) - { - FILE *fp; - fp = fopen(local_filename, "wb"); - if (fp == NULL) - { - result = errno != 0 ? errno : EPERM; - printf("open file \"%s\" fail, " \ - "errno: %d, error info: %s", \ - local_filename, result, \ - STRERROR(result)); - } - else - { - result = storage_download_file_ex( \ - pTrackerServer, pStorageServer, \ - group_name, remote_filename, 0, 0, \ - writeToFileCallback, fp, &file_size); - fclose(fp); - } - } - else - { - result = storage_download_file_to_file( \ - pTrackerServer, pStorageServer, \ - group_name, remote_filename, \ - local_filename, &file_size); - } - } - else - { - file_buff = NULL; - if ((result=storage_download_file_to_buff( \ - pTrackerServer, pStorageServer, \ - group_name, remote_filename, \ - &file_buff, &file_size)) == 0) - { - local_filename = strrchr( \ - remote_filename, '/'); - if (local_filename != NULL) - { - local_filename++; //skip / - } - else - { - local_filename=remote_filename; - } - - result = writeToFile(local_filename, \ - file_buff, file_size); - - free(file_buff); - } - } - - if (result == 0) - { - printf("download file success, " \ - "file size=%"PRId64", file save to %s\n", \ - file_size, local_filename); - } - else - { - printf("download file fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - } - } - else if (strcmp(operation, "getmeta") == 0) - { - if ((result=storage_get_metadata(pTrackerServer, \ - pStorageServer, group_name, remote_filename, \ - &pMetaList, &meta_count)) == 0) - { - printf("get meta data success, " \ - "meta count=%d\n", meta_count); - for (i=0; i %s " \ - " " \ - " \n" \ - "\top_flag: %c for overwrite, " \ - "%c for merge\n" \ - "\tmetadata_list: name1=value1," \ - "name2=value2,...\n", \ - argv[0], operation, \ - STORAGE_SET_METADATA_FLAG_OVERWRITE, \ - STORAGE_SET_METADATA_FLAG_MERGE); - fdfs_client_destroy(); - return EINVAL; - } - - meta_buff = strdup(argv[6]); - if (meta_buff == NULL) - { - printf("Out of memory!\n"); - return ENOMEM; - } - - pMetaList = fdfs_split_metadata_ex(meta_buff, \ - ',', '=', &meta_count, &result); - if (pMetaList == NULL) - { - printf("Out of memory!\n"); - free(meta_buff); - return ENOMEM; - } - - if ((result=storage_set_metadata(pTrackerServer, \ - NULL, group_name, remote_filename, \ - pMetaList, meta_count, *argv[5])) == 0) - { - printf("set meta data success\n"); - } - else - { - printf("setmeta fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - } - - free(meta_buff); - free(pMetaList); - } - else if(strcmp(operation, "delete") == 0) - { - if ((result=storage_delete_file(pTrackerServer, \ - NULL, group_name, remote_filename)) == 0) - { - printf("delete file success\n"); - } - else - { - printf("delete file fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - } - } - } - else - { - fdfs_client_destroy(); - printf("invalid operation: %s\n", operation); - return EINVAL; - } - - /* for test only */ - if ((result=fdfs_active_test(pTrackerServer)) != 0) - { - printf("active_test to tracker server %s:%d fail, errno: %d\n", \ - pTrackerServer->ip_addr, pTrackerServer->port, result); - } - - /* for test only */ - if ((result=fdfs_active_test(pStorageServer)) != 0) - { - printf("active_test to storage server %s:%d fail, errno: %d\n", \ - pStorageServer->ip_addr, pStorageServer->port, result); - } - - tracker_close_connection_ex(pStorageServer, true); - tracker_close_connection_ex(pTrackerServer, true); - - fdfs_client_destroy(); - - return result; -} - diff --git a/client/test/fdfs_test.c b/client/test/fdfs_test.c new file mode 120000 index 0000000..c3a3f16 --- /dev/null +++ b/client/test/fdfs_test.c @@ -0,0 +1 @@ +../fdfs_test.c \ No newline at end of file diff --git a/client/test/fdfs_test1.c b/client/test/fdfs_test1.c deleted file mode 100644 index 633bfc0..0000000 --- a/client/test/fdfs_test1.c +++ /dev/null @@ -1,658 +0,0 @@ -/** -* Copyright (C) 2008 Happy Fish / YuQing -* -* FastDFS may be copied only under the terms of the GNU General -* Public License V3, which may be found in the FastDFS source kit. -* Please visit the FastDFS Home Page http://www.fastken.com/ for more detail. -**/ - -#include -#include -#include -#include -#include -#include -#include -#include "fdfs_client.h" -#include "fdfs_global.h" -#include "fastcommon/base64.h" -#include "fdfs_http_shared.h" -#include "fastcommon/sockopt.h" -#include "fastcommon/logger.h" - -int writeToFileCallback(void *arg, const int64_t file_size, const char *data, \ - const int current_size) -{ - if (arg == NULL) - { - return EINVAL; - } - - if (fwrite(data, current_size, 1, (FILE *)arg) != 1) - { - return errno != 0 ? errno : EIO; - } - - return 0; -} - -int uploadFileCallback(void *arg, const int64_t file_size, int sock) -{ - int64_t total_send_bytes; - char *filename; - if (arg == NULL) - { - return EINVAL; - } - - filename = (char *)arg; - return tcpsendfile(sock, filename, file_size, \ - SF_G_NETWORK_TIMEOUT, &total_send_bytes); -} - -int main(int argc, char *argv[]) -{ - char *conf_filename; - char *local_filename; - ConnectionInfo *pTrackerServer; - ConnectionInfo *pStorageServer; - int result; - ConnectionInfo storageServer; - char group_name[FDFS_GROUP_NAME_MAX_LEN + 1]; - FDFSMetaData meta_list[32]; - int meta_count; - int i; - FDFSMetaData *pMetaList; - char token[32 + 1]; - char file_id[128]; - char master_file_id[128]; - char file_url[256]; - char szDatetime[20]; - char szPortPart[16]; - int url_len; - time_t ts; - char *file_buff; - int64_t file_size; - char *operation; - char *meta_buff; - int store_path_index; - FDFSFileInfo file_info; - - printf("This is FastDFS client test program v%d.%02d\n" \ -"\nCopyright (C) 2008, Happy Fish / YuQing\n" \ -"\nFastDFS may be copied only under the terms of the GNU General\n" \ -"Public License V3, which may be found in the FastDFS source kit.\n" \ -"Please visit the FastDFS Home Page http://www.fastken.com/ \n" \ -"for more detail.\n\n" \ -, g_fdfs_version.major, g_fdfs_version.minor); - - if (argc < 3) - { - printf("Usage: %s \n" \ - "\toperation: upload, download, getmeta, setmeta, " \ - "delete and query_servers\n", argv[0]); - return 1; - } - - log_init(); - g_log_context.log_level = LOG_DEBUG; - - conf_filename = argv[1]; - operation = argv[2]; - if ((result=fdfs_client_init(conf_filename)) != 0) - { - return result; - } - - pTrackerServer = tracker_get_connection(); - if (pTrackerServer == NULL) - { - fdfs_client_destroy(); - return errno != 0 ? errno : ECONNREFUSED; - } - - local_filename = NULL; - if (strcmp(operation, "upload") == 0) - { - int upload_type; - char *prefix_name; - const char *file_ext_name; - char slave_file_id[256]; - int slave_file_id_len; - - if (argc < 4) - { - printf("Usage: %s upload " \ - " [FILE | BUFF | CALLBACK] \n",\ - argv[0]); - fdfs_client_destroy(); - return EINVAL; - } - - local_filename = argv[3]; - if (argc == 4) - { - upload_type = FDFS_UPLOAD_BY_FILE; - } - else - { - if (strcmp(argv[4], "BUFF") == 0) - { - upload_type = FDFS_UPLOAD_BY_BUFF; - } - else if (strcmp(argv[4], "CALLBACK") == 0) - { - upload_type = FDFS_UPLOAD_BY_CALLBACK; - } - else - { - upload_type = FDFS_UPLOAD_BY_FILE; - } - } - - { - ConnectionInfo storageServers[FDFS_MAX_SERVERS_EACH_GROUP]; - ConnectionInfo *pServer; - ConnectionInfo *pServerEnd; - int storage_count; - - strcpy(group_name, "group1"); - if ((result=tracker_query_storage_store_list_with_group( \ - pTrackerServer, group_name, storageServers, \ - FDFS_MAX_SERVERS_EACH_GROUP, &storage_count, \ - &store_path_index)) == 0) - { - printf("tracker_query_storage_store_list_with_group: \n"); - pServerEnd = storageServers + storage_count; - for (pServer=storageServers; pServerip_addr, \ - pServer->port); - } - printf("\n"); - } - } - - *group_name = '\0'; - if ((result=tracker_query_storage_store(pTrackerServer, \ - &storageServer, group_name, &store_path_index)) != 0) - { - fdfs_client_destroy(); - printf("tracker_query_storage fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - return result; - } - - printf("group_name=%s, ip_addr=%s, port=%d\n", \ - group_name, storageServer.ip_addr, \ - storageServer.port); - - if ((pStorageServer=tracker_make_connection(&storageServer, \ - &result)) == NULL) - { - fdfs_client_destroy(); - return result; - } - - memset(&meta_list, 0, sizeof(meta_list)); - meta_count = 0; - strcpy(meta_list[meta_count].name, "ext_name"); - strcpy(meta_list[meta_count].value, "jpg"); - meta_count++; - strcpy(meta_list[meta_count].name, "width"); - strcpy(meta_list[meta_count].value, "160"); - meta_count++; - strcpy(meta_list[meta_count].name, "height"); - strcpy(meta_list[meta_count].value, "80"); - meta_count++; - strcpy(meta_list[meta_count].name, "file_size"); - strcpy(meta_list[meta_count].value, "115120"); - meta_count++; - - file_ext_name = fdfs_get_file_ext_name(local_filename); - strcpy(group_name, ""); - - if (upload_type == FDFS_UPLOAD_BY_FILE) - { - printf("storage_upload_by_filename\n"); - result = storage_upload_by_filename1(pTrackerServer, \ - pStorageServer, store_path_index, \ - local_filename, file_ext_name, \ - meta_list, meta_count, \ - group_name, file_id); - } - else if (upload_type == FDFS_UPLOAD_BY_BUFF) - { - char *file_content; - printf("storage_upload_by_filebuff\n"); - if ((result=getFileContent(local_filename, \ - &file_content, &file_size)) == 0) - { - result = storage_upload_by_filebuff1(pTrackerServer, \ - pStorageServer, store_path_index, \ - file_content, file_size, file_ext_name, \ - meta_list, meta_count, \ - group_name, file_id); - free(file_content); - } - } - else - { - struct stat stat_buf; - - printf("storage_upload_by_callback\n"); - if (stat(local_filename, &stat_buf) == 0 && \ - S_ISREG(stat_buf.st_mode)) - { - file_size = stat_buf.st_size; - result = storage_upload_by_callback1(pTrackerServer, \ - pStorageServer, store_path_index, \ - uploadFileCallback, local_filename, \ - file_size, file_ext_name, \ - meta_list, meta_count, \ - group_name, file_id); - } - } - - if (result != 0) - { - printf("upload file fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - tracker_close_connection_ex(pStorageServer, true); - fdfs_client_destroy(); - return result; - } - - if (g_tracker_server_http_port == 80) - { - *szPortPart = '\0'; - } - else - { - sprintf(szPortPart, ":%d", g_tracker_server_http_port); - } - - url_len = sprintf(file_url, "http://%s%s/%s", \ - pStorageServer->ip_addr, szPortPart, file_id); - if (g_anti_steal_token) - { - ts = time(NULL); - fdfs_http_gen_token(&g_anti_steal_secret_key, \ - file_id, ts, token); - sprintf(file_url + url_len, "?token=%s&ts=%d", \ - token, (int)ts); - } - - fdfs_get_file_info1(file_id, &file_info); - printf("source ip address: %s\n", file_info.source_ip_addr); - printf("file timestamp=%s\n", formatDatetime( - file_info.create_timestamp, "%Y-%m-%d %H:%M:%S", \ - szDatetime, sizeof(szDatetime))); - printf("file size=%"PRId64"\n", file_info.file_size); - printf("file crc32=%u\n", file_info.crc32); - printf("example file url: %s\n", file_url); - - strcpy(master_file_id, file_id); - *file_id = '\0'; - - if (upload_type == FDFS_UPLOAD_BY_FILE) - { - prefix_name = "_big"; - printf("storage_upload_slave_by_filename\n"); - result = storage_upload_slave_by_filename1( \ - pTrackerServer, NULL, \ - local_filename, master_file_id, \ - prefix_name, file_ext_name, \ - meta_list, meta_count, file_id); - } - else if (upload_type == FDFS_UPLOAD_BY_BUFF) - { - char *file_content; - prefix_name = "1024x1024"; - printf("storage_upload_slave_by_filebuff\n"); - if ((result=getFileContent(local_filename, \ - &file_content, &file_size)) == 0) - { - result = storage_upload_slave_by_filebuff1( \ - pTrackerServer, NULL, file_content, file_size, \ - master_file_id, prefix_name, file_ext_name, \ - meta_list, meta_count, file_id); - free(file_content); - } - } - else - { - struct stat stat_buf; - - prefix_name = "_small"; - printf("storage_upload_slave_by_callback\n"); - if (stat(local_filename, &stat_buf) == 0 && \ - S_ISREG(stat_buf.st_mode)) - { - file_size = stat_buf.st_size; - result = storage_upload_slave_by_callback1( \ - pTrackerServer, NULL, \ - uploadFileCallback, local_filename, \ - file_size, master_file_id, \ - prefix_name, file_ext_name, \ - meta_list, meta_count, file_id); - } - } - - if (result != 0) - { - printf("upload slave file fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - tracker_close_connection_ex(pStorageServer, true); - fdfs_client_destroy(); - return result; - } - - if (g_tracker_server_http_port == 80) - { - *szPortPart = '\0'; - } - else - { - sprintf(szPortPart, ":%d", g_tracker_server_http_port); - } - url_len = sprintf(file_url, "http://%s%s/%s", \ - pStorageServer->ip_addr, szPortPart, file_id); - if (g_anti_steal_token) - { - ts = time(NULL); - fdfs_http_gen_token(&g_anti_steal_secret_key, \ - file_id, ts, token); - sprintf(file_url + url_len, "?token=%s&ts=%d", \ - token, (int)ts); - } - - fdfs_get_file_info1(file_id, &file_info); - printf("source ip address: %s\n", file_info.source_ip_addr); - printf("file timestamp=%s\n", formatDatetime( - file_info.create_timestamp, "%Y-%m-%d %H:%M:%S", \ - szDatetime, sizeof(szDatetime))); - printf("file size=%"PRId64"\n", file_info.file_size); - printf("file crc32=%u\n", file_info.crc32); - printf("example file url: %s\n", file_url); - - if (fdfs_gen_slave_filename(master_file_id, \ - prefix_name, file_ext_name, \ - slave_file_id, &slave_file_id_len) == 0) - { - if (strcmp(file_id, slave_file_id) != 0) - { - printf("slave_file_id=%s\n" \ - "file_id=%s\n" \ - "not equal!\n", \ - slave_file_id, file_id); - } - } - } - else if (strcmp(operation, "download") == 0 || - strcmp(operation, "getmeta") == 0 || - strcmp(operation, "setmeta") == 0 || - strcmp(operation, "query_servers") == 0 || - strcmp(operation, "delete") == 0) - { - if (argc < 4) - { - printf("Usage: %s %s " \ - "\n", \ - argv[0], operation); - fdfs_client_destroy(); - return EINVAL; - } - - snprintf(file_id, sizeof(file_id), "%s", argv[3]); - if (strcmp(operation, "query_servers") == 0) - { - ConnectionInfo storageServers[FDFS_MAX_SERVERS_EACH_GROUP]; - int server_count; - - result = tracker_query_storage_list1(pTrackerServer, \ - storageServers, FDFS_MAX_SERVERS_EACH_GROUP, \ - &server_count, file_id); - - if (result != 0) - { - printf("tracker_query_storage_list1 fail, "\ - "file_id=%s, " \ - "error no: %d, error info: %s\n", \ - file_id, result, STRERROR(result)); - } - else - { - printf("server list (%d):\n", server_count); - for (i=0; i= 5) - { - local_filename = argv[4]; - if (strcmp(local_filename, "CALLBACK") == 0) - { - FILE *fp; - fp = fopen(local_filename, "wb"); - if (fp == NULL) - { - result = errno != 0 ? errno : EPERM; - printf("open file \"%s\" fail, " \ - "errno: %d, error info: %s", \ - local_filename, result, \ - STRERROR(result)); - } - else - { - result = storage_download_file_ex1( \ - pTrackerServer, pStorageServer, \ - file_id, 0, 0, \ - writeToFileCallback, fp, &file_size); - fclose(fp); - } - } - else - { - result = storage_download_file_to_file1( \ - pTrackerServer, pStorageServer, \ - file_id, \ - local_filename, &file_size); - } - } - else - { - file_buff = NULL; - if ((result=storage_download_file_to_buff1( \ - pTrackerServer, pStorageServer, \ - file_id, \ - &file_buff, &file_size)) == 0) - { - local_filename = strrchr( \ - file_id, '/'); - if (local_filename != NULL) - { - local_filename++; //skip / - } - else - { - local_filename=file_id; - } - - result = writeToFile(local_filename, \ - file_buff, file_size); - - free(file_buff); - } - } - - if (result == 0) - { - printf("download file success, " \ - "file size=%"PRId64", file save to %s\n", \ - file_size, local_filename); - } - else - { - printf("download file fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - } - } - else if (strcmp(operation, "getmeta") == 0) - { - if ((result=storage_get_metadata1(pTrackerServer, \ - NULL, file_id, \ - &pMetaList, &meta_count)) == 0) - { - printf("get meta data success, " \ - "meta count=%d\n", meta_count); - for (i=0; i %s " \ - " " \ - " \n" \ - "\top_flag: %c for overwrite, " \ - "%c for merge\n" \ - "\tmetadata_list: name1=value1," \ - "name2=value2,...\n", \ - argv[0], operation, \ - STORAGE_SET_METADATA_FLAG_OVERWRITE, \ - STORAGE_SET_METADATA_FLAG_MERGE); - fdfs_client_destroy(); - return EINVAL; - } - - meta_buff = strdup(argv[5]); - if (meta_buff == NULL) - { - printf("Out of memory!\n"); - return ENOMEM; - } - - pMetaList = fdfs_split_metadata_ex(meta_buff, \ - ',', '=', &meta_count, &result); - if (pMetaList == NULL) - { - printf("Out of memory!\n"); - free(meta_buff); - return ENOMEM; - } - - if ((result=storage_set_metadata1(pTrackerServer, \ - NULL, file_id, \ - pMetaList, meta_count, *argv[4])) == 0) - { - printf("set meta data success\n"); - } - else - { - printf("setmeta fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - } - - free(meta_buff); - free(pMetaList); - } - else if(strcmp(operation, "delete") == 0) - { - if ((result=storage_delete_file1(pTrackerServer, \ - NULL, file_id)) == 0) - { - printf("delete file success\n"); - } - else - { - printf("delete file fail, " \ - "error no: %d, error info: %s\n", \ - result, STRERROR(result)); - } - } - } - else - { - fdfs_client_destroy(); - printf("invalid operation: %s\n", operation); - return EINVAL; - } - - /* for test only */ - if ((result=fdfs_active_test(pTrackerServer)) != 0) - { - printf("active_test to tracker server %s:%d fail, errno: %d\n", \ - pTrackerServer->ip_addr, pTrackerServer->port, result); - } - - /* for test only */ - if ((result=fdfs_active_test(pStorageServer)) != 0) - { - printf("active_test to storage server %s:%d fail, errno: %d\n", \ - pStorageServer->ip_addr, pStorageServer->port, result); - } - - tracker_close_connection_ex(pStorageServer, true); - tracker_close_connection_ex(pTrackerServer, true); - - fdfs_client_destroy(); - - return result; -} - diff --git a/client/test/fdfs_test1.c b/client/test/fdfs_test1.c new file mode 120000 index 0000000..c87e07d --- /dev/null +++ b/client/test/fdfs_test1.c @@ -0,0 +1 @@ +../fdfs_test1.c \ No newline at end of file diff --git a/common/fdfs_global.c b/common/fdfs_global.c index d311054..3bce2ee 100644 --- a/common/fdfs_global.c +++ b/common/fdfs_global.c @@ -20,7 +20,7 @@ #include "fastcommon/logger.h" #include "fdfs_global.h" -Version g_fdfs_version = {6, 9, 0}; +Version g_fdfs_version = {6, 9, 1}; bool g_use_connection_pool = false; ConnectionPool g_connection_pool; int g_connection_pool_max_idle_time = 3600; diff --git a/php_client/fastdfs_client.c b/php_client/fastdfs_client.c index 2b58e82..6469175 100644 --- a/php_client/fastdfs_client.c +++ b/php_client/fastdfs_client.c @@ -5320,8 +5320,9 @@ ZEND_FUNCTION(fastdfs_client_version) char szVersion[16]; int len; - len = sprintf(szVersion, "%d.%02d", \ - g_fdfs_version.major, g_fdfs_version.minor); + len = sprintf(szVersion, "%d.%d.%d", + g_fdfs_version.major, g_fdfs_version.minor, + g_fdfs_version.patch); ZEND_RETURN_STRINGL(szVersion, len, 1); } @@ -7859,8 +7860,8 @@ PHP_RSHUTDOWN_FUNCTION(fastdfs_client) PHP_MINFO_FUNCTION(fastdfs_client) { char fastdfs_info[64]; - sprintf(fastdfs_info, "fastdfs_client v%d.%02d support", - g_fdfs_version.major, g_fdfs_version.minor); + sprintf(fastdfs_info, "fastdfs_client v%d.%d.%d support", + g_fdfs_version.major, g_fdfs_version.minor, g_fdfs_version.patch); php_info_print_table_start(); php_info_print_table_header(2, fastdfs_info, "enabled"); diff --git a/storage/storage_dio.c b/storage/storage_dio.c index f1dfb8c..a7a8755 100644 --- a/storage/storage_dio.c +++ b/storage/storage_dio.c @@ -149,8 +149,8 @@ int storage_dio_queue_push(struct fast_task_info *pTask) sf_hold_task(pTask); if ((result=blocked_queue_push(&(pContext->queue), pTask)) != 0) { - sf_release_task(pTask); ioevent_add_to_deleted_list(pTask); + sf_release_task(pTask); return result; } @@ -352,10 +352,11 @@ int dio_read_file(struct fast_task_info *pTask) pTask->length += read_bytes; pFileContext->offset += read_bytes; - /* - logInfo("###after dio read bytes: %d, pTask->length=%d, file offset=%ld", \ - read_bytes, pTask->length, pFileContext->offset); - */ + /* + logInfo("###after dio read bytes: %d, pTask->length=%d, " + "file offset=%"PRId64", file size: %"PRId64, read_bytes, + pTask->length, pFileContext->offset, pFileContext->end); + */ if (pFileContext->offset < pFileContext->end) { @@ -733,7 +734,7 @@ static void *dio_thread_entrance(void* arg) while ((pTask=blocked_queue_pop(&(pContext->queue))) != NULL) { ((StorageClientInfo *)pTask->arg)->deal_func(pTask); - sf_release_task(pTask); + storage_release_task(pTask); } } diff --git a/storage/storage_dump.c b/storage/storage_dump.c index a10332a..a0bac08 100644 --- a/storage/storage_dump.c +++ b/storage/storage_dump.c @@ -45,7 +45,7 @@ static int fdfs_dump_global_vars(char *buff, const int buffSize) "SF_G_CONNECT_TIMEOUT=%ds\n" "SF_G_NETWORK_TIMEOUT=%ds\n" "SF_G_BASE_PATH_STR=%s\n" - "g_fdfs_version=%d.%02d\n" + "g_fdfs_version=%d.%d.%d\n" "SF_G_CONTINUE_FLAG=%d\n" "g_schedule_flag=%d\n" "SF_G_INNER_PORT=%d\n" @@ -139,7 +139,7 @@ static int fdfs_dump_global_vars(char *buff, const int buffSize) , SF_G_NETWORK_TIMEOUT , SF_G_BASE_PATH_STR , g_fdfs_version.major, g_fdfs_version.minor - , SF_G_CONTINUE_FLAG + , g_fdfs_version.patch, SF_G_CONTINUE_FLAG , g_schedule_flag , SF_G_INNER_PORT , g_sf_global_vars.max_connections diff --git a/storage/storage_func.c b/storage/storage_func.c index 83c1aa9..216add8 100644 --- a/storage/storage_func.c +++ b/storage/storage_func.c @@ -1960,7 +1960,7 @@ int storage_func_init(const char *filename) sf_context_config_to_string(&g_sf_context, sz_service_config, sizeof(sz_service_config)); - logInfo("FastDFS v%d.%02d, %s, %s, store_path_count=%d, " + logInfo("FastDFS v%d.%d.%d, %s, %s, store_path_count=%d, " "subdir_count_per_path=%d, group_name=%s, client_bind=%d, " "disk_rw_separated=%d, disk_reader_threads=%d, " "disk_writer_threads=%d, disk_recovery_threads=%d, " @@ -1992,7 +1992,7 @@ int storage_func_init(const char *filename) "compress_binlog_time=%02d:%02d, " "check_store_path_mark=%d", g_fdfs_version.major, g_fdfs_version.minor, - sz_global_config, sz_service_config, + g_fdfs_version.patch, sz_global_config, sz_service_config, g_fdfs_store_paths.count, g_subdir_count_per_path, g_group_name, g_client_bind_addr, g_disk_rw_separated, g_disk_reader_threads, g_disk_writer_threads, diff --git a/storage/storage_service.c b/storage/storage_service.c index 16ecae5..67847bf 100644 --- a/storage/storage_service.c +++ b/storage/storage_service.c @@ -1527,15 +1527,10 @@ static void storage_set_metadata_done_callback( \ void task_finish_clean_up(struct fast_task_info *pTask) { - StorageClientInfo *pClientInfo; - - pClientInfo = (StorageClientInfo *)pTask->arg; - if (pClientInfo->clean_func != NULL) + if (__sync_sub_and_fetch(&pTask->reffer_count, 0) == 1) { - pClientInfo->clean_func(pTask); + storage_clear_task(pTask); } - memset(pTask->arg, 0, sizeof(StorageClientInfo)); - ++g_stat_change_count; sf_task_finish_clean_up(pTask); } diff --git a/storage/storage_service.h b/storage/storage_service.h index ecc0c36..e4f66d8 100644 --- a/storage/storage_service.h +++ b/storage/storage_service.h @@ -20,8 +20,10 @@ #define STORAGE_DELETE_FLAG_LINK 2 #include "fastcommon/logger.h" -#include "fdfs_define.h" #include "fastcommon/fast_task_queue.h" +#include "sf/sf_service.h" +#include "fdfs_define.h" +#include "storage_types.h" #ifdef __cplusplus extern "C" { @@ -37,6 +39,27 @@ int storage_get_storage_path_index(int *store_path_index); void storage_get_store_path(const char *filename, const int filename_len, int *sub_path_high, int *sub_path_low); +static inline void storage_clear_task(struct fast_task_info *pTask) +{ + StorageClientInfo *pClientInfo; + + pClientInfo = (StorageClientInfo *)pTask->arg; + if (pClientInfo->clean_func != NULL) + { + pClientInfo->clean_func(pTask); + } + memset(pTask->arg, 0, sizeof(StorageClientInfo)); +} + +static inline void storage_release_task(struct fast_task_info *pTask) +{ + if (__sync_sub_and_fetch(&pTask->reffer_count, 0) == 1) + { + storage_clear_task(pTask); + } + sf_release_task(pTask); +} + #ifdef __cplusplus } #endif diff --git a/storage/tracker_client_thread.c b/storage/tracker_client_thread.c index 0baa978..84e882b 100644 --- a/storage/tracker_client_thread.c +++ b/storage/tracker_client_thread.c @@ -74,7 +74,6 @@ int tracker_report_init() memset(g_storage_servers, 0, sizeof(g_storage_servers)); memset(g_sorted_storages, 0, sizeof(g_sorted_storages)); - if ((result=init_pthread_lock(&reporter_thread_lock)) != 0) { return result; @@ -2008,8 +2007,8 @@ int tracker_report_join(ConnectionInfo *pTrackerServer, \ pHeader->cmd = TRACKER_PROTO_CMD_STORAGE_JOIN; strcpy(pReqBody->group_name, g_group_name); strcpy(pReqBody->domain_name, g_http_domain); - snprintf(pReqBody->version, sizeof(pReqBody->version), "%d.%02d", \ - g_fdfs_version.major, g_fdfs_version.minor); + snprintf(pReqBody->version, sizeof(pReqBody->version), "%d.%d.%d", + g_fdfs_version.major, g_fdfs_version.minor, g_fdfs_version.patch); long2buff(SF_G_INNER_PORT, pReqBody->storage_port); long2buff(g_http_port, pReqBody->storage_http_port); long2buff(g_fdfs_store_paths.count, pReqBody->store_path_count); diff --git a/tracker/tracker_dump.c b/tracker/tracker_dump.c index a15504e..5fe942a 100644 --- a/tracker/tracker_dump.c +++ b/tracker/tracker_dump.c @@ -294,7 +294,7 @@ static int fdfs_dump_global_vars(char *buff, const int buffSize) "SF_G_CONNECT_TIMEOUT=%ds\n" "SF_G_NETWORK_TIMEOUT=%ds\n" "SF_G_BASE_PATH_STR=%s\n" - "g_fdfs_version=%d.%02d\n" + "g_fdfs_version=%d.%d.%d\n" "SF_G_CONTINUE_FLAG=%d\n" "g_schedule_flag=%d\n" "SF_G_INNER_PORT=%d\n" @@ -349,7 +349,7 @@ static int fdfs_dump_global_vars(char *buff, const int buffSize) , SF_G_NETWORK_TIMEOUT , SF_G_BASE_PATH_STR , g_fdfs_version.major, g_fdfs_version.minor - , SF_G_CONTINUE_FLAG + , g_fdfs_version.patch, SF_G_CONTINUE_FLAG , g_schedule_flag , SF_G_INNER_PORT , g_sf_global_vars.max_connections diff --git a/tracker/tracker_func.c b/tracker/tracker_func.c index 4003358..34a937c 100644 --- a/tracker/tracker_func.c +++ b/tracker/tracker_func.c @@ -490,7 +490,7 @@ int tracker_load_from_conf_file(const char *filename) sf_context_config_to_string(&g_sf_context, sz_service_config, sizeof(sz_service_config)); - logInfo("FastDFS v%d.%02d, %s, %s, " + logInfo("FastDFS v%d.%d.%d, %s, %s, " "store_lookup=%d, store_group=%s, " "store_server=%d, store_path=%d, " "reserved_storage_space=%s, " @@ -524,7 +524,7 @@ int tracker_load_from_conf_file(const char *filename) "use_connection_pool=%d, " "g_connection_pool_max_idle_time=%ds", g_fdfs_version.major, g_fdfs_version.minor, - sz_global_config, sz_service_config, + g_fdfs_version.patch, sz_global_config, sz_service_config, g_groups.store_lookup, g_groups.store_group, g_groups.store_server, g_groups.store_path, fdfs_storage_reserved_space_to_string(