Hi, all,
I'v review the hypertable code recently, some code confuses me, I
think it may be buggy.
Here's the ConnectionManager thread runner code(pu branch):
void ConnectionManager::operator()() {
ScopedLock lock(m_impl->mutex);
ConnectionStatePtr conn_state;
while (!m_impl->shutdown) {
while (m_impl->retry_queue.empty()) {
m_impl->retry_cond.wait(lock);
if (m_impl->shutdown)
break;
}
if (m_impl->shutdown)
break;
conn_state = m_impl->retry_queue.top();
if (conn_state->decomissioned) {
m_impl->retry_queue.pop();
continue;
}
if (!conn_state->connected) {
{
ScopedLock conn_lock(conn_state->mutex);
boost::xtime now;
boost::xtime_get(&now, boost::TIME_UTC);
if (xtime_cmp(conn_state->next_retry, now) <= 0) {
m_impl->retry_queue.pop();
send_connect_request(conn_state.get());
continue;
}
}
m_impl->retry_cond.timed_wait(lock, conn_state->next_retry);
}
else
m_impl->retry_queue.pop();
}
}
I think the issue is if 'm_impl->shutdown' is not true, the
'ScopedLock lock(m_impl->mutex);' can not be unlocked.
I'm not sure, but seems this will affect
ConnectionManager::add/remove, if thread is running, can not
add/remove any more. I haven't tested it, only from the code logic
view. Did you guy find this problem in production release?
--
Best Regards,
Steve Chu
http://stvchu.org
--
You received this message because you are subscribed to the Google Groups
"Hypertable Development" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/hypertable-dev?hl=en.