<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html><body style='font-size: 10pt; font-family: Verdana,Geneva,sans-serif'>
<p>Well, it is impossible if you'd use some memory blocks allocated by nginx within main request.<br />The memory allocated inside the request is released on request end.</p>
<p>An example how one can implement non-blocking delay can you see in <a href="https://github.com/openresty/echo-nginx-module#echo_sleep">https://github.com/openresty/echo-nginx-module#echo_sleep</a>.</p>
<p>But again, ensure you have not stored references to some main request structures (request related memory range). If you'd need some of them (e. g. headers, args, etc), duplicate them and release in event handler if timer becomes set or after processing your sub-requests.</p>
<p>However if I were you, I'd rather implement it on a backend side (not in nginx), e. g. using background sub-requests either with <span style="font-family: courier new,courier;">post_action</span> (despite nonofficial undocumented) or with <span style="font-family: courier new,courier;"><a href="http://nginx.org/en/docs/http/ngx_http_mirror_module.html">mirror</a></span>, configured in a corresponding location.<br />Especially if one expects some transaction safety (e. g. for save operation in corner cases like nginx restart/reload/shutdown/etc during the delay between main response and all the sub-requests) as a pipeline similar procedure.<br />So one could register each step (your delayed request) in some queue, for instance storing the request chain in a database or file, to get it safe against shutdown.<br />Although also without the transaction safety your approach to implement it completely in nginx is questionable for many reasons (particularly if the delay is not something artificial, but rather a real timing event).</p>
<p>Regards,<br />Serg.</p>
<p>20.04.2023 18:46, Ava Hahn wrote via nginx-devel:</p>
<blockquote type="cite" style="padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px"><!-- html ignored --> <!-- head ignored --><!-- meta ignored -->
<div class="elementToProof" style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: #000000;">
<div class="XbIp4 jmmB7 GNqVo yxtKT allowTextSelection">
<div>
<div class="rps_e8fa">
<div dir="ltr"><span class="x_elementToProof ContentPasted0" style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: #000000;">Hello All,</span></div>
<div dir="ltr">
<div class="x_elementToProof ContentPasted0" style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: #000000;">I am currently implementing a response header filter that triggers one or more subrequests conditionally based on the status of the parent response.<br class="ContentPasted0" /> <br class="ContentPasted0" /> I want to introduce some delay between the checking of the response and the triggering of the subrequest, but I do not want to block the worker thread.<br class="ContentPasted0" /> <br class="ContentPasted0" /> So far I have allocated an event within the main request's pool, added a timer with my desired delay, and attached a callback that does two things.</div>
<div class="x_elementToProof" style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: #000000;"><ol>
<li class="x_elementToProof"><span class="x_elementToProof ContentPasted0">triggers a subrequest as desired</span></li>
<li class="x_elementToProof"><span class="x_elementToProof ContentPasted0">proceeds to call the next response header filter</span></li>
</ol>
<div class="x_elementToProof ContentPasted0">In the meantime, after posting the event my handler returns NGX_OK.<br class="ContentPasted0" /> <br class="ContentPasted0" /> This is not working at all. Shortly after my filter returns NGX_OK the response is finalized, and the pool is deallocated. When the timer wakes up a segfault occurs in the worker process (in ngx_event_del_timer). Even if I allocate the event in a separate pool that outlives the request it is still not defined what happens when I try to trigger a subrequest on a request that has been finalized.<br class="ContentPasted0" /> <br class="ContentPasted0" /> My question is how can I make the finalization of the request contingent on the associated/posted event being handled first?<br class="ContentPasted0" /> <br class="ContentPasted0" /> OR, is there another facility for implementing non blocking delay that I can use?<br class="ContentPasted0" /> <br class="ContentPasted0" /> Thanks,<br class="ContentPasted0" /> Ava</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- html ignored --><br />
<pre>_______________________________________________
nginx-devel mailing list
<a href="mailto:nginx-devel@nginx.org">nginx-devel@nginx.org</a>
<a href="https://mailman.nginx.org/mailman/listinfo/nginx-devel" rel="noreferrer">https://mailman.nginx.org/mailman/listinfo/nginx-devel</a>
</pre>
</blockquote>
</body></html>