-
Notifications
You must be signed in to change notification settings - Fork 166
Closed
Labels
bugSomething isn't workingSomething isn't workingdisscussSomething undering disscussingSomething undering disscussingexternalmaybe some issue caused by dependencymaybe some issue caused by dependency
Description
In our service, we found "get timed_mutex timeout" error log some times. We add some debug log and find this question is caused by c++ try_lock_for fail spuriously .
std::shared_ptr<TcpTransport> TcpRemotingClient::CreateTransport(const string& addr, bool needResponse) {
std::shared_ptr<TcpTransport> tts;
{
// try get m_tcpLock util m_tcpTransportTryLockTimeout to avoid blocking
// long time, if could not get m_tcpLock, return NULL
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("GetTransport of:%s get timed_mutex timeout", addr.c_str());
std::shared_ptr<TcpTransport> pTcp;
return pTcp;
}
}
}
may be we can slove this question by a thread local cache or global cache with mutex。 Or use some concurrenty map just like what java client do:
private Channel getAndCreateChannel(final String addr) throws RemotingConnectException, InterruptedException {
if (null == addr) {
return getAndCreateNameserverChannel();
}
ChannelWrapper cw = this.channelTables.get(addr); //just get from concurreny map without lock
if (cw != null && cw.isOK()) {
return cw.getChannel();
}
return this.createChannel(addr);
}
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't workingdisscussSomething undering disscussingSomething undering disscussingexternalmaybe some issue caused by dependencymaybe some issue caused by dependency