Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ngx_postgres module does not support subrequests in memory #24

Closed
c0de9en opened this issue Jun 29, 2018 · 4 comments
Closed

ngx_postgres module does not support subrequests in memory #24

c0de9en opened this issue Jun 29, 2018 · 4 comments

Comments

@c0de9en
Copy link

c0de9en commented Jun 29, 2018

Пытаюсь дёрнуть постгрес из njs:

function dbtst(r) {
  r.subrequest('/dbtst/302834/', '', function(res) {
    r.warn('DEBUG: res.status=' + res.status + ';');
  });
}

Получаю в логе:

2018/06/29 12:44:55 [error] 30069#30069: *149 postgres: ngx_postgres module does not support subrequests in memory, client: 127.0.0.1, server: localhost, request: "GET /jstst/ HTTP/1.1", subrequest: "/dbtst/302834/", host: "localhost:8009"
2018/06/29 12:44:55 [warn] 30069#30069: *149 js: DEBUG: res.status=500;

В коде ngx_postgres есть такие буковки:

if (r->subrequest_in_memory) {
        /* TODO: add support for subrequest in memory by
         * emitting output into u->buffer instead */

        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
                      "postgres: ngx_postgres module does not support"
                      " subrequests in memory");

        dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");
        return NGX_HTTP_INTERNAL_SERVER_ERROR;
}

В то же время, из lua модуля подобный подзапрос работает. Но lua как раз пытаюсь заменить njs'ом. Как правильнее решить проблему? Понятно, что идеально было бы допилить ngx_postgres, но просить агента ж бесполезно, а сам я врядли смогу сделать приемлемый патч.

Возможно ли добавить опцию в r.subrequest, чтобы можно было делать не in-memory подзапросы?

@xeioex
Copy link
Contributor

xeioex commented Jun 29, 2018

@an0ma1ia к сожалению r.subrequest() активно полагается на r->subrequest_in_memory (мы даже делали отдельный патч на nginx для допила логики r->subrequest_in_memory). если этот флаг убрать то тело ответа будет улетать в клиентское соединение.

В качестве костыля, конечно, можно предложить делать подзапрос в дополнительный локейшн который будет ходить через proxy_pass на ngx_postgres локейшн.

Как эту проблему решает lua постараюсь посмотреть на след неделе.

@c0de9en
Copy link
Author

c0de9en commented Jun 29, 2018

Думаю, lua проблему не решает, а делает такие подзапросы, которые понимает ngx_postgres.

Если подскажете, как реализовать поддержку subrequest_in_memory в ngx_postgres, попробую его попатчить. Хотя бы основные принципы, что надо сделать, и где посмотреть пример кода.

Смотрю сейчас код ngx_http_memcached_module, который вполне успешно работает с r.subrequest, не вижу там ничего специфического.

Но вообще, получается многие сторонние модули нельзя дёргать из njs по этой причине.

@xeioex
Copy link
Contributor

xeioex commented Jun 29, 2018

Если подскажете, как реализовать поддержку subrequest_in_memory в ngx_postgres, попробую его попатчить. Хотя бы основные принципы, что надо сделать, и где посмотреть пример кода.

С версии 1.13.10 http://hg.nginx.org/nginx/rev/20f139e9ffa8 подробности в коммит логе.

Возможно даже все заработает если убрать проверку на r->subrequest_in_memory в ngx_postgres, postpone подхватит ответ и положит в r->out где его будет искать njs.

@c0de9en
Copy link
Author

c0de9en commented Jun 29, 2018

Действительно, работает после такого патча:

--- ngx_postgres_handler.c.orig 2018-06-29 16:36:07.336384890 +0300
+++ ngx_postgres_handler.c      2018-06-29 16:25:37.213125486 +0300
@@ -52,6 +52,7 @@
 
     dd("entering");
 
+#if defined(nginx_version) && (nginx_version < 13010)
     if (r->subrequest_in_memory) {
         /* TODO: add support for subrequest in memory by
          * emitting output into u->buffer instead */
@@ -63,6 +64,7 @@
         dd("returning NGX_HTTP_INTERNAL_SERVER_ERROR");
         return NGX_HTTP_INTERNAL_SERVER_ERROR;
     }
+#endif
 
     pglcf = ngx_http_get_module_loc_conf(r, ngx_postgres_module);
 

Спасибо вам огромное!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants