From fd9f0b7354ffc2986f0b2e7b074117feb29b5102 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Sat, 13 Aug 2022 20:19:16 +0100 Subject: [PATCH] Partial workaround for TCP Fast Open issue. Bug 2907 --- src/src/smtp_out.c | 2 +- src/src/transports/smtp.c | 11 +++++++++++ test/stderr/0388 | 1 + test/stderr/0512 | 4 ++++ 4 files changed, 17 insertions(+), 1 deletion(-) 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 -- 2.30.2