Oknet Xu created TS-5076:
----------------------------

             Summary: NetVC is lost from read or write enable_list
                 Key: TS-5076
                 URL: https://issues.apache.org/jira/browse/TS-5076
             Project: Traffic Server
          Issue Type: Bug
          Components: Core
            Reporter: Oknet Xu


The related code here:

{code}
void
UnixNetVConnection::reenable(VIO *vio)
{
  if (STATE_FROM_VIO(vio)->enabled)
    return;
  set_enabled(vio);
  if (!thread)
    return;
  EThread *t = vio->mutex->thread_holding;
  ink_assert(t == this_ethread());
  ink_release_assert(!closed);
  if (nh->mutex->thread_holding == t) { 
...
    MUTEX_TRY_LOCK(lock, nh->mutex, t);
    if (!lock.is_locked()) {
      if (vio == &read.vio) {
        if (!read.in_enabled_list) {    // -----------> the condition check is 
not atomic
          read.in_enabled_list = 1;   // -----------> the variable set is not 
atomic
          nh->read_enable_list.push(this);
        }
      } else {
        if (!write.in_enabled_list) {   // -----------> the write side 
          write.in_enabled_list = 1;  // -----------> the write side
          nh->write_enable_list.push(this);
        }
      }
      if (nh->trigger_event && nh->trigger_event->ethread->signal_hook)
        nh->trigger_event->ethread->signal_hook(nh->trigger_event->ethread);
    } else {
...
    }
  }
}
{code}

Due to the unstable condition check code, the nh->read_enable_list.push(this) 
would push a netvc into atomic queue that is already inside a queue.

It leads the elements in atomic queue after the netvc will be lost.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to