summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2022-08-13 20:19:16 +0100
committerJeremy Harris <jgh146exb@wizmail.org>2022-08-14 15:20:06 +0100
commitfd9f0b7354ffc2986f0b2e7b074117feb29b5102 (patch)
tree81e56306ca074711b84f330ad451da51d55878d6
parent9af85efb7be828ea239d51731571b25094211cf6 (diff)
downloadexim4-fd9f0b7354ffc2986f0b2e7b074117feb29b5102.tar.gz
Partial workaround for TCP Fast Open issue. Bug 2907
-rw-r--r--src/src/smtp_out.c2
-rw-r--r--src/src/transports/smtp.c11
-rw-r--r--test/stderr/03881
-rw-r--r--test/stderr/05124
4 files changed, 17 insertions, 1 deletions
diff --git a/src/src/smtp_out.c b/src/src/smtp_out.c
index 7b7bdf752..7f364d942 100644
--- a/src/src/smtp_out.c
+++ b/src/src/smtp_out.c
@@ -372,7 +372,7 @@ if (!save_errno)
# ifdef TCP_FASTOPEN_CONNECT
else
{ /* expecting client data */
- debug_printf(" set up lazy-connect\n");
+ DEBUG(D_transport|D_acl|D_v) debug_printf(" set up lazy-connect\n");
setsockopt(sock, IPPROTO_TCP, TCP_FASTOPEN_CONNECT, US &on, sizeof(on));
/* fastopen_blob = NULL; lazy TFO, triggered by data write */
}
diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c
index d7f251b0b..bbff1cad8 100644
--- a/src/src/transports/smtp.c
+++ b/src/src/transports/smtp.c
@@ -5312,6 +5312,17 @@ retry_non_continued:
uschar *retry_message_key = NULL;
uschar *serialize_key = NULL;
+ /* Deal slightly better with a possible Linux kernel bug that results
+ in intermittent TFO-conn fails deep into the TCP flow. Bug 2907 tracks.
+ Hack: Clear TFO option for any further hosts on this tpt run. */
+
+ if (total_hosts_tried > 0)
+ {
+ DEBUG(D_transport|D_acl|D_v)
+ debug_printf("Clearing TFO as not first host for message\n");
+ ob->hosts_try_fastopen = US"";
+ }
+
/* Default next host is next host. :-) But this can vary if the
hosts_max_try limit is hit (see below). It may also be reset if a host
address is looked up here (in case the host was multihomed). */
diff --git a/test/stderr/0388 b/test/stderr/0388
index c3c11ca75..ac9dc436a 100644
--- a/test/stderr/0388
+++ b/test/stderr/0388
@@ -110,6 +110,7 @@ set_process_info: pppp delivering 10HmaX-0005vi-00: just tried 127.0.0.1 [127.0.
address match test: subject=*@127.0.0.1 pattern=*
127.0.0.1 in "*"? yes (matched "*")
*@127.0.0.1 in "*"? yes (matched "*")
+Clearing TFO as not first host for message
checking status of V4NET.0.0.0
locking TESTSUITE/spool/db/retry.lockfile
locked TESTSUITE/spool/db/retry.lockfile
diff --git a/test/stderr/0512 b/test/stderr/0512
index e54ebb17e..630242d13 100644
--- a/test/stderr/0512
+++ b/test/stderr/0512
@@ -20,6 +20,7 @@ LOG: MAIN
H=127.0.0.1 [127.0.0.1] Connection refused
added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
temporary delivery error(s) override hosts_max_try (message older than host's retry time)
+Clearing TFO as not first host for message
getting address for 127.0.0.1
checking status of 127.0.0.1
no message retry record
@@ -31,6 +32,7 @@ LOG: MAIN
H=127.0.0.1 [127.0.0.1] Connection refused
added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
temporary delivery error(s) override hosts_max_try (message older than host's retry time)
+Clearing TFO as not first host for message
getting address for 127.0.0.1
checking status of 127.0.0.1
no message retry record
@@ -42,6 +44,7 @@ LOG: MAIN
H=127.0.0.1 [127.0.0.1] Connection refused
added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
temporary delivery error(s) override hosts_max_try (message older than host's retry time)
+Clearing TFO as not first host for message
getting address for 127.0.0.1
checking status of 127.0.0.1
no message retry record
@@ -108,6 +111,7 @@ LOG: MAIN
H=127.0.0.1 [127.0.0.1] Connection refused
added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
temporary delivery error(s) override hosts_max_try (message older than host's retry time)
+Clearing TFO as not first host for message
getting address for 127.0.0.1
checking status of 127.0.0.1
no message retry record