I was having problems with this too in a new plugin I was writing.  I had
to make this small change to get it to work:
https://github.com/apache/trafficserver/pull/6489/files#diff-8c09c39a3b13e183ba1bfd1e590cfb21

I found that I had to use TSContScheduleOnPool() instead of
TSContSchedule().

On Thu, Mar 26, 2020 at 12:55 PM Sudheer Vinukonda
<sudheervinuko...@yahoo.com.invalid> wrote:

> While investigating a core dump that we ran into during our ATS9
> migration, we discovered a couple of problems with the thread affinity
> changes and the TSContSchedule API.
> 1) It looks like the API TSContSchedule() and TSContScheduleEvery() now
> don't work unless TSContSetThreadAffinity() was called prior to calling
> them. This sounds unreasonable, so, I'm proposing to change the API to set
> the Continuation's thread affinity to the calling thread of the API, if not
> already set.
> 2) We have a use case where one of our plugins calls TSContSchedule* API
> from a non-ATS thread (created using pthread_create). This borks in a weird
> fashion because the FORCE_PLUGIN_SCOPED_MUTEX ends up not acquiring the
> mutex (because the calling thread isn't an EThread, so, this_ethread() is
> NULL and the holding thread for the cont's mutex is also NULL, which means
> in Mutex_Lock(), the if (m->thread_holding != t) { evaluates to false
> bypassing the mutex acquire call. However, the subsequent mutex release
> does get called via Mutex_unlock() and this makes bad things to happen (as
> the __nusers of the mutex object goes below 0 (it's an unsigned int)).
>
> https://github.com/apache/trafficserver/blob/4a503c817766fcad3b9eab3ff3a8e9e73d483ae7/iocore/eventsystem/I_Lock.h#L320
>
> So, we could either
> - prevent calling TSContSchedule*() API from non-ATS threads by asserting
> if this_ethread() is NULL before trying to acquire the mutex. ie.
> basically, fail hard and fast and in more obvious way (than an obscure
> random side-effect that happens much later because a release() was called
> on a lock without calling an acquire())
> OR
> - With the thread affinity changes, we could check if the continuation has
> a thread affinity set to an EThread and still allow calling
> TSContSchedule*() API from non-ATS Threads, as long as the thread affinity
> is set to an ATS thread. This requires to acquire the mutex on the affinity
> thread than the calling thread.
>
> After discussing with Bryan, we prefer option (1) which is consistent with
> the expectation that Continuation Schedule API should only be called from
> ATS threads.
>
> Note: Both the proposed changes here should not be breaking any
> compatibility or expectations, but rather retain compatibility with (1)
> above and make the API a bit more predictable/robust with (2)
>
> Let me know if there are any comments/concerns or questions.
>
> Thanks,
> Sudheer
>
>

Reply via email to