new selected tracker leader do NOT notify self by network
parent
afff529a9b
commit
358fff4ac8
1
HISTORY
1
HISTORY
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue