author | pkidd <patrick.kidd@oracle.com> |
Tue, 21 Feb 2017 09:42:20 -0800 | |
branch | s11u3-sru |
changeset 7677 | 9b4f5d1632d7 |
parent 6417 | 3b844274a14e |
permissions | -rw-r--r-- |
6417
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
1 |
Source: In-House |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
2 |
Reason: Solaris leave socket in TIME_WAIT status |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
3 |
Reasonable to upstream?: Not much for Linux. |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
4 |
|
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
5 |
Note: This patch do not look "pretty" but its code |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
6 |
is re-used from the original patch which colided |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
7 |
with the proftpd-1.3.6 code. During proftpd update |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
8 |
the binaries were tested on huge # of small files |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
9 |
(!passive) it looked good so the original patch was |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
10 |
removed. |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
11 |
Now it has returned as regression from supercluster |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
12 |
testing. |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
13 |
Final fix of this problem on Solaris will need further |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
14 |
discussion with community then it will be probably fixed |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
15 |
by a proftpd update. |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
16 |
|
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
17 |
--- a//src/data.c 2016-03-10 17:04:32.000000000 -0800 |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
18 |
+++ b/src/data.c 2016-06-23 05:41:37.547107933 -0700 |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
19 |
@@ -337,6 +337,7 @@ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
20 |
static int data_active_open(char *reason, off_t size) { |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
21 |
conn_t *c; |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
22 |
int bind_port, rev; |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
23 |
+ int retries = 0; |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
24 |
pr_netaddr_t *bind_addr; |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
25 |
unsigned char *root_revoke = NULL; |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
26 |
|
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
27 |
@@ -384,6 +385,7 @@ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
28 |
} |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
29 |
} |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
30 |
|
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
31 |
+ for(;;) { /* begin of endless loop */ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
32 |
session.d = pr_inet_create_conn(session.pool, -1, bind_addr, bind_port, TRUE); |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
33 |
if (session.d == NULL) { |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
34 |
int xerrno = errno; |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
35 |
@@ -425,7 +427,7 @@ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
36 |
pr_inet_set_socket_opts(session.d->pool, session.d, |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
37 |
(main_server->tcp_rcvbuf_override ? main_server->tcp_rcvbuf_len : 0), 0, |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
38 |
main_server->tcp_keepalive); |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
39 |
- |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
40 |
+ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
41 |
} else { |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
42 |
pr_inet_set_socket_opts(session.d->pool, session.d, |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
43 |
0, (main_server->tcp_sndbuf_override ? main_server->tcp_sndbuf_len : 0), |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
44 |
@@ -442,6 +444,13 @@ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
45 |
|
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
46 |
if (pr_inet_connect(session.d->pool, session.d, &session.data_addr, |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
47 |
session.data_port) == -1) { |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
48 |
+ if (session.d->xerrno == EADDRINUSE && retries < 16) { |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
49 |
+ destroy_pool(session.d->pool); |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
50 |
+ pr_signals_handle(); |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
51 |
+ /* Wait up to MSL to avoid TIME_WAIT. */ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
52 |
+ sleep(retries++); |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
53 |
+ continue; /* continue in endless loop */ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
54 |
+ } |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
55 |
pr_log_debug(DEBUG6, |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
56 |
"Error connecting to %s#%u for active data transfer: %s", |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
57 |
pr_netaddr_get_ipstr(&session.data_addr), session.data_port, |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
58 |
@@ -453,7 +462,8 @@ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
59 |
destroy_pool(session.d->pool); |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
60 |
session.d = NULL; |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
61 |
return -1; |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
62 |
- } |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
63 |
+ } else break; /* finish the endless loop */ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
64 |
+ } /* end of endless loop */ |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
65 |
|
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
66 |
c = pr_inet_openrw(session.pool, session.d, NULL, PR_NETIO_STRM_DATA, |
3b844274a14e
23536514 ftp randomly could not build data connection
Jiri Sasek <Jiri.Sasek@Oracle.COM>
parents:
diff
changeset
|
67 |
session.d->listen_fd, -1, -1, TRUE); |