On Jun 17, 2014, at 2:16 AM, Nick Kew <n...@apache.org> wrote:

> There's a common idiom in /plugins/ and /examples/.
> 
> Where a plugin uses a TSTransform, the TSTransform is created in the
> event handler for the headers, and destroyed in the transform
> continuation itself using:
> 
>  if (TSVConnClosedGet(contp)) {
>    // ..... cleanup the ctx if applicable
>    TSContDestroy(contp);
>    return 0;
>  }
> 
> I adopted this idiom for Ironbee, which of course uses transforms for
> both Request and Response data.  This has now been fingered as the 
> culprit in a difficult crash, that happened only under load,
> and affected only the input filter (so a plugin like gzip, esi,
> or even null-transform that transforms output, wouldn't suffer).
> 
> Some debug output analysed exhaustively by my colleague and myself
> pointed to TSContDataGet returning a pointer that appears valid but
> cannot be dereferenced.

This pointer is not the stale contp? or the stale state pointer that you 
previously set on the continuation?

> The implication is, the transform function
> has been called with bogus data, possibly after TSContDestroy.
> Could this have been caused by "line noise" input?
> 
> Pursuing this line, we made a simple change to give
> the transforms the lifetime of the txn itself.
> 1.  Create the TSTransform at the start of the txn
>    in the handler for TS_EVENT_HTTP_TXN_START.
> 2.  Destroy it at the end of the txn
>    in the handler for TS_EVENT_HTTP_TXN_CLOSE.

That doesn't look unreasonable, but I'd like to have a better understanding of 
the issue before committing to this pattern.

> 
> This simple lifetime change fixes the crash! I wonder if it would
> be Good Practice to make an equivalent change in the bundled
> transforms?
> 
> -- 
> Nick Kew
> 

Reply via email to