Skip to content

Commit 0c33b9e

Browse files
committed
feature: ngx.flush(true) can now wait on delayed events due to nginx's limit_rate config directive or "$limit_rate" variable settings. thanks Shafreeck Sea for the original patch in openresty#432.
1 parent a4f8b8a commit 0c33b9e

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

src/ngx_http_lua_output.c

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -569,10 +569,15 @@ ngx_http_lua_ngx_flush(lua_State *L)
569569
dd("wait:%d, rc:%d, buffered:0x%x", wait, (int) rc,
570570
r->connection->buffered);
571571

572-
if (wait && (r->connection->buffered & NGX_HTTP_LOWLEVEL_BUFFERED)) {
573-
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
574-
"lua flush requires waiting: buffered 0x%uxd",
575-
(unsigned) r->connection->buffered);
572+
wev = r->connection->write;
573+
574+
if (wait && (r->connection->buffered & NGX_HTTP_LOWLEVEL_BUFFERED
575+
|| wev->delayed))
576+
{
577+
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
578+
"lua flush requires waiting: buffered 0x%uxd, "
579+
"delayed:%d", (unsigned) r->connection->buffered,
580+
wev->delayed);
576581

577582
coctx->flushing = 1;
578583
ctx->flushing_coros++;
@@ -585,14 +590,6 @@ ngx_http_lua_ngx_flush(lua_State *L)
585590
r->write_event_handler = ngx_http_core_run_phases;
586591
}
587592

588-
wev = r->connection->write;
589-
590-
if (wev->ready && wev->delayed) {
591-
lua_pushnil(L);
592-
lua_pushliteral(L, "delayed");
593-
return 2;
594-
}
595-
596593
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
597594

598595
if (!wev->delayed) {
@@ -601,6 +598,7 @@ ngx_http_lua_ngx_flush(lua_State *L)
601598

602599
if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {
603600
if (wev->timer_set) {
601+
wev->delayed = 0;
604602
ngx_del_timer(wev);
605603
}
606604

t/056-flush.t

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use Test::Nginx::Socket::Lua;
1414

1515
repeat_each(2);
1616

17-
plan tests => repeat_each() * 58;
17+
plan tests => repeat_each() * 60;
1818

1919
#no_diff();
2020
no_long_string();
@@ -496,16 +496,28 @@ GET /test
496496
location /test {
497497
limit_rate 150;
498498
content_by_lua '
499+
local begin = ngx.now()
499500
for i = 1, 2 do
500501
ngx.print(string.rep("a", 100))
501-
ngx.flush(true)
502+
local ok, err = ngx.flush(true)
503+
if not ok then
504+
ngx.log(ngx.ERR, "failed to flush: ", err)
505+
end
502506
end
507+
local elapsed = ngx.now() - begin
508+
ngx.log(ngx.WARN, "lua writes elapsed ", elapsed, " sec")
503509
';
504510
}
505511
--- request
506512
GET /test
507513
--- response_body eval
508514
"a" x 200
515+
--- error_log eval
516+
[
517+
qr/lua writes elapsed [12](?:\.\d+)? sec/,
518+
qr/lua flush requires waiting: buffered 0x[0-9a-f]+, delayed:1/,
519+
]
520+
509521
--- no_error_log
510522
[error]
511523
--- timeout: 4

0 commit comments

Comments
 (0)