TD-2153
This commit is contained in:
commit
b95df0b84a
|
@ -68,6 +68,9 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t role;
|
int8_t role;
|
||||||
int8_t ack;
|
int8_t ack;
|
||||||
|
int8_t type;
|
||||||
|
int8_t reserved[3];
|
||||||
|
uint16_t tranId;
|
||||||
uint64_t version;
|
uint64_t version;
|
||||||
SPeerStatus peersStatus[];
|
SPeerStatus peersStatus[];
|
||||||
} SPeersStatus;
|
} SPeersStatus;
|
||||||
|
|
|
@ -50,7 +50,7 @@ static int32_t tsSyncRefId = -1;
|
||||||
static void syncProcessSyncRequest(char *pMsg, SSyncPeer *pPeer);
|
static void syncProcessSyncRequest(char *pMsg, SSyncPeer *pPeer);
|
||||||
static void syncRecoverFromMaster(SSyncPeer *pPeer);
|
static void syncRecoverFromMaster(SSyncPeer *pPeer);
|
||||||
static void syncCheckPeerConnection(void *param, void *tmrId);
|
static void syncCheckPeerConnection(void *param, void *tmrId);
|
||||||
static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack);
|
static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack, int8_t type, uint16_t tranId);
|
||||||
static void syncProcessBrokenLink(void *param);
|
static void syncProcessBrokenLink(void *param);
|
||||||
static int32_t syncProcessPeerMsg(void *param, void *buffer);
|
static int32_t syncProcessPeerMsg(void *param, void *buffer);
|
||||||
static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp);
|
static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp);
|
||||||
|
@ -73,6 +73,28 @@ char* syncRole[] = {
|
||||||
"master"
|
"master"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SYNC_STATUS_BROADCAST,
|
||||||
|
SYNC_STATUS_BROADCAST_RSP,
|
||||||
|
SYNC_STATUS_SETUP_CONN,
|
||||||
|
SYNC_STATUS_SETUP_CONN_RSP,
|
||||||
|
SYNC_STATUS_EXCHANGE_DATA,
|
||||||
|
SYNC_STATUS_EXCHANGE_DATA_RSP
|
||||||
|
} ESyncStatusType;
|
||||||
|
|
||||||
|
char *statusType[] = {
|
||||||
|
"broadcast",
|
||||||
|
"broadcast-rsp",
|
||||||
|
"setup-conn",
|
||||||
|
"setup-conn-rsp",
|
||||||
|
"exchange-data",
|
||||||
|
"exchange-data-rsp"
|
||||||
|
};
|
||||||
|
|
||||||
|
uint16_t syncGenTranId() {
|
||||||
|
return taosRand() & 0XFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t syncInit() {
|
int32_t syncInit() {
|
||||||
SPoolInfo info;
|
SPoolInfo info;
|
||||||
|
|
||||||
|
@ -524,7 +546,7 @@ void syncBroadcastStatus(SSyncNode *pNode) {
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t i = 0; i < pNode->replica; ++i) {
|
||||||
if (i == pNode->selfIndex) continue;
|
if (i == pNode->selfIndex) continue;
|
||||||
pPeer = pNode->peerInfo[i];
|
pPeer = pNode->peerInfo[i];
|
||||||
syncSendPeersStatusMsgToPeer(pPeer, 1);
|
syncSendPeersStatusMsgToPeer(pPeer, 1, SYNC_STATUS_BROADCAST, syncGenTranId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -891,14 +913,14 @@ static void syncProcessPeersStatusMsg(char *cont, SSyncPeer *pPeer) {
|
||||||
SSyncNode * pNode = pPeer->pSyncNode;
|
SSyncNode * pNode = pPeer->pSyncNode;
|
||||||
SPeersStatus *pPeersStatus = (SPeersStatus *)cont;
|
SPeersStatus *pPeersStatus = (SPeersStatus *)cont;
|
||||||
|
|
||||||
sDebug("%s, status msg is received, self:%s sver:%" PRIu64 " peer:%s sver:%" PRIu64 ", ack:%d", pPeer->id,
|
sDebug("%s, status msg is received, self:%s sver:%" PRIu64 " peer:%s sver:%" PRIu64 ", ack:%d tranId:%u type:%s", pPeer->id,
|
||||||
syncRole[nodeRole], nodeVersion, syncRole[pPeersStatus->role], pPeersStatus->version, pPeersStatus->ack);
|
syncRole[nodeRole], nodeVersion, syncRole[pPeersStatus->role], pPeersStatus->version, pPeersStatus->ack, pPeersStatus->tranId, statusType[pPeersStatus->type]);
|
||||||
|
|
||||||
pPeer->version = pPeersStatus->version;
|
pPeer->version = pPeersStatus->version;
|
||||||
syncCheckRole(pPeer, pPeersStatus->peersStatus, pPeersStatus->role);
|
syncCheckRole(pPeer, pPeersStatus->peersStatus, pPeersStatus->role);
|
||||||
|
|
||||||
if (pPeersStatus->ack) {
|
if (pPeersStatus->ack) {
|
||||||
syncSendPeersStatusMsgToPeer(pPeer, 0);
|
syncSendPeersStatusMsgToPeer(pPeer, 0, pPeersStatus->type + 1, pPeersStatus->tranId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -956,7 +978,7 @@ static int32_t syncProcessPeerMsg(void *param, void *buffer) {
|
||||||
|
|
||||||
#define statusMsgLen sizeof(SSyncHead) + sizeof(SPeersStatus) + sizeof(SPeerStatus) * TAOS_SYNC_MAX_REPLICA
|
#define statusMsgLen sizeof(SSyncHead) + sizeof(SPeersStatus) + sizeof(SPeerStatus) * TAOS_SYNC_MAX_REPLICA
|
||||||
|
|
||||||
static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack) {
|
static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack, int8_t type, uint16_t tranId) {
|
||||||
SSyncNode *pNode = pPeer->pSyncNode;
|
SSyncNode *pNode = pPeer->pSyncNode;
|
||||||
char msg[statusMsgLen] = {0};
|
char msg[statusMsgLen] = {0};
|
||||||
|
|
||||||
|
@ -971,6 +993,8 @@ static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack) {
|
||||||
pPeersStatus->version = nodeVersion;
|
pPeersStatus->version = nodeVersion;
|
||||||
pPeersStatus->role = nodeRole;
|
pPeersStatus->role = nodeRole;
|
||||||
pPeersStatus->ack = ack;
|
pPeersStatus->ack = ack;
|
||||||
|
pPeersStatus->type = type;
|
||||||
|
pPeersStatus->tranId = tranId;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pNode->replica; ++i) {
|
for (int32_t i = 0; i < pNode->replica; ++i) {
|
||||||
pPeersStatus->peersStatus[i].role = pNode->peerInfo[i]->role;
|
pPeersStatus->peersStatus[i].role = pNode->peerInfo[i]->role;
|
||||||
|
@ -979,8 +1003,8 @@ static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack) {
|
||||||
|
|
||||||
int32_t retLen = write(pPeer->peerFd, msg, statusMsgLen);
|
int32_t retLen = write(pPeer->peerFd, msg, statusMsgLen);
|
||||||
if (retLen == statusMsgLen) {
|
if (retLen == statusMsgLen) {
|
||||||
sDebug("%s, status msg is sent, self:%s sver:%" PRIu64 ", ack:%d", pPeer->id, syncRole[pPeersStatus->role],
|
sDebug("%s, status msg is sent, self:%s sver:%" PRIu64 ", ack:%d tranId:%u type:%s", pPeer->id, syncRole[pPeersStatus->role],
|
||||||
pPeersStatus->version, pPeersStatus->ack);
|
pPeersStatus->version, pPeersStatus->ack, pPeersStatus->tranId, statusType[pPeersStatus->type]);
|
||||||
} else {
|
} else {
|
||||||
sDebug("%s, failed to send status msg, restart", pPeer->id);
|
sDebug("%s, failed to send status msg, restart", pPeer->id);
|
||||||
syncRestartConnection(pPeer);
|
syncRestartConnection(pPeer);
|
||||||
|
@ -995,7 +1019,7 @@ static void syncSetupPeerConnection(SSyncPeer *pPeer) {
|
||||||
taosTmrStopA(&pPeer->timer);
|
taosTmrStopA(&pPeer->timer);
|
||||||
if (pPeer->peerFd >= 0) {
|
if (pPeer->peerFd >= 0) {
|
||||||
sDebug("%s, send role version to peer", pPeer->id);
|
sDebug("%s, send role version to peer", pPeer->id);
|
||||||
syncSendPeersStatusMsgToPeer(pPeer, 1);
|
syncSendPeersStatusMsgToPeer(pPeer, 1, SYNC_STATUS_SETUP_CONN, syncGenTranId());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1108,7 +1132,7 @@ static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
|
||||||
pPeer->pConn = taosAllocateTcpConn(tsTcpPool, pPeer, connFd);
|
pPeer->pConn = taosAllocateTcpConn(tsTcpPool, pPeer, connFd);
|
||||||
syncAddPeerRef(pPeer);
|
syncAddPeerRef(pPeer);
|
||||||
sDebug("%s, ready to exchange data", pPeer->id);
|
sDebug("%s, ready to exchange data", pPeer->id);
|
||||||
syncSendPeersStatusMsgToPeer(pPeer, 1);
|
syncSendPeersStatusMsgToPeer(pPeer, 1, SYNC_STATUS_EXCHANGE_DATA, syncGenTranId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue