new selected tracker leader do NOT notify self by network

v6.03_dev
YuQing 2019-11-18 22:30:10 +08:00
parent afff529a9b
commit 358fff4ac8
7 changed files with 127 additions and 35 deletions

View File

@ -10,6 +10,7 @@ Version 6.03 2019-11-17
* code refine: combine g_fdfs_store_paths and g_path_space_list, * code refine: combine g_fdfs_store_paths and g_path_space_list,
and extent struct FDFSStorePathInfo and extent struct FDFSStorePathInfo
* check store path's mark file to prevent confusion * check store path's mark file to prevent confusion
* new selected tracker leader do NOT notify self by network
NOTE: the tracker and storage server must upgrade together NOTE: the tracker and storage server must upgrade together

View File

@ -13,6 +13,7 @@
#include "fastcommon/logger.h" #include "fastcommon/logger.h"
#include "fastcommon/sockopt.h" #include "fastcommon/sockopt.h"
#include "fastcommon/shared_func.h" #include "fastcommon/shared_func.h"
#include "fastcommon/local_ip_func.h"
#include "tracker_proto.h" #include "tracker_proto.h"
#include "fdfs_global.h" #include "fdfs_global.h"
#include "fdfs_shared_func.h" #include "fdfs_shared_func.h"
@ -109,6 +110,24 @@ bool fdfs_server_equal(TrackerServerInfo *pServer1,
return true; return true;
} }
bool fdfs_server_contain_local_service(TrackerServerInfo *pServerInfo,
const int target_port)
{
const char *current_ip;
current_ip = get_first_local_ip();
while (current_ip != NULL)
{
if (fdfs_server_contain(pServerInfo, current_ip, target_port))
{
return true;
}
current_ip = get_next_local_ip(current_ip);
}
return false;
}
TrackerServerInfo *fdfs_tracker_group_get_server(TrackerServerGroup *pGroup, TrackerServerInfo *fdfs_tracker_group_get_server(TrackerServerGroup *pGroup,
const char *target_ip, const int target_port) const char *target_ip, const int target_port)
{ {

View File

@ -80,6 +80,9 @@ bool fdfs_server_contain_ex(TrackerServerInfo *pServer1,
bool fdfs_server_equal(TrackerServerInfo *pServer1, bool fdfs_server_equal(TrackerServerInfo *pServer1,
TrackerServerInfo *pServer2); TrackerServerInfo *pServer2);
bool fdfs_server_contain_local_service(TrackerServerInfo *pServerInfo,
const int target_port);
/** /**
* tracker group get server * tracker group get server
* params: * params:

View File

@ -4275,8 +4275,7 @@ static int tracker_mem_get_tracker_server(FDFSStorageJoinBody *pJoinBody, \
for (pTrackerServer=pJoinBody->tracker_servers; for (pTrackerServer=pJoinBody->tracker_servers;
pTrackerServer<pTrackerEnd; pTrackerServer++) pTrackerServer<pTrackerEnd; pTrackerServer++)
{ {
if (pTrackerServer->connections[0].port == g_server_port && if (fdfs_server_contain_local_service(pTrackerServer, g_server_port))
is_local_host_ip(pTrackerServer->connections[0].ip_addr))
{ {
continue; continue;
} }

View File

@ -177,6 +177,21 @@ static int relationship_cmp_tracker_status(const void *p1, const void *p2)
return conn1->port - conn2->port; return conn1->port - conn2->port;
} }
static int relationship_get_tracker_status(TrackerRunningStatus *pStatus)
{
if (fdfs_server_contain_local_service(pStatus->pTrackerServer,
g_server_port))
{
tracker_calc_running_times(pStatus);
pStatus->if_leader = g_if_leader_self;
return 0;
}
else
{
return fdfs_get_tracker_status(pStatus->pTrackerServer, pStatus);
}
}
static int relationship_get_tracker_leader(TrackerRunningStatus *pTrackerStatus) static int relationship_get_tracker_leader(TrackerRunningStatus *pTrackerStatus)
{ {
TrackerServerInfo *pTrackerServer; TrackerServerInfo *pTrackerServer;
@ -196,7 +211,7 @@ static int relationship_get_tracker_leader(TrackerRunningStatus *pTrackerStatus)
pTrackerServer<pTrackerEnd; pTrackerServer++) pTrackerServer<pTrackerEnd; pTrackerServer++)
{ {
pStatus->pTrackerServer = pTrackerServer; pStatus->pTrackerServer = pTrackerServer;
r = fdfs_get_tracker_status(pTrackerServer, pStatus); r = relationship_get_tracker_status(pStatus);
if (r == 0) if (r == 0)
{ {
pStatus++; pStatus++;
@ -237,14 +252,6 @@ static int relationship_get_tracker_leader(TrackerRunningStatus *pTrackerStatus)
return 0; return 0;
} }
#define relationship_notify_next_leader(pTrackerServer, pLeader, bConnectFail) \
do_notify_leader_changed(pTrackerServer, pLeader, \
TRACKER_PROTO_CMD_TRACKER_NOTIFY_NEXT_LEADER, bConnectFail)
#define relationship_commit_next_leader(pTrackerServer, pLeader, bConnectFail) \
do_notify_leader_changed(pTrackerServer, pLeader, \
TRACKER_PROTO_CMD_TRACKER_COMMIT_NEXT_LEADER, bConnectFail)
static int do_notify_leader_changed(TrackerServerInfo *pTrackerServer, \ static int do_notify_leader_changed(TrackerServerInfo *pTrackerServer, \
ConnectionInfo *pLeader, const char cmd, bool *bConnectFail) ConnectionInfo *pLeader, const char cmd, bool *bConnectFail)
{ {
@ -320,7 +327,74 @@ static int do_notify_leader_changed(TrackerServerInfo *pTrackerServer, \
return result; return result;
} }
static int relationship_notify_leader_changed(ConnectionInfo *pLeader) void relationship_set_tracker_leader(const int server_index,
ConnectionInfo *pLeader, const bool leader_self)
{
g_tracker_servers.leader_index = server_index;
g_next_leader_index = -1;
if (leader_self)
{
g_if_leader_self = true;
g_tracker_leader_chg_count++;
}
else
{
logInfo("file: "__FILE__", line: %d, "
"the tracker leader is %s:%d", __LINE__,
pLeader->ip_addr, pLeader->port);
}
}
static int relationship_notify_next_leader(TrackerServerInfo *pTrackerServer,
TrackerRunningStatus *pTrackerStatus, bool *bConnectFail)
{
if (pTrackerStatus->pTrackerServer == pTrackerServer)
{
g_next_leader_index = pTrackerServer - g_tracker_servers.servers;
return 0;
}
else
{
ConnectionInfo *pLeader;
pLeader = pTrackerStatus->pTrackerServer->connections;
return do_notify_leader_changed(pTrackerServer, pLeader,
TRACKER_PROTO_CMD_TRACKER_NOTIFY_NEXT_LEADER, bConnectFail);
}
}
static int relationship_commit_next_leader(TrackerServerInfo *pTrackerServer,
TrackerRunningStatus *pTrackerStatus, bool *bConnectFail)
{
ConnectionInfo *pLeader;
pLeader = pTrackerStatus->pTrackerServer->connections;
if (pTrackerStatus->pTrackerServer == pTrackerServer)
{
int server_index;
int expect_index;
server_index = g_next_leader_index;
expect_index = pTrackerServer - g_tracker_servers.servers;
if (server_index != expect_index)
{
logError("file: "__FILE__", line: %d, "
"g_next_leader_index: %d != expected: %d",
__LINE__, server_index, expect_index);
g_next_leader_index = -1;
return EBUSY;
}
relationship_set_tracker_leader(server_index, pLeader, true);
return 0;
}
else
{
return do_notify_leader_changed(pTrackerServer, pLeader,
TRACKER_PROTO_CMD_TRACKER_COMMIT_NEXT_LEADER, bConnectFail);
}
}
static int relationship_notify_leader_changed(TrackerRunningStatus *pTrackerStatus)
{ {
TrackerServerInfo *pTrackerServer; TrackerServerInfo *pTrackerServer;
TrackerServerInfo *pTrackerEnd; TrackerServerInfo *pTrackerEnd;
@ -331,11 +405,11 @@ static int relationship_notify_leader_changed(ConnectionInfo *pLeader)
result = ENOENT; result = ENOENT;
pTrackerEnd = g_tracker_servers.servers + g_tracker_servers.server_count; pTrackerEnd = g_tracker_servers.servers + g_tracker_servers.server_count;
success_count = 0; success_count = 0;
for (pTrackerServer=g_tracker_servers.servers; \ for (pTrackerServer=g_tracker_servers.servers;
pTrackerServer<pTrackerEnd; pTrackerServer++) pTrackerServer<pTrackerEnd; pTrackerServer++)
{ {
if ((result=relationship_notify_next_leader(pTrackerServer, \ if ((result=relationship_notify_next_leader(pTrackerServer,
pLeader, &bConnectFail)) != 0) pTrackerStatus, &bConnectFail)) != 0)
{ {
if (!bConnectFail) if (!bConnectFail)
{ {
@ -355,11 +429,11 @@ static int relationship_notify_leader_changed(ConnectionInfo *pLeader)
result = ENOENT; result = ENOENT;
success_count = 0; success_count = 0;
for (pTrackerServer=g_tracker_servers.servers; \ for (pTrackerServer=g_tracker_servers.servers;
pTrackerServer<pTrackerEnd; pTrackerServer++) pTrackerServer<pTrackerEnd; pTrackerServer++)
{ {
if ((result=relationship_commit_next_leader(pTrackerServer, \ if ((result=relationship_commit_next_leader(pTrackerServer,
pLeader, &bConnectFail)) != 0) pTrackerStatus, &bConnectFail)) != 0)
{ {
if (!bConnectFail) if (!bConnectFail)
{ {
@ -399,9 +473,11 @@ static int relationship_select_leader()
} }
conn = trackerStatus.pTrackerServer->connections; conn = trackerStatus.pTrackerServer->connections;
if (conn->port == g_server_port && is_local_host_ip(conn->ip_addr)) if (fdfs_server_contain_local_service(trackerStatus.
pTrackerServer, g_server_port))
{ {
if ((result=relationship_notify_leader_changed(conn)) != 0) if ((result=relationship_notify_leader_changed(
&trackerStatus)) != 0)
{ {
return result; return result;
} }

View File

@ -24,6 +24,9 @@ extern bool g_if_leader_self; //if I am leader
int tracker_relationship_init(); int tracker_relationship_init();
int tracker_relationship_destroy(); int tracker_relationship_destroy();
void relationship_set_tracker_leader(const int server_index,
ConnectionInfo *pLeader, const bool if_leader_self);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -897,8 +897,8 @@ static int tracker_deal_notify_next_leader(struct fast_task_info *pTask)
return ENOENT; return ENOENT;
} }
if (g_if_leader_self && (leader.port != g_server_port || \ if (g_if_leader_self && !(leader.port == g_server_port &&
!is_local_host_ip(leader.ip_addr))) is_local_host_ip(leader.ip_addr)))
{ {
g_if_leader_self = false; g_if_leader_self = false;
g_tracker_servers.leader_index = -1; g_tracker_servers.leader_index = -1;
@ -922,6 +922,7 @@ static int tracker_deal_commit_next_leader(struct fast_task_info *pTask)
char *ipAndPort[2]; char *ipAndPort[2];
ConnectionInfo leader; ConnectionInfo leader;
int server_index; int server_index;
bool leader_self;
if (pTask->length - sizeof(TrackerHeader) != FDFS_PROTO_IP_PORT_SIZE) if (pTask->length - sizeof(TrackerHeader) != FDFS_PROTO_IP_PORT_SIZE)
{ {
@ -969,19 +970,9 @@ static int tracker_deal_commit_next_leader(struct fast_task_info *pTask)
return EINVAL; return EINVAL;
} }
g_tracker_servers.leader_index = server_index; leader_self = (leader.port == g_server_port) &&
g_next_leader_index = -1; is_local_host_ip(leader.ip_addr);
if (leader.port == g_server_port && is_local_host_ip(leader.ip_addr)) relationship_set_tracker_leader(server_index, &leader, leader_self);
{
g_if_leader_self = true;
g_tracker_leader_chg_count++;
}
else
{
logInfo("file: "__FILE__", line: %d, " \
"the tracker leader is %s:%d", __LINE__, \
leader.ip_addr, leader.port);
}
return 0; return 0;
} }