in src/transport/TcpRemotingClient.cpp [401:439]
bool TcpRemotingClient::CloseTransport(const string& addr, std::shared_ptr<TcpTransport> pTcp) {
if (addr.empty()) {
return CloseNameServerTransport(pTcp);
}
std::unique_lock<std::timed_mutex> lock(m_tcpTableLock, std::try_to_lock);
if (!lock.owns_lock()) {
if (!lock.try_lock_for(std::chrono::seconds(m_tcpTransportTryLockTimeout))) {
LOG_ERROR("CloseTransport of:%s get timed_mutex timeout", addr.c_str());
return false;
}
}
LOG_ERROR("CloseTransport of:%s", addr.c_str());
bool removeItemFromTable = true;
if (m_tcpTable.find(addr) != m_tcpTable.end()) {
if (m_tcpTable[addr]->getStartTime() != pTcp->getStartTime()) {
LOG_INFO("tcpTransport with addr:%s has been closed before, and has been created again, nothing to do",
addr.c_str());
removeItemFromTable = false;
}
} else {
LOG_INFO("tcpTransport with addr:%s had been removed from tcpTable before", addr.c_str());
removeItemFromTable = false;
}
if (removeItemFromTable) {
LOG_WARN("closeTransport: disconnect:%s with state:%d", addr.c_str(), m_tcpTable[addr]->getTcpConnectStatus());
if (m_tcpTable[addr]->getTcpConnectStatus() == TCP_CONNECT_STATUS_SUCCESS)
m_tcpTable[addr]->disconnect(addr); // avoid coredump when connection with server was broken
LOG_WARN("closeTransport: erase broker: %s", addr.c_str());
m_tcpTable.erase(addr);
}
LOG_ERROR("CloseTransport of:%s end", addr.c_str());
return removeItemFromTable;
}