Subrequest without returning to nginx

Alfred Sawaya alfred at huji.fr
Tue May 4 15:14:50 UTC 2021


I read the njs source code for a detached subrequest (in
ngx_http_js_ext_subrequest) and it creates the subrequest, the promise,
and returns to nginx.

By "returning to nginx" I mean "stepping out of the module". Returning
to the phase handler.


My approach is basically wrong, I am looking for a temporary (I hope)
ugly workaround to execute a subrequest without returning from the
function that creates the subrequest.

Why I need to not return to nginx : because in the module I work on,
there is contextual data that are stored on the stack. So returning to
nginx means unwinding all stack frames that the module created so far.

Why it should not : it should :)


Thank you for you answer



On 04/05/2021 17:03, Dipl. Ing. Sergey Brester wrote:
>
> What do you mean as "return to nginx"? Or with other words why it
> should not? Or how you need to guarantee that a subrequest would take
> place at all and will be considered on another side?
>
> As for njs and "it also returns to nginx", either I don't really
> understand your approach or you simply missed the word "detached" in
> my answer (and njs subrequest documentation).
>
>  
>
> 04.05.2021 16:49, Alfred Sawaya wrote:
>
>> mirror and post_action both return to nginx to complete the subrequest.
>>
>> njs also does an event-driven subrequest (ie gives back a promise and
>> set a callback), so it also returns to nginx to complete the subrequest.
>>
>>  
>>
>> On 04/05/2021 16:32, Dipl. Ing. Sergey Brester wrote:
>>>
>>> Hi,
>>>
>>> see how the directive mirror
>>> <https://nginx.org/en/docs/http/ngx_http_mirror_module.html> or
>>> |post_action| doing this.
>>>
>>> Also take a look at njs
>>> <http://nginx.org/en/docs/njs/reference.html>, how it can make a
>>> detached subrequest.
>>>
>>> Regards,
>>> Serg.
>>>
>>> 04.05.2021 16:11, Alfred Sawaya wrote:
>>>
>>>     Hello,
>>>
>>>
>>>     I am currently converting an Apache module to Nginx. This module uses
>>>     subrequests and needs (for now) to execute the subrequest without
>>>     unwinding the stack (ie without returning to nginx).
>>>
>>>     I tried to call ngx_http_run_posted_requests by hand, but it does 
not
>>>     work as the upstream socket needs to get polled some time.
>>>
>>>
>>>     So I wonder, is there any way to do this ?
>>>
>>>
>>>     Of course I know that I shouldn't do it like this, but the current
>>>     module is not reentrant and poorly architectured. I will eventually
>>>     refactor it but later.
>>>
>>>
>>>     Thanks,
>>>
>>>
>>>     _______________________________________________
>>>     nginx-devel mailing list
>>>     nginx-devel at nginx.org <mailto:nginx-devel at nginx.org>
>>>     http://mailman.nginx.org/mailman/listinfo/nginx-devel <http://mailman.nginx.org/mailman/listinfo/nginx-devel>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20210504/b2d3fbd7/attachment.htm>


More information about the nginx-devel mailing list