Skip to content

add exit_worker_by* feature #927

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

Closed
wants to merge 17 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/ngx_http_lua_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,9 @@ struct ngx_http_lua_main_conf_s {
ngx_http_lua_main_conf_handler_pt init_worker_handler;
ngx_str_t init_worker_src;

ngx_http_lua_main_conf_handler_pt exit_worker_handler;
ngx_str_t exit_worker_src;

ngx_http_lua_balancer_peer_data_t *balancer_peer_data;
/* balancer_by_lua does not support yielding and
* there cannot be any conflicts among concurrent requests,
Expand Down
58 changes: 58 additions & 0 deletions src/ngx_http_lua_directive.c
Original file line number Diff line number Diff line change
Expand Up @@ -1208,6 +1208,64 @@ ngx_http_lua_init_worker_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,
}


char *
ngx_http_lua_exit_worker_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf)
{
char *rv
ngx_conf_t save;

save = *cf;
cf->handler = ngx_http_lua_exit_worker_by_lua;
cf->handler_conf = conf;

rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);

*cf = save;

return rv;
}

char *
ngx_http_lua_exit_worker_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf)
{
u_char *name;
ngx_str_t *value;
ngx_http_lua_main_conf_t *lmcf = conf;

dd("enter");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

better use more meaning use debug message here. people will see this message in the error log when they opened the DDEBUG.


/* must specify a content handler */
if (cmd->post == NULL) {
return NGX_CONF_ERROR;
}

if (lmcf->exit_worker_handler) {
return "is duplicate";
}

value = cf->args->elts;

lmcf->exit_worker_handler = (ngx_http_lua_main_conf_handler_pt) cmd->post;

if (cmd->pos == ngx_http_lua_exit_worker_by_lua_file) {
name = ngx_http_lua_rebase_path(cf->pool, value[1].data,
value[1].len);
if (name == NULL) {
return NGX_CONF_ERROR;
}

lmcf->exit_worker_src.data = name;
lmcf->exit_worker_src.len = ngx_strlen(name);
} else {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style: we need a blank line before the } else { line. See other similar places in the existing code base. Thank you!

lmcf->exit_worker_src = value[1];
}

return NGX_CONF_OK;
}


#if defined(NDK) && NDK
static ngx_int_t
ngx_http_lua_set_by_lua_init(ngx_http_request_t *r)
Expand Down
4 changes: 4 additions & 0 deletions src/ngx_http_lua_directive.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ char *ngx_http_lua_init_worker_by_lua_block(ngx_conf_t *cf,
ngx_command_t *cmd, void *conf);
char *ngx_http_lua_init_worker_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
char *ngx_http_lua_exit_worker_by_lua_block(ngx_conf_t *cf,
ngx_command_t *cmd, void *conf);
char *ngx_http_lua_exit_worker_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
char *ngx_http_lua_code_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

#if defined(NDK) && NDK
Expand Down
60 changes: 60 additions & 0 deletions src/ngx_http_lua_exitworkerby.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@

/*
* Copyright (C) Xianliang Li
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For this patch to merge, you have to grant your copyright to the authors of this module. So please remove this copyright notice comment.

*/


#ifndef DDEBUG
#define DDEBUG 0
#endif
#include "ddebug.h"


#include "ngx_http_lua_exitworkerby.h"
#include "ngx_http_lua_util.h"


ngx_int_t
ngx_http_lua_exit_worker(ngx_cycle_t *cycle)
{
ngx_http_lua_main_conf_t *lmcf;

lmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_lua_module);
if (lmcf == NULL
|| lmcf->exit_worker_handler == NULL
|| lmcf->lua == NULL)
{
return NGX_OK;
}

(void) lmcf->exit_worker_handler(cycle->log, lmcf, lmcf->lua);

return NGX_OK;
}


ngx_int_t
ngx_http_lua_exit_worker_by_inline(ngx_log_t *log,
ngx_http_lua_main_conf_t *lmcf, lua_State *L)
{
int status;

status = luaL_loadbuffer(L, (char *) lmcf->exit_worker_src.data,
lmcf->exit_worker_src.len, "=exit_worker_by_lua"
|| ngx_http_lua_do_call(log, L));

return ngx_http_lua_report(log, L, status, "exit_worker_by_lua");
}


ngx_int_t
ngx_http_lua_exit_worker_by_file(ngx_log_t *log,
ngx_http_lua_main_conf_t *lmcf, lua_State *L)
{
int status;

status = luaL_loadfile(L, (char *) lmcf->exit_worker_src.data)
|| ngx_http_lua_do_call(log, L);

return ngx_http_lua_report(log, L, status, "exit_worker_by_file");
}
25 changes: 25 additions & 0 deletions src/ngx_http_lua_exitworkerby.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

/*
* Copyright (C) Xianliang Li
*/


#ifndef _NGX_HTTP_LUA_EXITWORKERBY_H_INCLUDE_
#define _NGX_HTTP_LUA_EXITWORKERBY_H_INCLUDE_


#include "ngx_http_lua_common.h"


ngx_int_t ngx_http_lua_exit_worker_by_inline(ngx_log_t *log,
ngx_http_lua_main_conf_t *lmcf, lua_State *L);

ngx_int_t ngx_http_lua_exit_worker_by_file(ngx_log_t *log,
ngx_http_lua_main_conf_t *lmcf, lua_State *L);

ngx_int_t ngx_http_lua_exit_worker(ngx_cycle_t *cycle);


#endif /* _NGX_HTTP_LUA_EXITWORKERBY_H_INCLUDE_ */

/* vi:set ft=c ts=4 sw=4 et fdm=marker: */
21 changes: 21 additions & 0 deletions src/ngx_http_lua_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,27 @@ static ngx_command_t ngx_http_lua_cmds[] = {
0,
(void *) ngx_http_lua_init_worker_by_file },

{ ngx_string("exit_worker_by_lua_block"),
NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
ngx_http_lua_exit_worker_by_lua_block,
NGX_HTTP_MAIN_CONF_OFFSET,
0,
(void *) ngx_http_lua_exit_worker_by_inline },

{ ngx_string("exit_worker_by_lua"),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work!

I believe the newly added Lua handlers should only use the by_block form though, as per the ssl_certificate_by_lua_block demonstrates?

Copy link
Member

@thibaultcha thibaultcha Dec 13, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe you would also need to update ngx_http_lua_{phase | common | util}.c to introduce this new phase context? As well as setting the context itself? I could be wrong.

I believe it will also be requested of you that you introduce tests for this feature.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i reference to init_worker_by*, there have three method(init_worker_by_lua init_worker_by_lua_block init_worker_by_lua_file)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, the init_worker phase was introduced before the *_by_lua_block form and as of today, this module still maintains the older *_by_lua form for backwards compatibility reasons. However, newly introduced phases (as the ssl_certificate one) are only implemented in the *_by_lua_block form.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey, on the bright side of things, it's less work for you ;)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok,thank you. i will add this.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Newly added directives should only provide the *_by_lua_block and *_by_lua_file forms. Please remove this exit_worker_by_lua directive. Thank you.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enen,i will correction this。

NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
ngx_http_lua_exit_worker_by_lua,
NGX_HTTP_MAIN_CONF_OFFSET,
0,
(void *) ngx_http_lua_exit_worker_by_inline },

{ ngx_string("exit_worker_by_lua_file"),
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
ngx_http_lua_exit_worker_by_lua,
NGX_HTTP_MAIN_CONF_OFFSET,
0,
(void *) ngx_http_lua_exit_worker_by_file },

#if defined(NDK) && NDK
/* set_by_lua $res { inline Lua code } [$arg1 [$arg2 [...]]] */
{ ngx_string("set_by_lua_block"),
Expand Down