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,
|
* 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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue