diff --git a/HISTORY b/HISTORY index 755a31a..a22fd10 100644 --- a/HISTORY +++ b/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 diff --git a/tracker/fdfs_shared_func.c b/tracker/fdfs_shared_func.c index 6e76ea9..61397db 100644 --- a/tracker/fdfs_shared_func.c +++ b/tracker/fdfs_shared_func.c @@ -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) { diff --git a/tracker/fdfs_shared_func.h b/tracker/fdfs_shared_func.h index b8903ec..38a79ac 100644 --- a/tracker/fdfs_shared_func.h +++ b/tracker/fdfs_shared_func.h @@ -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: diff --git a/tracker/tracker_mem.c b/tracker/tracker_mem.c index e5917f4..90c574d 100644 --- a/tracker/tracker_mem.c +++ b/tracker/tracker_mem.c @@ -4275,8 +4275,7 @@ static int tracker_mem_get_tracker_server(FDFSStorageJoinBody *pJoinBody, \ for (pTrackerServer=pJoinBody->tracker_servers; pTrackerServerconnections[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; } diff --git a/tracker/tracker_relationship.c b/tracker/tracker_relationship.c index 7f5721a..64991d1 100644 --- a/tracker/tracker_relationship.c +++ b/tracker/tracker_relationship.c @@ -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) pTrackerServerpTrackerServer = 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; pTrackerServerconnections; - 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; } diff --git a/tracker/tracker_relationship.h b/tracker/tracker_relationship.h index 69fd9f3..4e0dc47 100644 --- a/tracker/tracker_relationship.h +++ b/tracker/tracker_relationship.h @@ -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 diff --git a/tracker/tracker_service.c b/tracker/tracker_service.c index 1ae44bb..7f56eab 100644 --- a/tracker/tracker_service.c +++ b/tracker/tracker_service.c @@ -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; }