You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafficserver.apache.org by "ASF GitHub Bot (JIRA)" <ji...@apache.org> on 2016/11/05 06:52:58 UTC

[jira] [Work logged] (TS-4614) In UnixNetVConnection::mainEvent should not do e->schedule_in for dummy event callback

     [ https://issues.apache.org/jira/browse/TS-4614?focusedWorklogId=31659&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-31659 ]

ASF GitHub Bot logged work on TS-4614:
--------------------------------------

                Author: ASF GitHub Bot
            Created on: 05/Nov/16 06:52
            Start Date: 05/Nov/16 06:52
    Worklog Time Spent: 10m 
      Work Description: GitHub user oknet opened a pull request:

    https://github.com/apache/trafficserver/pull/1199

    TS-4614: avoid e->schedule_in for dummy event.  (backport for 6.2.x)

    (cherry picked from commit 002432344fdb6a0adedcc6fa696b49545800de39)

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/oknet/trafficserver TS-4614-6.2.x

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/trafficserver/pull/1199.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #1199
    
----
commit 614150da46bdf2656fd669a559a2a2300c5b029e
Author: Oknet Xu <xu...@skyguard.com.cn>
Date:   2016-06-29T08:25:38Z

    TS-4614: avoid e->schedule_in for dummy event.  (backport for 6.2.x)
    
    (cherry picked from commit 002432344fdb6a0adedcc6fa696b49545800de39)

----


Issue Time Tracking
-------------------

    Worklog Id:     (was: 31659)
    Time Spent: 1h 20m  (was: 1h 10m)

> In UnixNetVConnection::mainEvent should not do e->schedule_in for dummy event callback 
> ---------------------------------------------------------------------------------------
>
>                 Key: TS-4614
>                 URL: https://issues.apache.org/jira/browse/TS-4614
>             Project: Traffic Server
>          Issue Type: Bug
>          Components: Cop
>            Reporter: Oknet Xu
>            Assignee: Oknet Xu
>             Fix For: 7.0.0
>
>          Time Spent: 1h 20m
>  Remaining Estimate: 0h
>
> NetHandler has a method: _close_vc , It is called by InactivityCop.
> first, create a dummy Event in stack,
> then call UnixNetVConnection::mainEvent by vc->handleEvent(EVENT_IMMEDIATE, &event);
> the handleEvent is mainEvent here.
> In the UnixNetVConnection::mainEvent code:
> ```
> int
> UnixNetVConnection::mainEvent(int event, Event *e)
> {
>   ink_assert(event == EVENT_IMMEDIATE || event == EVENT_INTERVAL);
>   ink_assert(thread == this_ethread());
>   MUTEX_TRY_LOCK(hlock, get_NetHandler(thread)->mutex, e->ethread);
>   MUTEX_TRY_LOCK(rlock, read.vio.mutex ? read.vio.mutex : e->ethread->mutex, e->ethread);
>   MUTEX_TRY_LOCK(wlock, write.vio.mutex ? write.vio.mutex : e->ethread->mutex, e->ethread);
>   if (!hlock.is_locked() || !rlock.is_locked() || !wlock.is_locked() ||
>       (read.vio.mutex && rlock.get_mutex() != read.vio.mutex.get()) ||
>       (write.vio.mutex && wlock.get_mutex() != write.vio.mutex.get())) {
> #ifdef INACTIVITY_TIMEOUT
>     if (e == active_timeout)
> #endif
>       e->schedule_in(HRTIME_MSECONDS(net_retry_delay));
>     return EVENT_CONT;
>   }
> ```
> the dummy Event would be schedule_in into Event System by e->schedule_in(HRTIME_MSECONDS(net_retry_delay));
> I think we should move the schedule_in into the INACTIVITY_TIMEOUT macro.
> ```
> #ifdef INACTIVITY_TIMEOUT
>     if (e == active_timeout)
>       e->schedule_in(HRTIME_MSECONDS(net_retry_delay));
> #endif
> ```
> I'm try to allocate a Event instead dummy Event, but meet Event System callback on a deallocated UnixNetVConnection.
> due to NetHandler called close_UnixNetVConnection before Event System callback the Event by schedule_in.
> In NetHandler::_close_vc, depend the return value (EVENT_DONE or EVENT_CONT) from UnixNetVConnection::mainEvent, to do ++handle_event; or not.
> ```
>     if (vc->handleEvent(EVENT_IMMEDIATE, &event) == EVENT_DONE)
>       ++handle_event;
> ```
> the 3 MUTEX_TRY_LOCK not always success on InactivityCop callback,
> due to the mutex of ServerSessionVC may different from ClientSessionVC.
> Only mutex of ServerSession is set to HttpSM when HttpSM pick up a Server Session from SessionPool. ServerSessionVC still keep the old mutex.



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