code adjust for pull request #673

pull/687/head
YuQing 2023-11-24 19:46:16 +08:00
parent 1809d46020
commit bfb3e9f887
16 changed files with 218 additions and 209 deletions

View File

@ -31,8 +31,7 @@
#include "client_global.h" #include "client_global.h"
#include "fastcommon/base64.h" #include "fastcommon/base64.h"
static struct base64_context the_base64_context; static int g_base64_context_inited = 0;
static int the_base64_context_inited = 0;
#define FDFS_SPLIT_GROUP_NAME_AND_FILENAME(file_id) \ #define FDFS_SPLIT_GROUP_NAME_AND_FILENAME(file_id) \
char in_file_id[FDFS_GROUP_NAME_MAX_LEN + 128]; \ char in_file_id[FDFS_GROUP_NAME_MAX_LEN + 128]; \
@ -383,17 +382,17 @@ int storage_query_file_info_ex(ConnectionInfo *pTrackerServer, \
result = EINVAL; result = EINVAL;
} }
if (!the_base64_context_inited) if (!g_base64_context_inited)
{ {
the_base64_context_inited = 1; g_base64_context_inited = 1;
base64_init_ex(&the_base64_context, 0, '-', '_', '.'); base64_init_ex(&g_fdfs_base64_context, 0, '-', '_', '.');
} }
memset(buff, 0, sizeof(buff)); memset(buff, 0, sizeof(buff));
if (filename_len >= FDFS_LOGIC_FILE_PATH_LEN \ if (filename_len >= FDFS_LOGIC_FILE_PATH_LEN \
+ FDFS_FILENAME_BASE64_LENGTH + FDFS_FILE_EXT_NAME_MAX_LEN + 1) + FDFS_FILENAME_BASE64_LENGTH + FDFS_FILE_EXT_NAME_MAX_LEN + 1)
{ {
base64_decode_auto(&the_base64_context, (char *)filename + \ base64_decode_auto(&g_fdfs_base64_context, (char *)filename + \
FDFS_LOGIC_FILE_PATH_LEN, FDFS_FILENAME_BASE64_LENGTH, \ FDFS_LOGIC_FILE_PATH_LEN, FDFS_FILENAME_BASE64_LENGTH, \
buff, &buff_len); buff, &buff_len);
} }
@ -2139,10 +2138,10 @@ int fdfs_get_file_info_ex(const char *group_name, const char *remote_filename, \
char buff[64]; char buff[64];
memset(pFileInfo, 0, sizeof(FDFSFileInfo)); memset(pFileInfo, 0, sizeof(FDFSFileInfo));
if (!the_base64_context_inited) if (!g_base64_context_inited)
{ {
the_base64_context_inited = 1; g_base64_context_inited = 1;
base64_init_ex(&the_base64_context, 0, '-', '_', '.'); base64_init_ex(&g_fdfs_base64_context, 0, '-', '_', '.');
} }
filename_len = strlen(remote_filename); filename_len = strlen(remote_filename);
@ -2156,7 +2155,7 @@ int fdfs_get_file_info_ex(const char *group_name, const char *remote_filename, \
} }
memset(buff, 0, sizeof(buff)); memset(buff, 0, sizeof(buff));
base64_decode_auto(&the_base64_context, (char *)remote_filename + \ base64_decode_auto(&g_fdfs_base64_context, (char *)remote_filename + \
FDFS_LOGIC_FILE_PATH_LEN, FDFS_FILENAME_BASE64_LENGTH, \ FDFS_LOGIC_FILE_PATH_LEN, FDFS_FILENAME_BASE64_LENGTH, \
buff, &buff_len); buff, &buff_len);

View File

@ -24,6 +24,7 @@ Version g_fdfs_version = {6, 10, 0};
bool g_use_connection_pool = false; bool g_use_connection_pool = false;
ConnectionPool g_connection_pool; ConnectionPool g_connection_pool;
int g_connection_pool_max_idle_time = 3600; int g_connection_pool_max_idle_time = 3600;
struct base64_context g_fdfs_base64_context;
/* /*
data filename format: data filename format:

View File

@ -12,9 +12,10 @@
#define _FDFS_GLOBAL_H #define _FDFS_GLOBAL_H
#include "fastcommon/common_define.h" #include "fastcommon/common_define.h"
#include "fastcommon/base64.h"
#include "fastcommon/connection_pool.h"
#include "sf/sf_global.h" #include "sf/sf_global.h"
#include "fdfs_define.h" #include "fdfs_define.h"
#include "fastcommon/connection_pool.h"
#define FDFS_FILE_EXT_NAME_MAX_LEN 6 #define FDFS_FILE_EXT_NAME_MAX_LEN 6
@ -26,6 +27,7 @@ extern Version g_fdfs_version;
extern bool g_use_connection_pool; extern bool g_use_connection_pool;
extern ConnectionPool g_connection_pool; extern ConnectionPool g_connection_pool;
extern int g_connection_pool_max_idle_time; extern int g_connection_pool_max_idle_time;
extern struct base64_context g_fdfs_base64_context;
int fdfs_check_data_filename(const char *filename, const int len); int fdfs_check_data_filename(const char *filename, const int len);
int fdfs_gen_slave_filename(const char *master_filename, \ int fdfs_gen_slave_filename(const char *master_filename, \

View File

@ -174,10 +174,12 @@ int fdht_connect_server_nb(FDHTServerInfo *pServer, const int connect_timeout)
} }
// 通过判断IP地址是IPv4或者IPv6根据结果进行初始化 // 通过判断IP地址是IPv4或者IPv6根据结果进行初始化
if (is_ipv6_addr(pServer->ip_addr)) if (is_ipv6_addr(pServer->ip_addr))
{ {
pServer->sock = socket(AF_INET6, SOCK_STREAM, 0); pServer->sock = socket(AF_INET6, SOCK_STREAM, 0);
}else{ }
else
{
pServer->sock = socket(AF_INET, SOCK_STREAM, 0); pServer->sock = socket(AF_INET, SOCK_STREAM, 0);
} }
@ -223,10 +225,12 @@ int fdht_connect_server(FDHTServerInfo *pServer)
} }
// 通过判断IP地址是IPv4或者IPv6根据结果进行初始化 // 通过判断IP地址是IPv4或者IPv6根据结果进行初始化
if (is_ipv6_addr(pServer->ip_addr)) if (is_ipv6_addr(pServer->ip_addr))
{ {
pServer->sock = socket(AF_INET6, SOCK_STREAM, 0); pServer->sock = socket(AF_INET6, SOCK_STREAM, 0);
}else{ }
else
{
pServer->sock = socket(AF_INET, SOCK_STREAM, 0); pServer->sock = socket(AF_INET, SOCK_STREAM, 0);
} }

View File

@ -226,31 +226,27 @@ static int tracker_get_my_server_id()
char ip_str[256]; char ip_str[256];
bool flag = false; bool flag = false;
if (inet_pton(AF_INET, g_tracker_client_ip.ips[0].address, &ipv4_addr) == 1) if (inet_pton(AF_INET, g_tracker_client_ip.ips[0].
address, &ipv4_addr) == 1)
{ {
g_server_id_in_filename = ipv4_addr.s_addr; g_server_id_in_filename = ipv4_addr.s_addr;
flag = true; flag = true;
} }
else if(inet_pton(AF_INET6, g_tracker_client_ip.ips[0].address, &ipv6_addr) == 1) else if (inet_pton(AF_INET6, g_tracker_client_ip.ips[0].
{ address, &ipv6_addr) == 1)
char buffer[INET6_ADDRSTRLEN]; {
const char *result = inet_ntop(AF_INET6, &ipv6_addr, buffer, INET6_ADDRSTRLEN); g_server_id_in_filename = *((in_addr_64_t *)((char *)&ipv6_addr + 8));
flag = true;
if (result != NULL) { }
memcpy(&g_server_id_in_filename, &ipv6_addr, sizeof(in_addr_64_t));
if (!flag)
{
logError("file: "__FILE__", line: %d, "
"call inet_pton for ip: %s fail",
__LINE__, g_tracker_client_ip.ips[0].address);
g_server_id_in_filename = INADDR_NONE;
}
flag = true;
}
}
if(!flag)
{
logError("file: "__FILE__", line: %d, " \
"call inet_pton for ip: %s fail", \
__LINE__, g_tracker_client_ip.ips[0].address);
g_server_id_in_filename = INADDR_NONE;
}
if (g_use_storage_id) if (g_use_storage_id)
{ {
ConnectionInfo *pTrackerServer; ConnectionInfo *pTrackerServer;
@ -277,22 +273,25 @@ static int tracker_get_my_server_id()
} }
} }
else else
{ {
snprintf(g_my_server_id_str, sizeof(g_my_server_id_str), "%s", // 当IP地址为IPv6时其storage_id值为IP地址的short code
g_tracker_client_ip.ips[0].address); if (is_ipv6_addr(g_tracker_client_ip.ips[0].address))
} {
fdfs_ip_to_shortcode(g_tracker_client_ip.ips[0].address,
// 当IP地址为IPv6时其storage_id值为IP地址的short code g_my_server_id_str);
if(is_ipv6_addr(g_tracker_client_ip.ips[0].address)){ }
snprintf(g_my_server_id_str, sizeof(g_my_server_id_str), "%s", else
fdfs_ip_to_shortcode(g_tracker_client_ip.ips[0].address, FDFS_DEFAULT_STORAGE_ID_LEN)); {
} snprintf(g_my_server_id_str, sizeof(g_my_server_id_str), "%s",
g_tracker_client_ip.ips[0].address);
}
}
fdfs_multi_ips_to_string(&g_tracker_client_ip, fdfs_multi_ips_to_string(&g_tracker_client_ip,
ip_str, sizeof(ip_str)); ip_str, sizeof(ip_str));
logInfo("file: "__FILE__", line: %d, " logInfo("file: "__FILE__", line: %d, "
"tracker_client_ip: %s, my_server_id_str: %s, " "tracker_client_ip: %s, my_server_id_str: %s, "
"g_server_id_in_filename: %lu", __LINE__, "g_server_id_in_filename: %"PRIu64, __LINE__,
ip_str, g_my_server_id_str, g_server_id_in_filename); ip_str, g_my_server_id_str, g_server_id_in_filename);
return 0; return 0;
} }

View File

@ -25,7 +25,6 @@
#include "tracker_proto.h" #include "tracker_proto.h"
FDFSStorePaths g_fdfs_store_paths = {0, NULL}; FDFSStorePaths g_fdfs_store_paths = {0, NULL};
struct base64_context g_fdfs_base64_context;
BufferInfo g_zero_buffer = {NULL, 0, 0}; BufferInfo g_zero_buffer = {NULL, 0, 0};
int trunk_shared_init() int trunk_shared_init()

View File

@ -67,7 +67,6 @@ extern "C" {
#endif #endif
extern FDFSStorePaths g_fdfs_store_paths; //file store paths extern FDFSStorePaths g_fdfs_store_paths; //file store paths
extern struct base64_context g_fdfs_base64_context; //base64 context
extern BufferInfo g_zero_buffer; //zero buffer for reset extern BufferInfo g_zero_buffer; //zero buffer for reset
typedef int (*stat_func)(const char *filename, struct stat *buf); typedef int (*stat_func)(const char *filename, struct stat *buf);

View File

@ -319,7 +319,7 @@ int fdfs_load_storage_ids(char *content, const char *pStorageIdsFilename)
char *group_name; char *group_name;
char *pHost; char *pHost;
char *pPort; char *pPort;
char *pTmp; char *pSquare;
FDFSStorageIdInfo *pStorageIdInfo; FDFSStorageIdInfo *pStorageIdInfo;
char error_info[256]; char error_info[256];
int alloc_bytes; int alloc_bytes;
@ -430,32 +430,45 @@ int fdfs_load_storage_ids(char *content, const char *pStorageIdsFilename)
pHost++; pHost++;
} }
// 处理IPv6的前'['括号的问题 if (*pHost == '[') //IPv6 address
pTmp = strchr(pHost, '['); {
if (pTmp != NULL) pHost++; //skip [
{ pSquare = strchr(pHost, ']');
pHost++; if (pSquare == NULL)
} {
result = EINVAL;
logError("file: "__FILE__", line: %d, "
"config file: %s, line no: %d, invalid IPv6 "
"address: %s", __LINE__, pStorageIdsFilename,
i + 1, pHost - 1);
break;
}
*pSquare = '\0';
pPort = pSquare + 1;
if (*pPort == ':')
{
pStorageIdInfo->port = atoi(pPort + 1);
}
else
{
pStorageIdInfo->port = 0;
}
}
else
{
pPort = strchr(pHost, ':');
if (pPort != NULL)
{
*pPort = '\0';
pStorageIdInfo->port = atoi(pPort + 1);
}
else
{
pStorageIdInfo->port = 0;
}
}
pPort = strchr(pHost, ']');
if(pPort != NULL){
*pPort = '\0';
pPort++; // ]
pPort++; // :
pStorageIdInfo->port = atoi(pPort + 1);
}else {
pPort = strchr(pHost, ':');
if (pPort != NULL)
{
*pPort = '\0';
pStorageIdInfo->port = atoi(pPort + 1);
}
else
{
pStorageIdInfo->port = 0;
}
}
if ((result=fdfs_parse_multi_ips(pHost, &pStorageIdInfo->ip_addrs, if ((result=fdfs_parse_multi_ips(pHost, &pStorageIdInfo->ip_addrs,
error_info, sizeof(error_info))) != 0) error_info, sizeof(error_info))) != 0)
{ {

View File

@ -436,52 +436,51 @@ void fdfs_set_log_rotate_size(LogContext *pContext, const int64_t log_rotate_siz
} }
} }
void deleteChar(char* str, int index) {
int len = strlen(str);
int i=0;
if (index >= 0 && index < len) {
for (i = index; i < len - 1; i++) {
str[i] = str[i + 1];
}
str[len - 1] = '\0';
}
}
int fdfs_parse_server_info_ex(char *server_str, const int default_port, int fdfs_parse_server_info_ex(char *server_str, const int default_port,
TrackerServerInfo *pServer, const bool resolve) TrackerServerInfo *pServer, const bool resolve)
{ {
char *pSquare;
char *pColon; char *pColon;
char *pTmp;
char *hosts[FDFS_MULTI_IP_MAX_COUNT]; char *hosts[FDFS_MULTI_IP_MAX_COUNT];
ConnectionInfo *conn; ConnectionInfo *conn;
int port; int port;
int i; int i;
memset(pServer, 0, sizeof(TrackerServerInfo)); memset(pServer, 0, sizeof(TrackerServerInfo));
if (*server_str == '[')
{
server_str++;
if ((pSquare=strchr(server_str, ']')) == NULL)
{
logError("file: "__FILE__", line: %d, "
"host \"%s\" is invalid",
__LINE__, server_str - 1);
return EINVAL;
}
if((pTmp=strchr(server_str,'[') )!=NULL){ *pSquare = '\0';
deleteChar(server_str,0); pColon = pSquare + 1; //skip ]
if (*pColon != ':')
{
pColon = NULL;
}
}
else
{
pColon = strrchr(server_str, ':');
} }
if((pColon=strchr(server_str, ']') ) != NULL){ if (pColon == NULL)
*pColon = '\0'; {
pColon++; // ] logInfo("file: "__FILE__", line: %d, "
port = atoi(pColon + 1); "no port part in %s, set port to %d",
}else { __LINE__, server_str, default_port);
if ((pColon=strrchr(server_str, ':')) == NULL) port = default_port;
{ }
logInfo("file: "__FILE__", line: %d, " else
"no port part in %s, set port to %d", {
__LINE__, server_str, default_port); *pColon = '\0';
port = default_port; port = atoi(pColon + 1);
}
else
{
*pColon = '\0';
port = atoi(pColon + 1);
}
} }
conn = pServer->connections; conn = pServer->connections;
@ -808,40 +807,12 @@ void fdfs_set_server_info_ex(TrackerServerInfo *pServer,
} }
} }
char* fdfs_ip_to_shortcode(const char* ipAddr, int shortCodeLength){ char *fdfs_ip_to_shortcode(const char *ipAddr, char *shortCode)
char* shortCode = (char*) malloc(sizeof(char) * (shortCodeLength + 1)); {
memset(shortCode, 0, sizeof(char) * (shortCodeLength + 1)); int64_t crc64;
int len;
char md5Hex[33]; crc64 = CRC32_ex(ipAddr, strlen(ipAddr), CRC32_XINIT);
memset(md5Hex, 0, sizeof(char) * 33); return base64_encode(&g_fdfs_base64_context, (const char *)&crc64,
int nLen = 0; sizeof(crc64), shortCode, &len);
int i = 0; }
int j = 0;
while (nLen < shortCodeLength) {
MD5_CTX context;
my_md5_init(&context);
my_md5_update(&context, (unsigned char*)md5Hex, strlen(md5Hex));
my_md5_update(&context, (unsigned char*)ipAddr, strlen(ipAddr));
unsigned char digest[16];
my_md5_final(digest, &context);
for (i = 0; i < 16; i++) {
char hex[3];
sprintf(hex, "%02x", digest[i]);
for (j = 0; j < 2; j++) {
char c = hex[j];
if (c != '/' && c != '+') {
shortCode[nLen++] = tolower(c);
if (nLen == shortCodeLength) {
break;
}
}
}
if (nLen == shortCodeLength) {
break;
}
}
}
return shortCode;
}

View File

@ -167,7 +167,7 @@ void fdfs_set_server_info(TrackerServerInfo *pServer,
void fdfs_set_server_info_ex(TrackerServerInfo *pServer, void fdfs_set_server_info_ex(TrackerServerInfo *pServer,
const FDFSMultiIP *ip_addrs, const int port); const FDFSMultiIP *ip_addrs, const int port);
char* fdfs_ip_to_shortcode(const char* ipAddr, int shortCodeLength); char *fdfs_ip_to_shortcode(const char *ipAddr, char *shortCode);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -220,7 +220,7 @@ int main(int argc, char *argv[])
return result; return result;
} }
base64_init_ex(&g_base64_context, 0, '-', '_', '.'); base64_init_ex(&g_fdfs_base64_context, 0, '-', '_', '.');
if ((result=set_rand_seed()) != 0) if ((result=set_rand_seed()) != 0)
{ {
logCrit("file: "__FILE__", line: %d, " \ logCrit("file: "__FILE__", line: %d, " \

View File

@ -19,8 +19,6 @@ FDFSStorageReservedSpace g_storage_reserved_space = { \
int g_allow_ip_count = 0; int g_allow_ip_count = 0;
in_addr_64_t *g_allow_ip_addrs = NULL; in_addr_64_t *g_allow_ip_addrs = NULL;
struct base64_context g_base64_context;
bool g_storage_ip_changed_auto_adjust = true; bool g_storage_ip_changed_auto_adjust = true;
bool g_use_storage_id = false; //if use storage ID instead of IP address bool g_use_storage_id = false; //if use storage ID instead of IP address
byte g_id_type_in_filename = FDFS_ID_TYPE_IP_ADDRESS; //id type of the storage server in the filename byte g_id_type_in_filename = FDFS_ID_TYPE_IP_ADDRESS; //id type of the storage server in the filename

View File

@ -44,7 +44,6 @@ extern int g_check_active_interval; //check storage server alive every interval
extern int g_allow_ip_count; /* -1 means match any ip address */ extern int g_allow_ip_count; /* -1 means match any ip address */
extern in_addr_64_t *g_allow_ip_addrs; /* sorted array, asc order */ extern in_addr_64_t *g_allow_ip_addrs; /* sorted array, asc order */
extern struct base64_context g_base64_context;
extern bool g_storage_ip_changed_auto_adjust; extern bool g_storage_ip_changed_auto_adjust;
extern bool g_use_storage_id; //identify storage by ID instead of IP address extern bool g_use_storage_id; //identify storage by ID instead of IP address

View File

@ -3180,13 +3180,17 @@ static FDFSStorageDetail *tracker_mem_get_active_http_server_by_ip( \
memset(&target_storage, 0, sizeof(target_storage)); memset(&target_storage, 0, sizeof(target_storage));
if (!g_use_storage_id) if (!g_use_storage_id)
{ {
strcpy(target_storage.id, ip_addr); // 当IP地址为IPv6时其storage_id值为IP地址的short code
// 当IP地址为IPv6时其storage_id值为IP地址的short code if (is_ipv6_addr(ip_addr))
if(is_ipv6_addr(ip_addr)){ {
strcpy(target_storage.id, fdfs_ip_to_shortcode(ip_addr, FDFS_DEFAULT_STORAGE_ID_LEN)); fdfs_ip_to_shortcode(ip_addr, target_storage.id);
} }
} else
{
strcpy(target_storage.id, ip_addr);
}
}
else else
{ {
FDFSStorageIdInfo *pStorageId; FDFSStorageIdInfo *pStorageId;
@ -3243,7 +3247,7 @@ static FDFSStorageDetail *tracker_mem_get_active_http_server_by_id( \
FDFSStorageDetail *tracker_mem_get_storage_by_ip(FDFSGroupInfo *pGroup, \ FDFSStorageDetail *tracker_mem_get_storage_by_ip(FDFSGroupInfo *pGroup, \
const char *ip_addr) const char *ip_addr)
{ {
const char *storage_id; FDFSStorageId storage_id;
if (g_use_storage_id) if (g_use_storage_id)
{ {
@ -3254,18 +3258,23 @@ FDFSStorageDetail *tracker_mem_get_storage_by_ip(FDFSGroupInfo *pGroup, \
{ {
return NULL; return NULL;
} }
storage_id = pStorageIdInfo->id; storage_id.ptr = pStorageIdInfo->id;
} }
else else
{ {
storage_id = ip_addr; // 当IP地址为IPv6时其storage_id值为IP地址的short code
// 当IP地址为IPv6时其storage_id值为IP地址的short code if (is_ipv6_addr(ip_addr))
if(is_ipv6_addr(ip_addr)){ {
storage_id = fdfs_ip_to_shortcode(ip_addr, FDFS_DEFAULT_STORAGE_ID_LEN); storage_id.ptr = fdfs_ip_to_shortcode(ip_addr,
} storage_id.holder);
} }
else
{
storage_id.ptr = (char *)ip_addr;
}
}
return tracker_mem_get_storage(pGroup, storage_id); return tracker_mem_get_storage(pGroup, storage_id.ptr);
} }
FDFSStorageDetail *tracker_mem_get_storage(FDFSGroupInfo *pGroup, \ FDFSStorageDetail *tracker_mem_get_storage(FDFSGroupInfo *pGroup, \
@ -3658,7 +3667,7 @@ static int _tracker_mem_add_storage(FDFSGroupInfo *pGroup,
const bool bNeedLock, bool *bInserted) const bool bNeedLock, bool *bInserted)
{ {
int result; int result;
const char *storage_id; FDFSStorageId storage_id;
FDFSStorageIdInfo *pStorageIdInfo; FDFSStorageIdInfo *pStorageIdInfo;
FDFSMultiIP multi_ip; FDFSMultiIP multi_ip;
@ -3706,7 +3715,7 @@ static int _tracker_mem_add_storage(FDFSGroupInfo *pGroup,
multi_ip = pStorageIdInfo->ip_addrs; multi_ip = pStorageIdInfo->ip_addrs;
} }
storage_id = id; storage_id.ptr = (char *)id;
} }
else if (g_use_storage_id) else if (g_use_storage_id)
{ {
@ -3722,15 +3731,19 @@ static int _tracker_mem_add_storage(FDFSGroupInfo *pGroup,
} }
multi_ip = pStorageIdInfo->ip_addrs; multi_ip = pStorageIdInfo->ip_addrs;
storage_id = pStorageIdInfo->id; storage_id.ptr = pStorageIdInfo->id;
} }
else else
{ {
storage_id = ip_addr;
// 当IP地址为IPv6时其storage_id值为IP地址的short code // 当IP地址为IPv6时其storage_id值为IP地址的short code
if(is_ipv6_addr(ip_addr)){ if (is_ipv6_addr(ip_addr))
storage_id = fdfs_ip_to_shortcode(ip_addr, FDFS_DEFAULT_STORAGE_ID_LEN); {
} storage_id.ptr = fdfs_ip_to_shortcode(ip_addr, storage_id.holder);
}
else
{
storage_id.ptr = (char *)ip_addr;
}
} }
if (bNeedLock && (result=pthread_mutex_lock(&mem_thread_lock)) != 0) if (bNeedLock && (result=pthread_mutex_lock(&mem_thread_lock)) != 0)
@ -3746,13 +3759,13 @@ static int _tracker_mem_add_storage(FDFSGroupInfo *pGroup,
{ {
result = 0; result = 0;
*bInserted = false; *bInserted = false;
*ppStorageServer = tracker_mem_get_storage(pGroup, storage_id); *ppStorageServer = tracker_mem_get_storage(pGroup, storage_id.ptr);
if (*ppStorageServer != NULL) if (*ppStorageServer != NULL)
{ {
if (g_use_storage_id) if (g_use_storage_id)
{ {
fdfs_set_multi_ip_index(&(*ppStorageServer)->ip_addrs, ip_addr); fdfs_set_multi_ip_index(&(*ppStorageServer)->ip_addrs, ip_addr);
} }
if ((*ppStorageServer)->status==FDFS_STORAGE_STATUS_DELETED \ if ((*ppStorageServer)->status==FDFS_STORAGE_STATUS_DELETED \
|| (*ppStorageServer)->status==FDFS_STORAGE_STATUS_IP_CHANGED) || (*ppStorageServer)->status==FDFS_STORAGE_STATUS_IP_CHANGED)
@ -3775,7 +3788,7 @@ static int _tracker_mem_add_storage(FDFSGroupInfo *pGroup,
*ppStorageServer = *(pGroup->all_servers + pGroup->count); *ppStorageServer = *(pGroup->all_servers + pGroup->count);
snprintf((*ppStorageServer)->id, FDFS_STORAGE_ID_MAX_SIZE, snprintf((*ppStorageServer)->id, FDFS_STORAGE_ID_MAX_SIZE,
"%s", storage_id); "%s", storage_id.ptr);
(*ppStorageServer)->ip_addrs = multi_ip; (*ppStorageServer)->ip_addrs = multi_ip;
if (g_use_storage_id) if (g_use_storage_id)
{ {
@ -4406,7 +4419,7 @@ int tracker_mem_add_group_and_storage(TrackerClientInfo *pClientInfo, \
FDFSStorageDetail **ppServer; FDFSStorageDetail **ppServer;
FDFSStorageDetail **ppEnd; FDFSStorageDetail **ppEnd;
FDFSStorageIdInfo *pStorageIdInfo; FDFSStorageIdInfo *pStorageIdInfo;
const char *storage_id; FDFSStorageId storage_id;
tracker_mem_file_lock(); tracker_mem_file_lock();
@ -4502,17 +4515,20 @@ int tracker_mem_add_group_and_storage(TrackerClientInfo *pClientInfo, \
pClientInfo->pGroup->group_name, ip_addr); pClientInfo->pGroup->group_name, ip_addr);
return ENOENT; return ENOENT;
} }
storage_id = pStorageIdInfo->id; storage_id.ptr = pStorageIdInfo->id;
} }
else else
{ {
pStorageIdInfo = NULL; pStorageIdInfo = NULL;
storage_id = ip_addr;
// 当IP地址为IPv6时其storage_id值为IP地址的short code // 当IP地址为IPv6时其storage_id值为IP地址的short code
if(is_ipv6_addr(ip_addr)){ if (is_ipv6_addr(ip_addr))
storage_id = fdfs_ip_to_shortcode(ip_addr, FDFS_DEFAULT_STORAGE_ID_LEN); {
storage_id.ptr = fdfs_ip_to_shortcode(ip_addr, storage_id.holder);
} }
else
{
storage_id.ptr = (char *)ip_addr;
}
} }
if (pClientInfo->pGroup->storage_port == 0) if (pClientInfo->pGroup->storage_port == 0)
@ -4533,7 +4549,7 @@ int tracker_mem_add_group_and_storage(TrackerClientInfo *pClientInfo, \
for (ppServer=pClientInfo->pGroup->all_servers; \ for (ppServer=pClientInfo->pGroup->all_servers; \
ppServer<ppEnd; ppServer++) ppServer<ppEnd; ppServer++)
{ {
if (strcmp((*ppServer)->id, storage_id) == 0) if (strcmp((*ppServer)->id, storage_id.ptr) == 0)
{ {
(*ppServer)->storage_port = \ (*ppServer)->storage_port = \
pJoinBody->storage_port; pJoinBody->storage_port;
@ -4591,7 +4607,7 @@ int tracker_mem_add_group_and_storage(TrackerClientInfo *pClientInfo, \
for (ppServer=pClientInfo->pGroup->all_servers; \ for (ppServer=pClientInfo->pGroup->all_servers; \
ppServer<ppEnd; ppServer++) ppServer<ppEnd; ppServer++)
{ {
if (strcmp((*ppServer)->id, storage_id) == 0) if (strcmp((*ppServer)->id, storage_id.ptr) == 0)
{ {
(*ppServer)->storage_http_port = \ (*ppServer)->storage_http_port = \
pJoinBody->storage_http_port; pJoinBody->storage_http_port;
@ -4641,7 +4657,8 @@ int tracker_mem_add_group_and_storage(TrackerClientInfo *pClientInfo, \
__LINE__, result, STRERROR(result)); __LINE__, result, STRERROR(result));
return result; return result;
} }
pStorageServer = tracker_mem_get_storage(pClientInfo->pGroup, storage_id); pStorageServer = tracker_mem_get_storage(pClientInfo->pGroup,
storage_id.ptr);
if (pthread_mutex_unlock(&mem_thread_lock) != 0) if (pthread_mutex_unlock(&mem_thread_lock) != 0)
{ {
logError("file: "__FILE__", line: %d, " \ logError("file: "__FILE__", line: %d, " \
@ -4670,8 +4687,8 @@ int tracker_mem_add_group_and_storage(TrackerClientInfo *pClientInfo, \
} }
} }
if ((result=tracker_mem_add_storage(pClientInfo, storage_id, ip_addr, if ((result=tracker_mem_add_storage(pClientInfo, storage_id.ptr,
bNeedSleep, true, &bStorageInserted)) != 0) ip_addr, bNeedSleep, true, &bStorageInserted)) != 0)
{ {
return result; return result;
} }
@ -5666,7 +5683,7 @@ int tracker_mem_get_storage_by_filename(const byte cmd,FDFS_DOWNLOAD_TYPE_PARAM\
char name_buff[64]; char name_buff[64];
int decoded_len; int decoded_len;
base64_decode_auto(&g_base64_context, (char *)filename + \ base64_decode_auto(&g_fdfs_base64_context, (char *)filename + \
FDFS_LOGIC_FILE_PATH_LEN, FDFS_FILENAME_BASE64_LENGTH, \ FDFS_LOGIC_FILE_PATH_LEN, FDFS_FILENAME_BASE64_LENGTH, \
name_buff, &decoded_len); name_buff, &decoded_len);
storage_ip = ntohl(buff2int(name_buff)); storage_ip = ntohl(buff2int(name_buff));

View File

@ -845,7 +845,7 @@ static int tracker_deal_get_storage_id(struct fast_task_info *pTask)
char group_name[FDFS_GROUP_NAME_MAX_LEN + 1]; char group_name[FDFS_GROUP_NAME_MAX_LEN + 1];
char ip_addr[IP_ADDRESS_SIZE]; char ip_addr[IP_ADDRESS_SIZE];
FDFSStorageIdInfo *pFDFSStorageIdInfo; FDFSStorageIdInfo *pFDFSStorageIdInfo;
char *storage_id; FDFSStorageId storage_id;
int nPkgLen; int nPkgLen;
int id_len; int id_len;
@ -897,21 +897,23 @@ static int tracker_deal_get_storage_id(struct fast_task_info *pTask)
return ENOENT; return ENOENT;
} }
storage_id = pFDFSStorageIdInfo->id; storage_id.ptr = pFDFSStorageIdInfo->id;
} }
else else
{ {
storage_id = ip_addr; // 当IP地址为IPv6时其storage_id值为IP地址的short code
// 当IP地址为IPv6时其storage_id值为IP地址的short code if (is_ipv6_addr(ip_addr)) {
if(is_ipv6_addr(ip_addr)){ storage_id.ptr = fdfs_ip_to_shortcode(ip_addr,
storage_id = fdfs_ip_to_shortcode(ip_addr, FDFS_DEFAULT_STORAGE_ID_LEN); storage_id.holder);
} } else {
} storage_id.ptr = ip_addr;
}
}
id_len = strlen(storage_id); id_len = strlen(storage_id.ptr);
pTask->send.ptr->length = sizeof(TrackerHeader) + id_len; pTask->send.ptr->length = sizeof(TrackerHeader) + id_len;
memcpy(pTask->send.ptr->data + sizeof(TrackerHeader), storage_id, id_len); memcpy(pTask->send.ptr->data + sizeof(TrackerHeader),
storage_id.ptr, id_len);
return 0; return 0;
} }
@ -1115,13 +1117,16 @@ static int tracker_deal_fetch_storage_ids(struct fast_task_info *pTask)
fdfs_multi_ips_to_string(&pIdInfo->ip_addrs, fdfs_multi_ips_to_string(&pIdInfo->ip_addrs,
ip_str, sizeof(ip_str)); ip_str, sizeof(ip_str));
if(strchr(ip_str,':')!=NULL){ if (strchr(ip_str, ':') != NULL)
p += sprintf(p, "%s %s [%s]%s\n", pIdInfo->id, {
pIdInfo->group_name, ip_str, szPortPart); p += sprintf(p, "%s %s [%s]%s\n", pIdInfo->id,
}else{ pIdInfo->group_name, ip_str, szPortPart);
p += sprintf(p, "%s %s %s%s\n", pIdInfo->id, }
pIdInfo->group_name, ip_str, szPortPart); else
} {
p += sprintf(p, "%s %s %s%s\n", pIdInfo->id,
pIdInfo->group_name, ip_str, szPortPart);
}
} }
int2buff((int)(pIdInfo - pIdsStart), (char *)pCurrentCount); int2buff((int)(pIdInfo - pIdsStart), (char *)pCurrentCount);

View File

@ -36,8 +36,6 @@
#define FDFS_TRUNK_FILE_INFO_LEN 16 #define FDFS_TRUNK_FILE_INFO_LEN 16
#define FDFS_MAX_SERVER_ID ((1 << 24) - 1) #define FDFS_MAX_SERVER_ID ((1 << 24) - 1)
#define FDFS_DEFAULT_STORAGE_ID_LEN 6
#define FDFS_ID_TYPE_SERVER_ID 1 #define FDFS_ID_TYPE_SERVER_ID 1
#define FDFS_ID_TYPE_IP_ADDRESS 2 #define FDFS_ID_TYPE_IP_ADDRESS 2
@ -473,5 +471,10 @@ typedef struct {
bool if_leader; //if leader bool if_leader; //if leader
} TrackerRunningStatus; } TrackerRunningStatus;
typedef struct {
char *ptr;
char holder[FDFS_STORAGE_ID_MAX_SIZE];
} FDFSStorageId;
#endif #endif