优化目标节点地址信息在发送消息路径上的传递方式
目前的传递方式是,先把64位的nodeid转为NodeInfo,再从NodeInfo获取ip和port,再把ip和port转换为sockaddr_in。其实64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略。传递ip和port过程中,带来了一些额外操作(详情请看下文的源码注释)。发送消息路径是热路径,有必要优化传递方式。
原代码路径:
src/communicate/communicate.h
class Communicate : public MsgTransport
{
// ......
// 64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int Send(const int iGroupIdx, const nodeid_t iNodeID,
const NodeInfo & tNodeInfo, const std::string & sMessage, const int iSendType);
// ......
};
src/communicate/communicate.cpp
// 64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int Communicate :: Send(const int iGroupIdx, const nodeid_t iNodeID,
const NodeInfo & oNodeInfo, const std::string & sMessage, const int iSendType)
{
if ((int)sMessage.size() > MAX_VALUE_SIZE)
{
BP->GetNetworkBP()->SendRejectByTooLargeSize();
PLGErr("Message size too large %zu, max size %u, skip message",
sMessage.size(), MAX_VALUE_SIZE);
return 0;
}
BP->GetNetworkBP()->Send(sMessage);
if (sMessage.size() > m_iUDPMaxSize || iSendType == Message_SendType_TCP)
{
BP->GetNetworkBP()->SendTcp(sMessage);
return m_poNetwork->SendMessageTCP(iGroupIdx, oNodeInfo.GetIP(), oNodeInfo.GetPort(), sMessage);
}
else
{
BP->GetNetworkBP()->SendUdp(sMessage);
return m_poNetwork->SendMessageUDP(iGroupIdx, oNodeInfo.GetIP(), oNodeInfo.GetPort(), sMessage);
}
}
int Communicate :: SendMessage(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage, const int iSendType)
{
return Send(iGroupIdx, iSendtoNodeID, NodeInfo(iSendtoNodeID), sMessage, iSendType);
}
int Communicate :: BroadcastMessage(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
const std::set<nodeid_t> & setNodeInfo = m_poConfig->GetSystemVSM()->GetMembershipMap();
for (auto & it : setNodeInfo)
{
if (it != m_iMyNodeID)
{
Send(iGroupIdx, it, NodeInfo(it), sMessage, iSendType);
}
}
return 0;
}
int Communicate :: BroadcastMessageFollower(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
const std::map<nodeid_t, uint64_t> & mapFollowerNodeInfo = m_poConfig->GetMyFollowerMap();
for (auto & it : mapFollowerNodeInfo)
{
if (it.first != m_iMyNodeID)
{
Send(iGroupIdx, it.first, NodeInfo(it.first), sMessage, iSendType);
}
}
PLGDebug("%zu node", mapFollowerNodeInfo.size());
return 0;
}
int Communicate :: BroadcastMessageTempNode(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
const std::map<nodeid_t, uint64_t> & mapTempNode = m_poConfig->GetTmpNodeMap();
for (auto & it : mapTempNode)
{
if (it.first != m_iMyNodeID)
{
Send(iGroupIdx, it.first, NodeInfo(it.first), sMessage, iSendType);
}
}
PLGDebug("%zu node", mapTempNode.size());
return 0;
}
include/phxpaxos/network.h
class NetWork
{
// ......
// 64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
virtual int SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage) = 0;
virtual int SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage) = 0;
// ......
};
src/communicate/dfnetwork.h
class DFNetWork : public NetWork
{
// ......
// 64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage);
int SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage);
// ......
};
src/communicate/dfnetwork.cpp
// 64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int DFNetWork :: SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage)
{
return m_oTcpIOThread.AddMessage(iGroupIdx, sIp, iPort, sMessage);
}
int DFNetWork :: SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage)
{
return m_oUDPSend.AddMessage(sIp, iPort, sMessage);
}
src/communicate/tcp/tcp.h
class TcpWrite : public Thread
{
// ......
// 64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
// ......
};
class TcpIOThread
{
// ......
// 64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int AddMessage(const int iGroupIdx, const std::string & sIP, const int iPort, const std::string & sMessage);
// ......
};
src/communicate/tcp/tcp.cpp
// 64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int TcpWrite :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
{
return m_oTcpClient.AddMessage(sIP, iPort, sMessage);
}
// ......
// 64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略
int TcpIOThread :: AddMessage(const int iGroupIdx, const std::string & sIP, const int iPort, const std::string & sMessage)
{
int iIndex = iGroupIdx % (int)m_vecTcpWrite.size();
return m_vecTcpWrite[iIndex]->AddMessage(sIP, iPort, sMessage);
}
src/communicate/tcp/tcp_client.h
class TcpClient
{
// ......
// 传递ip和port过程中,带来了一些额外操作
int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
// .......
// 传递ip和port过程中,带来了一些额外操作
MessageEvent * GetEvent(const std::string & sIP, const int iPort);
MessageEvent * CreateEvent(const uint64_t llNodeID, const std::string & sIP, const int iPort);
// ......
};
src/communicate/tcp/tcp_client.cpp
// 传递ip和port过程中,带来了一些额外操作
int TcpClient :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
{
//PLImp("ok");
// 在GetEvent,每次都要从ip和port转换回64位的nodeid
MessageEvent * poEvent = GetEvent(sIP, iPort);
if (poEvent == nullptr)
{
PLErr("no event created for this ip %s port %d", sIP.c_str(), iPort);
return -1;
}
return poEvent->AddMessage(sMessage);
}
// 传递ip和port过程中,带来了一些额外操作
MessageEvent * TcpClient :: GetEvent(const std::string & sIP, const int iPort)
{
// 每次都要从ip和port转换回64位的nodeid
uint32_t iIP = (uint32_t)inet_addr(sIP.c_str());
uint64_t llNodeID = (((uint64_t)iIP) << 32) | iPort;
std::lock_guard<std::mutex> oLockGuard(m_oMutex);
auto it = m_mapEvent.find(llNodeID);
if (it != end(m_mapEvent))
{
return it->second;
}
return CreateEvent(llNodeID, sIP, iPort);
}
MessageEvent * TcpClient :: CreateEvent(const uint64_t llNodeID, const std::string & sIP, const int iPort)
{
PLImp("start, ip %s port %d", sIP.c_str(), iPort);
Socket oSocket;
oSocket.setNonBlocking(true);
oSocket.setNoDelay(true);
SocketAddress oAddr(sIP, iPort);
oSocket.connect(oAddr);
MessageEvent * poEvent = new MessageEvent(MessageEventType_SEND, oSocket.detachSocketHandle(),
oAddr, m_poEventLoop, m_poNetWork);
assert(poEvent != nullptr);
m_mapEvent[llNodeID] = poEvent;
m_vecEvent.push_back(poEvent);
PLImp("ok, ip %s port %d", sIP.c_str(), iPort);
return poEvent;
}
src/communicate/udp.h
class UDPSend : public Thread
{
// ......
// 传递ip和port过程中,带来了一些额外操作
int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
struct QueueData
{
std::string m_sIP;
int m_iPort;
std::string m_sMessage;
};
private:
void SendMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
// ......
};
src/communicate/udp.cpp
void UDPSend :: SendMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
{
// 每次都要从ip转换回nodeid的高32位
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
addr.sin_addr.s_addr = inet_addr(sIP.c_str());
int ret = sendto(m_iSockFD, sMessage.data(), (int)sMessage.size(), 0, (struct sockaddr *)&addr, addr_len);
if (ret > 0)
{
BP->GetNetworkBP()->UDPRealSend(sMessage);
}
}
void UDPSend :: run()
{
m_bIsStarted = true;
while(true)
{
QueueData * poData = nullptr;
m_oSendQueue.lock();
bool bSucc = m_oSendQueue.peek(poData, 1000);
if (bSucc)
{
m_oSendQueue.pop();
}
m_oSendQueue.unlock();
if (poData != nullptr)
{
// 在SendMessage中, 每次都要从ip转换回nodeid的高32位
SendMessage(poData->m_sIP, poData->m_iPort, poData->m_sMessage);
delete poData;
}
if (m_bIsEnd)
{
PLHead("UDPSend [END]");
return;
}
}
}
int UDPSend :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
{
m_oSendQueue.lock();
if ((int)m_oSendQueue.size() > UDP_QUEUE_MAXLEN)
{
BP->GetNetworkBP()->UDPQueueFull();
//PLErr("queue length %d too long, can't enqueue", m_oSendQueue.size());
m_oSendQueue.unlock();
return -2;
}
// 拷贝ip和port,最少需要拷贝9个字节(合法的ip字符串最少需要7个字符,类型为int的port最少需要2个字节),ip字符串还有一些构造函数和析构函数的开销。拷贝64为nodeid,只需要8字节
QueueData * poData = new QueueData;
poData->m_sIP = sIP;
poData->m_iPort = iPort;
poData->m_sMessage = sMessage;
m_oSendQueue.add(poData);
m_oSendQueue.unlock();
return 0;
}
修改后的代码路径:
src/communicate/communicate.h
class Communicate : public MsgTransport
{
// ......
/*
int Send(const int iGroupIdx, const nodeid_t iNodeID,
const NodeInfo & tNodeInfo, const std::string & sMessage, const int iSendType);
*/
// 修改代码
int Send(const int iGroupIdx, const nodeid_t iNodeID,
const std::string & sMessage, const int iSendType);
// ......
};
src/communicate/communicate.cpp
/*
int Communicate :: Send(const int iGroupIdx, const nodeid_t iNodeID,
const NodeInfo & oNodeInfo, const std::string & sMessage, const int iSendType)
*/
// 修改代码
int Communicate :: Send(const int iGroupIdx, const nodeid_t iNodeID,
const std::string & sMessage, const int iSendType)
{
if ((int)sMessage.size() > MAX_VALUE_SIZE)
{
BP->GetNetworkBP()->SendRejectByTooLargeSize();
PLGErr("Message size too large %zu, max size %u, skip message",
sMessage.size(), MAX_VALUE_SIZE);
return 0;
}
BP->GetNetworkBP()->Send(sMessage);
if (sMessage.size() > m_iUDPMaxSize || iSendType == Message_SendType_TCP)
{
BP->GetNetworkBP()->SendTcp(sMessage);
// return m_poNetwork->SendMessageTCP(iGroupIdx, oNodeInfo.GetIP(), oNodeInfo.GetPort(), sMessage);
// 修改代码
return m_poNetwork->SendMessageTCP(iGroupIdx, iNodeID, sMessage);
}
else
{
BP->GetNetworkBP()->SendUdp(sMessage);
// return m_poNetwork->SendMessageUDP(iGroupIdx, oNodeInfo.GetIP(), oNodeInfo.GetPort(), sMessage);
// 修改代码
return m_poNetwork->SendMessageUDP(iGroupIdx, iNodeID, sMessage);
}
}
int Communicate :: SendMessage(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage, const int iSendType)
{
// return Send(iGroupIdx, iSendtoNodeID, NodeInfo(iSendtoNodeID), sMessage, iSendType);
// 修改代码
return Send(iGroupIdx, iSendtoNodeID, sMessage, iSendType);
}
int Communicate :: BroadcastMessage(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
const std::set<nodeid_t> & setNodeInfo = m_poConfig->GetSystemVSM()->GetMembershipMap();
for (auto & it : setNodeInfo)
{
if (it != m_iMyNodeID)
{
// Send(iGroupIdx, it, NodeInfo(it), sMessage, iSendType);
// 修改代码
Send(iGroupIdx, it, sMessage, iSendType);
}
}
return 0;
}
int Communicate :: BroadcastMessageFollower(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
const std::map<nodeid_t, uint64_t> & mapFollowerNodeInfo = m_poConfig->GetMyFollowerMap();
for (auto & it : mapFollowerNodeInfo)
{
if (it.first != m_iMyNodeID)
{
// Send(iGroupIdx, it.first, NodeInfo(it.first), sMessage, iSendType);
// 修改代码
Send(iGroupIdx, it.first, sMessage, iSendType);
}
}
PLGDebug("%zu node", mapFollowerNodeInfo.size());
return 0;
}
int Communicate :: BroadcastMessageTempNode(const int iGroupIdx, const std::string & sMessage, const int iSendType)
{
const std::map<nodeid_t, uint64_t> & mapTempNode = m_poConfig->GetTmpNodeMap();
for (auto & it : mapTempNode)
{
if (it.first != m_iMyNodeID)
{
Send(iGroupIdx, it.first, NodeInfo(it.first), sMessage, iSendType);
// 修改代码
Send(iGroupIdx, it.first, sMessage, iSendType);
}
}
PLGDebug("%zu node", mapTempNode.size());
return 0;
}
include/phxpaxos/network.h
class NetWork
{
// ......
/*
virtual int SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage) = 0;
virtual int SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage) = 0;
*/
// 修改代码
virtual int SendMessageTCP(const int iGroupIdx, const nodeid_t iSendtoNodeID const std::string & sMessage) = 0;
virtual int SendMessageUDP(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage) = 0;
// ......
};
src/communicate/dfnetwork.h
class DFNetWork : public NetWork
{
// ......
/*
int SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage);
int SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage);
*/
// 修改代码
int SendMessageTCP(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage);
int SendMessageUDP(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage);
// ......
};
src/communicate/dfnetwork.cpp
/*
int DFNetWork :: SendMessageTCP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage)
{
return m_oTcpIOThread.AddMessage(iGroupIdx, sIp, iPort, sMessage);
}
int DFNetWork :: SendMessageUDP(const int iGroupIdx, const std::string & sIp, const int iPort, const std::string & sMessage)
{
return m_oUDPSend.AddMessage(sIp, iPort, sMessage);
}
*/
// 修改代码
int DFNetWork :: SendMessageTCP(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage)
{
return m_oTcpIOThread.AddMessage(iGroupIdx, iSendtoNodeID, sMessage);
}
int DFNetWork :: SendMessageUDP(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage)
{
return m_oUDPSend.AddMessage(iSendtoNodeID, sMessage);
src/communicate/tcp/tcp.h
class TcpWrite : public Thread
{
// ......
// int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
// 修改代码
int AddMessage(const nodeid_t iSendtoNodeID, const std::string & sMessage);
// ......
};
class TcpIOThread
{
// ......
// int AddMessage(const int iGroupIdx, const std::string & sIP, const int iPort, const std::string & sMessage);
// 修改代码
int AddMessage(const int iGroupIdx, const nodeid_t iSendtoNodeID, const std::string & sMessage);
// ......
};
src/communicate/tcp/tcp.cpp
/*
int TcpWrite :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
{
return m_oTcpClient.AddMessage(sIP, iPort, sMessage);
}
*/
// 修改代码
int TcpWrite :: AddMessage(const nodeid_t iSendtoNodeID, const std::string & sMessage)
{
return m_oTcpClient.AddMessage(iSendtoNodeID, sMessage);
}
// ......
/*
int TcpIOThread :: AddMessage(const int iGroupIdx, const std::string & sIP, const int iPort, const std::string & sMessage)
{
int iIndex = iGroupIdx % (int)m_vecTcpWrite.size();
return m_vecTcpWrite[iIndex]->AddMessage(sIP, iPort, sMessage);
}
*/
// 修改代码
int TcpIOThread :: AddMessage(const nodeid_t iSendtoNodeID, const std::string & sMessage)
{
int iIndex = iGroupIdx % (int)m_vecTcpWrite.size();
return m_vecTcpWrite[iIndex]->AddMessage(iSendtoNodeID, sMessage);
}
src/communicate/tcp/tcp_client.h
class TcpClient
{
// ......
// int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
// 修改代码
int AddMessage(const nodeid_t iSendtoNodeID, const std::string & sMessage);
// .......
// MessageEvent * GetEvent(const std::string & sIP, const int iPort);
// MessageEvent * CreateEvent(const uint64_t llNodeID, const std::string & sIP, const int iPort);
// 修改代码
MessageEvent * GetEvent(const nodeid_t iSendtoNodeID);
MessageEvent * CreateEvent(const uint64_t llNodeID);
// ......
};
src/communicate/tcp/tcp_client.cpp
// int TcpClient :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
// 修改代码
int TcpClient :: AddMessage(const nodeid_t iSendtoNodeID, const std::string & sMessage)
{
//PLImp("ok");
// MessageEvent * poEvent = GetEvent(sIP, iPort);
// 修改代码
MessageEvent * poEvent = GetEvent(iSendtoNodeID);
if (poEvent == nullptr)
{
// PLErr("no event created for this ip %s port %d", sIP.c_str(), iPort);
// 修改代码
PLErr("no event created for this nodeid %" PRIu64 "", iSendtoNodeID);
return -1;
}
return poEvent->AddMessage(sMessage);
}
// MessageEvent * TcpClient :: GetEvent(const std::string & sIP, const int iPort)
// 修改代码
MessageEvent * TcpClient :: GetEvent(const nodeid_t llNodeID)
{
/*
uint32_t iIP = (uint32_t)inet_addr(sIP.c_str());
uint64_t llNodeID = (((uint64_t)iIP) << 32) | iPort;
*/
std::lock_guard<std::mutex> oLockGuard(m_oMutex);
auto it = m_mapEvent.find(llNodeID);
if (it != end(m_mapEvent))
{
return it->second;
}
// 修改代码
return CreateEvent(llNodeID);
}
// MessageEvent * TcpClient :: CreateEvent(const uint64_t llNodeID, const std::string & sIP, const int iPort)
// 修改代码
MessageEvent * TcpClient :: CreateEvent(const uint64_t llNodeID)
{
// PLImp("start, ip %s port %d", sIP.c_str(), iPort);
// 修改代码
PLImp("start, nodeid %" PRIu64 "", llNodeID);
Socket oSocket;
oSocket.setNonBlocking(true);
oSocket.setNoDelay(true);
// SocketAddress oAddr(sIP, iPort);
// 修改代码
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(llNodeID & 0xffffffff);
addr.sin_addr.s_addr = llNodeID >> 32;
SocketAddress oAddr(addr);
oSocket.connect(oAddr);
MessageEvent * poEvent = new MessageEvent(MessageEventType_SEND, oSocket.detachSocketHandle(),
oAddr, m_poEventLoop, m_poNetWork);
assert(poEvent != nullptr);
m_mapEvent[llNodeID] = poEvent;
m_vecEvent.push_back(poEvent);
// PLImp("ok, ip %s port %d", sIP.c_str(), iPort);
// 修改代码
PLImp("ok, nodeid %" PRIu64 "", llNodeID);
return poEvent;
}
src/communicate/udp.h
class UDPSend : public Thread
{
// ......
/*
int AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
struct QueueData
{
std::string m_sIP;
int m_iPort;
std::string m_sMessage;
};
private:
void SendMessage(const std::string & sIP, const int iPort, const std::string & sMessage);
*/
// 修改代码
int AddMessage(const nodeid_t llNodeID, const std::string & sMessage);
struct QueueData
{
nodeid_t m_llNodeID;
std::string m_sMessage;
};
private:
void SendMessage(const nodeid_t llNodeID, const std::string & sMessage);
};
src/communicate/udp.cpp
// void UDPSend :: SendMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
// 修改代码
void UDPSend :: SendMessage(const nodeid_t llNodeID, const std::string & sMessage)
{
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
memset(&addr, 0, sizeof(addr));
// 新增代码
int iPort = llNodeID & (0xffffffff);
addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
// addr.sin_addr.s_addr = inet_addr(sIP.c_str());
// 修改代码
addr.sin_addr.s_addr = llNodeID >> 32;
int ret = sendto(m_iSockFD, sMessage.data(), (int)sMessage.size(), 0, (struct sockaddr *)&addr, addr_len);
if (ret > 0)
{
BP->GetNetworkBP()->UDPRealSend(sMessage);
}
}
void UDPSend :: run()
{
m_bIsStarted = true;
while(true)
{
QueueData * poData = nullptr;
m_oSendQueue.lock();
bool bSucc = m_oSendQueue.peek(poData, 1000);
if (bSucc)
{
m_oSendQueue.pop();
}
m_oSendQueue.unlock();
if (poData != nullptr)
{
// SendMessage(poData->m_sIP, poData->m_iPort, poData->m_sMessage);
// 修改代码
SendMessage(poData->m_llNodeID, poData->m_sMessage);
delete poData;
}
if (m_bIsEnd)
{
PLHead("UDPSend [END]");
return;
}
}
}
// int UDPSend :: AddMessage(const std::string & sIP, const int iPort, const std::string & sMessage)
// 修改代码
int UDPSend :: AddMessage(const nodeid_t llNodeID, const std::string & sMessage)
{
m_oSendQueue.lock();
if ((int)m_oSendQueue.size() > UDP_QUEUE_MAXLEN)
{
BP->GetNetworkBP()->UDPQueueFull();
//PLErr("queue length %d too long, can't enqueue", m_oSendQueue.size());
m_oSendQueue.unlock();
return -2;
}
QueueData * poData = new QueueData;
/*
poData->m_sIP = sIP;
poData->m_iPort = iPort;
*/
// 修改代码
poData->m_llNodeID = llNodeID;
poData->m_sMessage = sMessage;
m_oSendQueue.add(poData);
m_oSendQueue.unlock();
return 0;
}
优化目标节点地址信息在发送消息路径上的传递方式
目前的传递方式是,先把64位的nodeid转为NodeInfo,再从NodeInfo获取ip和port,再把ip和port转换为sockaddr_in。其实64位的nodeid可以直接转化为sockaddr_in,NodeInfo的相关转换可以省略。传递ip和port过程中,带来了一些额外操作(详情请看下文的源码注释)。发送消息路径是热路径,有必要优化传递方式。
原代码路径:
src/communicate/communicate.h
src/communicate/communicate.cpp
include/phxpaxos/network.h
src/communicate/dfnetwork.h
src/communicate/dfnetwork.cpp
src/communicate/tcp/tcp.h
src/communicate/tcp/tcp.cpp
src/communicate/tcp/tcp_client.h
src/communicate/tcp/tcp_client.cpp
src/communicate/udp.h
src/communicate/udp.cpp
修改后的代码路径:
src/communicate/communicate.h
src/communicate/communicate.cpp
include/phxpaxos/network.h
src/communicate/dfnetwork.h
src/communicate/dfnetwork.cpp
src/communicate/tcp/tcp.h
src/communicate/tcp/tcp.cpp
src/communicate/tcp/tcp_client.h
src/communicate/tcp/tcp_client.cpp
src/communicate/udp.h
src/communicate/udp.cpp