Skip to content

Commit 934e33e

Browse files
committed
feature: cosockets are now full duplex: a reader "light thread" and a writer "light thread" can operate on the same cosocket simultaneously. thanks shun zhang and aviramc for the original patches in #367 and #290, respectively.
1 parent 6885462 commit 934e33e

13 files changed

+1289
-231
lines changed

src/ngx_http_lua_socket_tcp.c

+537-169
Large diffs are not rendered by default.

src/ngx_http_lua_socket_tcp.h

+9-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ typedef struct {
5151

5252

5353
struct ngx_http_lua_socket_tcp_upstream_s {
54-
ngx_http_lua_socket_tcp_retval_handler prepare_retvals;
54+
ngx_http_lua_socket_tcp_retval_handler read_prepare_retvals;
55+
ngx_http_lua_socket_tcp_retval_handler write_prepare_retvals;
5556
ngx_http_lua_socket_tcp_upstream_handler_pt read_event_handler;
5657
ngx_http_lua_socket_tcp_upstream_handler_pt write_event_handler;
5758

@@ -84,15 +85,20 @@ struct ngx_http_lua_socket_tcp_upstream_s {
8485
size_t request_len;
8586
ngx_chain_t *request_bufs;
8687

87-
ngx_http_lua_co_ctx_t *co_ctx;
88+
ngx_http_lua_co_ctx_t *read_co_ctx;
89+
ngx_http_lua_co_ctx_t *write_co_ctx;
8890

8991
ngx_uint_t reused;
9092

9193
unsigned no_close:1;
92-
unsigned waiting:1;
94+
unsigned conn_waiting:1;
95+
unsigned read_waiting:1;
96+
unsigned write_waiting:1;
9397
unsigned eof:1;
9498
unsigned body_downstream:1;
9599
unsigned raw_downstream:1;
100+
unsigned read_closed:1;
101+
unsigned write_closed:1;
96102
};
97103

98104

t/023-rewrite/tcp-socket.t

+11-11
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ received: Connection: close
8484
received:
8585
received: foo
8686
failed to receive a line: closed []
87-
close: nil closed
87+
close: 1 nil
8888
--- no_error_log
8989
[error]
9090
@@ -518,7 +518,7 @@ received: Connection: close
518518
received:
519519
received: foo
520520
failed to receive a line: closed
521-
close: nil closed
521+
close: 1 nil
522522
--- no_error_log
523523
[error]
524524
@@ -587,7 +587,7 @@ Connection: close\r
587587
foo
588588
589589
err: nil
590-
close: nil closed
590+
close: 1 nil
591591
"
592592
--- no_error_log
593593
[error]
@@ -668,7 +668,7 @@ Connection: close\r
668668
foo
669669
670670
err: nil
671-
close: nil closed
671+
close: 1 nil
672672
"
673673
--- no_error_log
674674
[error]
@@ -745,7 +745,7 @@ Con][nection: c][lose\r
745745
\r
746746
fo]failed to receive a line: closed [o
747747
]
748-
close: nil closed
748+
close: 1 nil
749749
"
750750
--- no_error_log
751751
[error]
@@ -823,7 +823,7 @@ Con][nection: c][lose\r
823823
\r
824824
fo]failed to receive a line: closed [o
825825
]
826-
close: nil closed
826+
close: 1 nil
827827
"
828828
--- no_error_log
829829
[error]
@@ -895,7 +895,7 @@ received: Connection: close
895895
received:
896896
received: foo
897897
failed to receive a line: closed []
898-
close: nil closed
898+
close: 1 nil
899899
--- no_error_log
900900
[error]
901901
@@ -964,7 +964,7 @@ received: Connection: close
964964
received:
965965
received: foo
966966
failed to receive a line: closed []
967-
close: nil closed
967+
close: 1 nil
968968
--- no_error_log
969969
[error]
970970
@@ -1073,7 +1073,7 @@ Con][nection: c][lose\r
10731073
\r
10741074
fo]failed to receive a line: closed [o
10751075
]
1076-
close: nil closed
1076+
close: 1 nil
10771077
"
10781078
--- no_error_log
10791079
[error]
@@ -1590,7 +1590,7 @@ received: Connection: close
15901590
received:
15911591
received: foo
15921592
failed to receive a line: closed []
1593-
close: nil closed
1593+
close: 1 nil
15941594
--- no_error_log
15951595
[error]
15961596
@@ -1912,7 +1912,7 @@ received: Connection: close
19121912
received:
19131913
received: foobarbaz
19141914
failed to receive a line: closed []
1915-
close: nil closed
1915+
close: 1 nil
19161916
--- no_error_log
19171917
[error]
19181918
--- SKIP

t/023-rewrite/unix-socket.t

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,5 +148,5 @@ received: Connection: close
148148
received:
149149
received: foo
150150
failed to receive a line: closed
151-
close: nil closed
151+
close: 1 nil
152152

t/058-tcp-socket.t

+15-15
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ received: Connection: close
8484
received:
8585
received: foo
8686
failed to receive a line: closed []
87-
close: nil closed
87+
close: 1 nil
8888
--- no_error_log
8989
[error]
9090
@@ -202,7 +202,7 @@ attempt to send data on a closed socket:
202202
--- config
203203
server_tokens off;
204204
resolver $TEST_NGINX_RESOLVER;
205-
resolver_timeout 1s;
205+
resolver_timeout 3s;
206206
location /t {
207207
content_by_lua '
208208
local sock = ngx.socket.tcp()
@@ -295,7 +295,7 @@ qr/connect\(\) failed \(\d+: Connection refused\)/
295295
lua_socket_connect_timeout 100ms;
296296
lua_socket_send_timeout 100ms;
297297
lua_socket_read_timeout 100ms;
298-
resolver_timeout 1s;
298+
resolver_timeout 3s;
299299
location /test {
300300
content_by_lua '
301301
local sock = ngx.socket.tcp()
@@ -363,7 +363,7 @@ connected: 1
363363
--- config
364364
server_tokens off;
365365
resolver $TEST_NGINX_RESOLVER;
366-
resolver_timeout 1s;
366+
resolver_timeout 3s;
367367
location /t {
368368
content_by_lua '
369369
local sock = ngx.socket.tcp()
@@ -502,7 +502,7 @@ received: Connection: close
502502
received:
503503
received: foo
504504
failed to receive a line: closed
505-
close: nil closed
505+
close: 1 nil
506506
--- no_error_log
507507
[error]
508508
@@ -569,7 +569,7 @@ Connection: close\r
569569
foo
570570
571571
err: nil
572-
close: nil closed
572+
close: 1 nil
573573
"
574574
--- no_error_log
575575
[error]
@@ -648,7 +648,7 @@ Connection: close\r
648648
foo
649649
650650
err: nil
651-
close: nil closed
651+
close: 1 nil
652652
"
653653
--- no_error_log
654654
[error]
@@ -723,7 +723,7 @@ Con][nection: c][lose\r
723723
\r
724724
fo]failed to receive a line: closed [o
725725
]
726-
close: nil closed
726+
close: 1 nil
727727
"
728728
--- no_error_log
729729
[error]
@@ -799,7 +799,7 @@ Con][nection: c][lose\r
799799
\r
800800
fo]failed to receive a line: closed [o
801801
]
802-
close: nil closed
802+
close: 1 nil
803803
"
804804
--- no_error_log
805805
[error]
@@ -869,7 +869,7 @@ received: Connection: close
869869
received:
870870
received: foo
871871
failed to receive a line: closed []
872-
close: nil closed
872+
close: 1 nil
873873
--- no_error_log
874874
[error]
875875
@@ -936,7 +936,7 @@ received: Connection: close
936936
received:
937937
received: foo
938938
failed to receive a line: closed []
939-
close: nil closed
939+
close: 1 nil
940940
--- no_error_log
941941
[error]
942942
@@ -1048,7 +1048,7 @@ Con][nection: c][lose\r
10481048
\r
10491049
fo]failed to receive a line: closed [o
10501050
]
1051-
close: nil closed
1051+
close: 1 nil
10521052
"
10531053
--- no_error_log
10541054
[error]
@@ -1557,7 +1557,7 @@ received: Connection: close
15571557
received:
15581558
received: foo
15591559
failed to receive a line: closed []
1560-
close: nil closed
1560+
close: 1 nil
15611561
--- no_error_log
15621562
[error]
15631563
@@ -2077,7 +2077,7 @@ F(ngx_http_lua_socket_resolve_handler) {
20772077
println("lua socket resolve handler")
20782078
}
20792079
2080-
F(ngx_http_lua_socket_tcp_connect_retval_handler) {
2080+
F(ngx_http_lua_socket_tcp_conn_retval_handler) {
20812081
println("lua socket tcp connect retval handler")
20822082
}
20832083
@@ -2661,7 +2661,7 @@ GET /t
26612661
--- response_body
26622662
connected: 1
26632663
request sent: 57
2664-
close: nil closed
2664+
close: 1 nil
26652665
--- no_error_log
26662666
[error]
26672667
--- error_log

t/059-unix-socket.t

+1-1
Original file line numberDiff line numberDiff line change
@@ -142,5 +142,5 @@ received: Connection: close
142142
received:
143143
received: foo
144144
failed to receive a line: closed
145-
close: nil closed
145+
close: 1 nil
146146

t/065-tcp-socket-timeout.t

+72-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ our $StapScript = $t::StapThread::StapScript;
2929

3030
repeat_each(2);
3131

32-
plan tests => repeat_each() * (blocks() * 4 + 13);
32+
plan tests => repeat_each() * (blocks() * 4 + 12);
3333

3434
our $HtmlDir = html_dir;
3535

@@ -48,7 +48,7 @@ __DATA__
4848
server_tokens off;
4949
lua_socket_connect_timeout 100ms;
5050
resolver $TEST_NGINX_RESOLVER;
51-
resolver_timeout 1s;
51+
resolver_timeout 3s;
5252
location /t {
5353
content_by_lua '
5454
local sock = ngx.socket.tcp()
@@ -76,6 +76,7 @@ lua tcp socket connect timed out
7676
server_tokens off;
7777
lua_socket_connect_timeout 60s;
7878
resolver $TEST_NGINX_RESOLVER;
79+
resolver_timeout 3s;
7980
location /t {
8081
content_by_lua '
8182
local sock = ngx.socket.tcp()
@@ -685,7 +686,7 @@ after
685686
server_tokens off;
686687
lua_socket_connect_timeout 100ms;
687688
resolver $TEST_NGINX_RESOLVER;
688-
resolver_timeout 1s;
689+
resolver_timeout 3s;
689690
location /t {
690691
content_by_lua '
691692
local sock = ngx.socket.tcp()
@@ -918,3 +919,71 @@ lua tcp socket read timeout: 10
918919
lua tcp socket connect timeout: 60000
919920
lua tcp socket read timed out
920921

922+
923+
924+
=== TEST 22: concurrent operations while writing
925+
--- config
926+
server_tokens off;
927+
lua_socket_log_errors off;
928+
location /t {
929+
content_by_lua '
930+
local sock = ngx.socket.tcp()
931+
932+
local function f()
933+
ngx.sleep(0.01)
934+
local bytes, err = sock:send("flush_all")
935+
ngx.say("send: ", bytes, " ", err)
936+
937+
local ok, err = sock:close()
938+
ngx.say("close: ", ok, " ", err)
939+
940+
local ok, err = sock:getreusedtimes()
941+
ngx.say("getreusedtimes: ", ok, " ", err)
942+
943+
local ok, err = sock:setkeepalive()
944+
ngx.say("setkeepalive: ", ok, " ", err)
945+
946+
local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)
947+
ngx.say("connect: ", ok, " ", err)
948+
949+
sock:settimeout(1)
950+
local res, err = sock:receive(1)
951+
ngx.say("receive: ", res, " ", err)
952+
end
953+
954+
local ok, err = ngx.thread.spawn(f)
955+
if not ok then
956+
ngx.say("failed to spawn writer thread: ", err)
957+
return
958+
end
959+
960+
sock:settimeout(300)
961+
local ok, err = sock:connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)
962+
ngx.say("connect: ", ok, " ", err)
963+
964+
local bytes, err = sock:send("get helloworld!")
965+
if not bytes then
966+
ngx.say("send failed: ", err)
967+
end
968+
969+
local ok, err = sock:close()
970+
ngx.say("close: ", ok, " ", err)
971+
';
972+
}
973+
974+
--- request
975+
GET /t
976+
--- response_body
977+
connect: 1 nil
978+
send: nil socket busy writing
979+
close: nil socket busy writing
980+
getreusedtimes: 0 nil
981+
setkeepalive: nil socket busy writing
982+
connect: nil socket busy writing
983+
receive: nil timeout
984+
send failed: timeout
985+
close: 1 nil
986+
987+
--- no_error_log
988+
[error]
989+

0 commit comments

Comments
 (0)