bugfixed: clear task extra data correctly when the connection broken
parent
4e714c13db
commit
09491325cc
3
HISTORY
3
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
|
||||
|
|
|
|||
6
INSTALL
6
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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/types.h>
|
||||
#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 <config_file> [-h <tracker_server>] "
|
||||
"[list|delete|set_trunk_server <group_name> [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; i<g_tracker_group.server_count; i++)
|
||||
{
|
||||
if (fdfs_server_contain1(g_tracker_group.servers + i, &conn))
|
||||
{
|
||||
g_tracker_group.server_index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == g_tracker_group.server_count)
|
||||
{
|
||||
printf("tracker server: %s not exists!\n", tracker_server);
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
printf("server_count=%d, server_index=%d\n",
|
||||
g_tracker_group.server_count, g_tracker_group.server_index);
|
||||
|
||||
pTrackerServer = tracker_get_connection();
|
||||
if (pTrackerServer == NULL)
|
||||
{
|
||||
fdfs_client_destroy();
|
||||
return errno != 0 ? errno : ECONNREFUSED;
|
||||
}
|
||||
printf("\ntracker server is %s:%d\n\n", pTrackerServer->ip_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; pStorage<pStorageEnd; \
|
||||
pStorage++)
|
||||
{
|
||||
max_last_source_update = 0;
|
||||
for (p=storage_infos; p<pStorageEnd; p++)
|
||||
{
|
||||
if (p != pStorage && p->stat.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; pGroupStat<pGroupEnd; \
|
||||
pGroupStat++)
|
||||
{
|
||||
printf( "\nGroup %d:\n", ++i);
|
||||
list_storages(pGroupStat);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (pGroupStat=group_stats; pGroupStat<pGroupEnd; \
|
||||
pGroupStat++)
|
||||
{
|
||||
if (strcmp(pGroupStat->group_name, group_name) == 0)
|
||||
{
|
||||
list_storages(pGroupStat);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
../fdfs_monitor.c
|
||||
|
|
@ -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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#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 <config_file> <operation>\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 <config_file> upload " \
|
||||
"<local_filename> [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; pServer<pServerEnd; pServer++)
|
||||
{
|
||||
printf("\tserver %d. group_name=%s, " \
|
||||
"ip_addr=%s, port=%d\n", \
|
||||
(int)(pServer - storageServers) + 1, \
|
||||
group_name, pServer->ip_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 <config_file> %s " \
|
||||
"<group_name> <remote_filename>\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<server_count; i++)
|
||||
{
|
||||
printf("\t%s:%d\n", \
|
||||
storageServers[i].ip_addr, \
|
||||
storageServers[i].port);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
tracker_close_connection_ex(pTrackerServer, result != 0);
|
||||
fdfs_client_destroy();
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = tracker_query_storage_fetch(pTrackerServer, \
|
||||
&storageServer, group_name, remote_filename);
|
||||
}
|
||||
|
||||
if (result != 0)
|
||||
{
|
||||
fdfs_client_destroy();
|
||||
printf("tracker_query_storage_fetch fail, " \
|
||||
"group_name=%s, filename=%s, " \
|
||||
"error no: %d, error info: %s\n", \
|
||||
group_name, remote_filename, \
|
||||
result, STRERROR(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
printf("storage=%s:%d\n", storageServer.ip_addr, \
|
||||
storageServer.port);
|
||||
|
||||
if ((pStorageServer=tracker_make_connection(&storageServer, \
|
||||
&result)) == NULL)
|
||||
{
|
||||
fdfs_client_destroy();
|
||||
return result;
|
||||
}
|
||||
|
||||
if (strcmp(operation, "download") == 0)
|
||||
{
|
||||
if (argc >= 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<meta_count; i++)
|
||||
{
|
||||
printf("%s=%s\n", \
|
||||
pMetaList[i].name, \
|
||||
pMetaList[i].value);
|
||||
}
|
||||
|
||||
free(pMetaList);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("getmeta fail, " \
|
||||
"error no: %d, error info: %s\n", \
|
||||
result, STRERROR(result));
|
||||
}
|
||||
}
|
||||
else if (strcmp(operation, "setmeta") == 0)
|
||||
{
|
||||
if (argc < 7)
|
||||
{
|
||||
printf("Usage: %s <config_file> %s " \
|
||||
"<group_name> <remote_filename> " \
|
||||
"<op_flag> <metadata_list>\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;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
../fdfs_test.c
|
||||
|
|
@ -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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#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 <config_file> <operation>\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 <config_file> upload " \
|
||||
"<local_filename> [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; pServer<pServerEnd; pServer++)
|
||||
{
|
||||
printf("\tserver %d. group_name=%s, " \
|
||||
"ip_addr=%s, port=%d\n", \
|
||||
(int)(pServer - storageServers) + 1, \
|
||||
group_name, pServer->ip_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 <config_file> %s " \
|
||||
"<file_id>\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<server_count; i++)
|
||||
{
|
||||
printf("\t%s:%d\n", \
|
||||
storageServers[i].ip_addr, \
|
||||
storageServers[i].port);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
tracker_close_connection_ex(pTrackerServer, true);
|
||||
fdfs_client_destroy();
|
||||
return result;
|
||||
}
|
||||
|
||||
if ((result=tracker_query_storage_fetch1(pTrackerServer, \
|
||||
&storageServer, file_id)) != 0)
|
||||
{
|
||||
fdfs_client_destroy();
|
||||
printf("tracker_query_storage_fetch fail, " \
|
||||
"file_id=%s, " \
|
||||
"error no: %d, error info: %s\n", \
|
||||
file_id, result, STRERROR(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
printf("storage=%s:%d\n", storageServer.ip_addr, \
|
||||
storageServer.port);
|
||||
|
||||
if ((pStorageServer=tracker_make_connection(&storageServer, \
|
||||
&result)) == NULL)
|
||||
{
|
||||
fdfs_client_destroy();
|
||||
return result;
|
||||
}
|
||||
|
||||
if (strcmp(operation, "download") == 0)
|
||||
{
|
||||
if (argc >= 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<meta_count; i++)
|
||||
{
|
||||
printf("%s=%s\n", \
|
||||
pMetaList[i].name, \
|
||||
pMetaList[i].value);
|
||||
}
|
||||
|
||||
free(pMetaList);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("getmeta fail, " \
|
||||
"error no: %d, error info: %s\n", \
|
||||
result, STRERROR(result));
|
||||
}
|
||||
}
|
||||
else if (strcmp(operation, "setmeta") == 0)
|
||||
{
|
||||
if (argc < 6)
|
||||
{
|
||||
printf("Usage: %s <config_file> %s " \
|
||||
"<file_id> " \
|
||||
"<op_flag> <metadata_list>\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;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
../fdfs_test1.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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Reference in New Issue