components/proftpd/patches/004.proftpd-retry.patch
author Jiri Sasek <Jiri.Sasek@Oracle.COM>
Thu, 14 Jul 2016 12:36:14 -0700
branchs11u3-sru
changeset 6417 3b844274a14e
permissions -rw-r--r--
23536514 ftp randomly could not build data connection
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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);