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,
and extent struct FDFSStorePathInfo
* 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

View File

@ -13,6 +13,7 @@
#include "fastcommon/logger.h"
#include "fastcommon/sockopt.h"
#include "fastcommon/shared_func.h"
#include "fastcommon/local_ip_func.h"
#include "tracker_proto.h"
#include "fdfs_global.h"
#include "fdfs_shared_func.h"
@ -109,6 +110,24 @@ bool fdfs_server_equal(TrackerServerInfo *pServer1,
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,
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,
TrackerServerInfo *pServer2);
bool fdfs_server_contain_local_service(TrackerServerInfo *pServerInfo,
const int target_port);
/**
* tracker group get server
* params:

View File

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

View File

@ -177,6 +177,21 @@ static int relationship_cmp_tracker_status(const void *p1, const void *p2)
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)
{
TrackerServerInfo *pTrackerServer;
@ -196,7 +211,7 @@ static int relationship_get_tracker_leader(TrackerRunningStatus *pTrackerStatus)
pTrackerServer<pTrackerEnd; pTrackerServer++)
{
pStatus->pTrackerServer = pTrackerServer;
r = fdfs_get_tracker_status(pTrackerServer, pStatus);
r = relationship_get_tracker_status(pStatus);
if (r == 0)
{
pStatus++;
@ -237,14 +252,6 @@ static int relationship_get_tracker_leader(TrackerRunningStatus *pTrackerStatus)
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, \
ConnectionInfo *pLeader, const char cmd, bool *bConnectFail)
{
@ -320,7 +327,74 @@ static int do_notify_leader_changed(TrackerServerInfo *pTrackerServer, \
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 *pTrackerEnd;
@ -331,11 +405,11 @@ static int relationship_notify_leader_changed(ConnectionInfo *pLeader)
result = ENOENT;
pTrackerEnd = g_tracker_servers.servers + g_tracker_servers.server_count;
success_count = 0;
for (pTrackerServer=g_tracker_servers.servers; \
for (pTrackerServer=g_tracker_servers.servers;
pTrackerServer<pTrackerEnd; pTrackerServer++)
{
if ((result=relationship_notify_next_leader(pTrackerServer, \
pLeader, &bConnectFail)) != 0)
if ((result=relationship_notify_next_leader(pTrackerServer,
pTrackerStatus, &bConnectFail)) != 0)
{
if (!bConnectFail)
{
@ -355,11 +429,11 @@ static int relationship_notify_leader_changed(ConnectionInfo *pLeader)
result = ENOENT;
success_count = 0;
for (pTrackerServer=g_tracker_servers.servers; \
for (pTrackerServer=g_tracker_servers.servers;
pTrackerServer<pTrackerEnd; pTrackerServer++)
{
if ((result=relationship_commit_next_leader(pTrackerServer, \
pLeader, &bConnectFail)) != 0)
if ((result=relationship_commit_next_leader(pTrackerServer,
pTrackerStatus, &bConnectFail)) != 0)
{
if (!bConnectFail)
{
@ -399,9 +473,11 @@ static int relationship_select_leader()
}
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;
}

View File

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

View File

@ -897,8 +897,8 @@ static int tracker_deal_notify_next_leader(struct fast_task_info *pTask)
return ENOENT;
}
if (g_if_leader_self && (leader.port != g_server_port || \
!is_local_host_ip(leader.ip_addr)))
if (g_if_leader_self && !(leader.port == g_server_port &&
is_local_host_ip(leader.ip_addr)))
{
g_if_leader_self = false;
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];
ConnectionInfo leader;
int server_index;
bool leader_self;
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;
}
g_tracker_servers.leader_index = server_index;
g_next_leader_index = -1;
if (leader.port == g_server_port && is_local_host_ip(leader.ip_addr))
{
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);
}
leader_self = (leader.port == g_server_port) &&
is_local_host_ip(leader.ip_addr);
relationship_set_tracker_leader(server_index, &leader, leader_self);
return 0;
}