annotate stream_upstream.t @ 1427:eb1d883305ea

Tests: avoid edge cases in upstream random two test. Unavailable servers contribute to the number of attempts, if selected, before the balancer would fall back to the default round-robin method. This means that it's quite possible to get server with more connections. To facilitate with selecting two alive servers, down server was removed from the upstream configuration at the cost of slightly worse coverage.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 10 Jan 2019 17:42:34 +0300
parents 766bcbb632ee
children 875967f737d4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1 #!/usr/bin/perl
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
2
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
3 # (C) Sergey Kandaurov
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
4 # (C) Nginx, Inc.
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
5
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
6 # Stream tests for upstream module and balancers.
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
7
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
8 ###############################################################################
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
9
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
10 use warnings;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
11 use strict;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
12
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
13 use Test::More;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
14
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
15 use IO::Select;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
16
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
17 BEGIN { use FindBin; chdir($FindBin::Bin); }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
18
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
19 use lib 'lib';
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
20 use Test::Nginx;
816
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 711
diff changeset
21 use Test::Nginx::Stream qw/ stream /;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
22
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
23 ###############################################################################
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
24
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
25 select STDERR; $| = 1;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
26 select STDOUT; $| = 1;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
27
1026
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
28 my $t = Test::Nginx->new()->has(qw/stream/)
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
29 ->write_file_expand('nginx.conf', <<'EOF');
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
30
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
31 %%TEST_GLOBALS%%
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
32
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
33 daemon off;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
34
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
35 events {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
36 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
37
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
38 stream {
1026
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
39 log_format bytes $upstream_addr!
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
40 $upstream_bytes_sent!$upstream_bytes_received;
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
41
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
42 upstream u {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
43 server 127.0.0.1:8084;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
44 server 127.0.0.1:8085;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
45 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
46
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
47 upstream u2 {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
48 server 127.0.0.1:8086 down;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
49 server 127.0.0.1:8086;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
50 server 127.0.0.1:8084;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
51 server 127.0.0.1:8085;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
52 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
53
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
54 upstream u3 {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
55 server 127.0.0.1:8084;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
56 server 127.0.0.1:8085 weight=2;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
57 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
58
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
59 upstream u4 {
1105
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
60 server 127.0.0.1:8086 fail_timeout=1s;
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
61 server 127.0.0.1:8084 backup;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
62 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
63
561
cd3e32d9997e Tests: adjusted stream test timeouts, visible on win32.
Sergey Kandaurov <pluknet@nginx.com>
parents: 556
diff changeset
64 proxy_connect_timeout 1s;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
65
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
66 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
67 listen 127.0.0.1:8080;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
68 proxy_pass u;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
69 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
70
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
71 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
72 listen 127.0.0.1:8081;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
73 proxy_pass u2;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
74 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
75
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
76 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
77 listen 127.0.0.1:8082;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
78 proxy_pass u3;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
79 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
80
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
81 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
82 listen 127.0.0.1:8083;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
83 proxy_pass u4;
1026
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
84 access_log %%TESTDIR%%/u.log bytes;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
85 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
86 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
87
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
88 EOF
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
89
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
90 $t->run_daemon(\&stream_daemon, port(8084));
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
91 $t->run_daemon(\&stream_daemon, port(8085));
1251
766bcbb632ee Tests: removed TODO and try_run() checks for legacy versions.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1105
diff changeset
92 $t->run()->plan(6);
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
93
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
94 $t->waitforsocket('127.0.0.1:' . port(8084));
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
95 $t->waitforsocket('127.0.0.1:' . port(8085));
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
96
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
97 ###############################################################################
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
98
1026
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
99 my @ports = my ($port4, $port5, $port6) = (port(8084), port(8085), port(8086));
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 816
diff changeset
100
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
101 is(many(30, port(8080)), "$port4: 15, $port5: 15", 'balanced');
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
102 is(many(30, port(8081)), "$port4: 15, $port5: 15", 'failures');
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
103 is(many(30, port(8082)), "$port4: 10, $port5: 20", 'weight');
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
104 is(many(30, port(8083)), "$port4: 30", 'backup');
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
105
1105
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
106 $t->run_daemon(\&stream_daemon, port(8086));
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
107 $t->waitforsocket('127.0.0.1:' . port(8086));
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
108
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
109 sleep 2; # wait till fail_timeout passes
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
110 is(parallel(30, port(8083)), "$port6: 30", 'recovery');
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
111
1026
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
112 $t->stop();
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
113
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
114 like($t->read_file('u.log'), qr/127.0.0.1:$port6, 127.0.0.1:$port4!0, 1!0, 4/,
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
115 'per-upstream variables');
e74a9342eb96 Tests: stream tests for per-upstream variables.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
116
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
117 ###############################################################################
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
118
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
119 sub many {
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 816
diff changeset
120 my ($count, $port) = @_;
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 816
diff changeset
121 my (%ports);
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
122
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
123 for (1 .. $count) {
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 816
diff changeset
124 if (stream("127.0.0.1:$port")->io('.') =~ /(\d+)/) {
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
125 $ports{$1} = 0 unless defined $ports{$1};
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
126 $ports{$1}++;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
127 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
128 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
129
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 816
diff changeset
130 my @keys = map { my $p = $_; grep { $p == $_ } keys %ports } @ports;
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 816
diff changeset
131 return join ', ', map { $_ . ": " . $ports{$_} } @keys;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
132 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
133
1105
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
134 sub parallel {
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
135 my ($count, $port) = @_;
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
136 my (%ports, @s);
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
137
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
138 for (1 .. $count) {
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
139 my $s = stream("127.0.0.1:$port");
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
140 $s->write('keep');
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
141 $s->read();
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
142 push @s, $s;
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
143 }
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
144
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
145 for (1 .. $count) {
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
146 if ((pop @s)->io('.') =~ /(\d+)/) {
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
147 $ports{$1} = 0 unless defined $ports{$1};
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
148 $ports{$1}++;
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
149 }
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
150 }
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
151
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
152 my @keys = map { my $p = $_; grep { $p == $_ } keys %ports } @ports;
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
153 return join ', ', map { $_ . ": " . $ports{$_} } @keys;
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
154 }
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
155
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
156 ###############################################################################
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
157
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
158 sub stream_daemon {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
159 my ($port) = @_;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
160
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
161 my $server = IO::Socket::INET->new(
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
162 Proto => 'tcp',
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
163 LocalAddr => '127.0.0.1',
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
164 LocalPort => $port,
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
165 Listen => 5,
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
166 Reuse => 1
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
167 )
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
168 or die "Can't create listening socket: $!\n";
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
169
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
170 my $sel = IO::Select->new($server);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
171
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
172 local $SIG{PIPE} = 'IGNORE';
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
173
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
174 while (my @ready = $sel->can_read) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
175 foreach my $fh (@ready) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
176 if ($server == $fh) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
177 my $new = $fh->accept;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
178 $new->autoflush(1);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
179 $sel->add($new);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
180
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
181 } elsif (stream_handle_client($fh)) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
182 $sel->remove($fh);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
183 $fh->close;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
184 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
185 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
186 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
187 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
188
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
189 sub stream_handle_client {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
190 my ($client) = @_;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
191
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
192 log2c("(new connection $client)");
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
193
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
194 $client->sysread(my $buffer, 65536) or return 1;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
195
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
196 log2i("$client $buffer");
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
197
1105
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
198 my $close = $buffer ne 'keep';
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
199 $buffer = $client->sockport();
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
200
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
201 log2o("$client $buffer");
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
202
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
203 $client->syswrite($buffer);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
204
1105
a073a545413d Tests: stream upstream tests for fast peer recovery.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1026
diff changeset
205 return $close;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
206 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
207
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
208 sub log2i { Test::Nginx::log_core('|| <<', @_); }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
209 sub log2o { Test::Nginx::log_core('|| >>', @_); }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
210 sub log2c { Test::Nginx::log_core('||', @_); }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
211
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
212 ###############################################################################