annotate stream_upstream_least_conn.t @ 572:ca54b445d982

Tests: masked nginx bug in proxy next upstream. When iterating through several next upstreams per a worker cycle, a previously reported event about upstream connection error may be improperly applied to the next upstream, thus leading to the invalid connection error. E.g., in kqueue, where the problem is visible, this is caused by "ev->instance" that does not tolerate more than one next upstream at once, and kevents placed on the kqueue separately for read and write events. The change is to limit test case to the only one next upstream.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 14 May 2015 11:54:24 +0300
parents 4296379213c8
children 824754da4afc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
557
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1 #!/usr/bin/perl
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
2
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
3 # (C) Sergey Kandaurov
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
4 # (C) Nginx, Inc.
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
5
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
6 # Stream tests for upstream least_conn balancer module.
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
7
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
8 ###############################################################################
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
9
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
10 use warnings;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
11 use strict;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
12
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
13 use Test::More;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
14
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
15 use IO::Select;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
16
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
17 BEGIN { use FindBin; chdir($FindBin::Bin); }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
18
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
19 use lib 'lib';
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
20 use Test::Nginx;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
21
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
22 ###############################################################################
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
23
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
24 select STDERR; $| = 1;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
25 select STDOUT; $| = 1;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
26
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
27 my $t = Test::Nginx->new()->has(qw/stream stream_upstream_least_conn/)->plan(2)
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
28 ->write_file_expand('nginx.conf', <<'EOF');
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
29
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
30 %%TEST_GLOBALS%%
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
31
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
32 daemon off;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
33
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
34 events {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
35 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
36
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
37 stream {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
38 upstream u {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
39 least_conn;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
40 server 127.0.0.1:8081;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
41 server 127.0.0.1:8082;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
42 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
43
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
44 server {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
45 listen 127.0.0.1:8080;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
46 proxy_pass u;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
47 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
48 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
49
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
50 EOF
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
51
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
52 $t->run_daemon(\&stream_daemon, 8081);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
53 $t->run_daemon(\&stream_daemon, 8082);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
54 $t->run();
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
55
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
56 $t->waitforsocket('127.0.0.1:8081');
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
57 $t->waitforsocket('127.0.0.1:8082');
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
58
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
59 ###############################################################################
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
60
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
61 is(many('.', 10), '8081: 5, 8082: 5', 'balanced');
566
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
62
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
63 my @sockets;
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
64 for (1 .. 2) {
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
65 my $s = stream_connect();
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
66 stream_write($s, 'w');
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
67 push @sockets, $s;
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
68 }
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
69
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
70 select undef, undef, undef, 0.2;
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
71
4296379213c8 Tests: refactored stream least_conn tests similar to e4ff43e00d84.
Sergey Kandaurov <pluknet@nginx.com>
parents: 565
diff changeset
72 is(many('.', 10), '8082: 10', 'least_conn');
557
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
73
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
74 ###############################################################################
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
75
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
76 sub many {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
77 my ($data, $count, %opts) = @_;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
78 my (%ports, $peer);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
79
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
80 $peer = $opts{peer};
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
81
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
82 for (1 .. $count) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
83 if (stream_get($data, $peer) =~ /(\d+)/) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
84 $ports{$1} = 0 unless defined $ports{$1};
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
85 $ports{$1}++;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
86 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
87 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
88
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
89 return join ', ', map { $_ . ": " . $ports{$_} } sort keys %ports;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
90 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
91
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
92 sub parallel {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
93 my ($data, $count, %opts) = @_;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
94 my (@sockets, %ports, $peer);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
95
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
96 $peer = $opts{peer} || undef;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
97
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
98 for (1 .. $count) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
99 my $s = stream_connect($peer);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
100 push @sockets, $s;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
101 stream_write($s, $data);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
102 select undef, undef, undef, 0.2;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
103 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
104
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
105 for (1 .. $count) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
106 my $s = pop @sockets;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
107 if (stream_read($s) =~ /(\d+)/) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
108 $ports{$1} = 0 unless defined $ports{$1};
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
109 $ports{$1}++;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
110 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
111 close $s;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
112 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
113
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
114 return join ', ', map { $_ . ": " . $ports{$_} } sort keys %ports;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
115 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
116
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
117 sub stream_get {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
118 my ($data, $peer) = @_;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
119
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
120 my $s = stream_connect($peer);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
121 stream_write($s, $data);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
122
565
ff49e1c00b35 Tests: in stream tests, try to read all the data where appropriate.
Sergey Kandaurov <pluknet@nginx.com>
parents: 557
diff changeset
123 $data = '';
ff49e1c00b35 Tests: in stream tests, try to read all the data where appropriate.
Sergey Kandaurov <pluknet@nginx.com>
parents: 557
diff changeset
124 while (my $buf = stream_read($s)) {
ff49e1c00b35 Tests: in stream tests, try to read all the data where appropriate.
Sergey Kandaurov <pluknet@nginx.com>
parents: 557
diff changeset
125 $data .= $buf;
ff49e1c00b35 Tests: in stream tests, try to read all the data where appropriate.
Sergey Kandaurov <pluknet@nginx.com>
parents: 557
diff changeset
126 }
ff49e1c00b35 Tests: in stream tests, try to read all the data where appropriate.
Sergey Kandaurov <pluknet@nginx.com>
parents: 557
diff changeset
127 return $data;
557
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
128 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
129
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
130 sub stream_connect {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
131 my $peer = shift;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
132 my $s = IO::Socket::INET->new(
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
133 Proto => 'tcp',
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
134 PeerAddr => $peer || '127.0.0.1:8080'
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
135 )
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
136 or die "Can't connect to nginx: $!\n";
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
137
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
138 return $s;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
139 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
140
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
141 sub stream_write {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
142 my ($s, $message) = @_;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
143
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
144 local $SIG{PIPE} = 'IGNORE';
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
145
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
146 $s->blocking(0);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
147 while (IO::Select->new($s)->can_write(1.5)) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
148 my $n = $s->syswrite($message);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
149 last unless $n;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
150 $message = substr($message, $n);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
151 last unless length $message;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
152 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
153
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
154 if (length $message) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
155 $s->close();
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
156 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
157 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
158
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
159 sub stream_read {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
160 my ($s) = @_;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
161 my ($buf);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
162
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
163 $s->blocking(0);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
164 if (IO::Select->new($s)->can_read(3)) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
165 $s->sysread($buf, 1024);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
166 };
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
167
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
168 log_in($buf);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
169 return $buf;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
170 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
171
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
172 ###############################################################################
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
173
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
174 sub stream_daemon {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
175 my ($port) = @_;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
176
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
177 my $server = IO::Socket::INET->new(
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
178 Proto => 'tcp',
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
179 LocalAddr => '127.0.0.1',
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
180 LocalPort => $port,
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
181 Listen => 5,
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
182 Reuse => 1
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
183 )
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
184 or die "Can't create listening socket: $!\n";
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
185
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
186 my $sel = IO::Select->new($server);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
187
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
188 local $SIG{PIPE} = 'IGNORE';
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
189
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
190 while (my @ready = $sel->can_read) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
191 foreach my $fh (@ready) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
192 if ($server == $fh) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
193 my $new = $fh->accept;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
194 $new->autoflush(1);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
195 $sel->add($new);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
196
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
197 } elsif (stream_handle_client($fh)) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
198 $sel->remove($fh);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
199 $fh->close;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
200 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
201 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
202 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
203 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
204
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
205 sub stream_handle_client {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
206 my ($client) = @_;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
207
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
208 log2c("(new connection $client)");
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
209
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
210 $client->sysread(my $buffer, 65536) or return 1;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
211
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
212 log2i("$client $buffer");
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
213
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
214 my $port = $client->sockport();
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
215
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
216 if ($buffer =~ /w/ && $port == 8081) {
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
217 Test::Nginx::log_core('||', "$port: sleep(2.5)");
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
218 select undef, undef, undef, 2.5;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
219 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
220
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
221 $buffer = $port;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
222
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
223 log2o("$client $buffer");
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
224
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
225 $client->syswrite($buffer);
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
226
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
227 return 1;
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
228 }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
229
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
230 sub log2i { Test::Nginx::log_core('|| <<', @_); }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
231 sub log2o { Test::Nginx::log_core('|| >>', @_); }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
232 sub log2c { Test::Nginx::log_core('||', @_); }
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
233
05cbe9e2def8 Tests: basic stream tests for upstream least_conn.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
234 ###############################################################################