You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2021/02/12 15:50:30 UTC
[trafficserver] branch 9.1.x updated: Disable client inactivity
timeout while server is processing POST request (#7309)
This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a commit to branch 9.1.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/9.1.x by this push:
new a6cd433 Disable client inactivity timeout while server is processing POST request (#7309)
a6cd433 is described below
commit a6cd433bdcb31071571b4f8164daa546d415b488
Author: Susan Hinrichs <sh...@yahoo-inc.com>
AuthorDate: Thu Feb 11 16:34:36 2021 -0600
Disable client inactivity timeout while server is processing POST request (#7309)
(cherry picked from commit f3eaf814753ef7dfa72e7b18f310a1a94052eb15)
---
proxy/http/HttpSM.cc | 27 ++----
tests/gold_tests/timeout/case-inactive1.sh | 19 ++++
tests/gold_tests/timeout/case-inactive2.sh | 19 ++++
tests/gold_tests/timeout/case-inactive3.sh | 19 ++++
tests/gold_tests/timeout/case-inactive4.sh | 19 ++++
tests/gold_tests/timeout/case-inactive5.sh | 19 ++++
tests/gold_tests/timeout/case-inactive6.sh | 19 ++++
tests/gold_tests/timeout/delay-inactive-server.sh | 20 ++++
.../timeout/inactive_client_post_timeout.test.py | 108 +++++++++++++++++++++
9 files changed, 251 insertions(+), 18 deletions(-)
diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc
index 2648131..66f3c92 100644
--- a/proxy/http/HttpSM.cc
+++ b/proxy/http/HttpSM.cc
@@ -2007,28 +2007,13 @@ HttpSM::state_read_server_response_header(int event, void *data)
// Now that we know that we have all of the origin server
// response headers, we can reset the client inactivity
- // timeout. This is unlikely to cause a recurrence of
- // old bug because there will be no more retries now that
- // the connection has been established. It is possible
- // however. We do not need to reset the inactivity timeout
- // if the request contains a body (noted by the
- // request_content_length field) because it was never
- // canceled.
- //
-
+ // timeout.
// we now reset the client inactivity timeout only
// when we are ready to send the response headers. In the
// case of transform plugin, this is after the transform
// outputs the 1st byte, which can take a long time if the
// plugin buffers the whole response.
- // Also, if the request contains a body, we cancel the timeout
- // when we read the 1st byte of the origin server response.
- /*
- if (ua_txn && !t_state.hdr_info.request_content_length) {
- ua_txn->get_netvc()->set_inactivity_timeout(HRTIME_SECONDS(
- HttpConfig::m_master.accept_no_activity_timeout));
- }
- */
+ ua_txn->set_inactivity_timeout(HRTIME_SECONDS(t_state.txn_conf->transaction_no_activity_timeout_in));
t_state.current.state = HttpTransact::CONNECTION_ALIVE;
t_state.transact_return_point = HttpTransact::HandleResponse;
@@ -3581,7 +3566,13 @@ HttpSM::tunnel_handler_post_ua(int event, HttpTunnelProducer *p)
}
}
- // Initiate another read to catch aborts and timeouts.
+ // Now that we have communicated the post body, turn off the inactivity timeout
+ // until the server starts sending data back
+ if (ua_txn && t_state.hdr_info.request_content_length) {
+ ua_txn->cancel_inactivity_timeout();
+ }
+
+ // Initiate another read to catch aborts
ua_entry->vc_handler = &HttpSM::state_watch_for_client_abort;
ua_entry->read_vio = p->vc->do_io_read(this, INT64_MAX, ua_buffer_reader->mbuf);
break;
diff --git a/tests/gold_tests/timeout/case-inactive1.sh b/tests/gold_tests/timeout/case-inactive1.sh
new file mode 100644
index 0000000..ecee593
--- /dev/null
+++ b/tests/gold_tests/timeout/case-inactive1.sh
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nc -4 -l ${2} -c "sh ./delay-inactive-server.sh" &
+sleep 1
+curl -i http://127.0.0.1:${1}/${3}
diff --git a/tests/gold_tests/timeout/case-inactive2.sh b/tests/gold_tests/timeout/case-inactive2.sh
new file mode 100644
index 0000000..d172741
--- /dev/null
+++ b/tests/gold_tests/timeout/case-inactive2.sh
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nc -4 -l ${2} -c "sh ./delay-inactive-server.sh" &
+sleep 1
+curl -k -i --http1.1 https://127.0.0.1:${1}/${3}
diff --git a/tests/gold_tests/timeout/case-inactive3.sh b/tests/gold_tests/timeout/case-inactive3.sh
new file mode 100644
index 0000000..9e6ad9d
--- /dev/null
+++ b/tests/gold_tests/timeout/case-inactive3.sh
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nc -4 -l ${2} -c "sh ./delay-inactive-server.sh" &
+sleep 1
+curl -k -i --http2 https://127.0.0.1:${1}/${3}
diff --git a/tests/gold_tests/timeout/case-inactive4.sh b/tests/gold_tests/timeout/case-inactive4.sh
new file mode 100644
index 0000000..d434d9a
--- /dev/null
+++ b/tests/gold_tests/timeout/case-inactive4.sh
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nc -4 -l ${2} -c "sh ./delay-inactive-server.sh" &
+sleep 1
+curl -d "post body" -k -i --http2 https://127.0.0.1:${1}/${3}
diff --git a/tests/gold_tests/timeout/case-inactive5.sh b/tests/gold_tests/timeout/case-inactive5.sh
new file mode 100644
index 0000000..7913436
--- /dev/null
+++ b/tests/gold_tests/timeout/case-inactive5.sh
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nc -4 -l ${2} -c "sh ./delay-inactive-server.sh" &
+sleep 1
+curl -d "post body" -i http://127.0.0.1:${1}/${3}
diff --git a/tests/gold_tests/timeout/case-inactive6.sh b/tests/gold_tests/timeout/case-inactive6.sh
new file mode 100644
index 0000000..9fba54f
--- /dev/null
+++ b/tests/gold_tests/timeout/case-inactive6.sh
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nc -4 -l ${2} -c "sh ./delay-inactive-server.sh" &
+sleep 1
+curl -d "post body" -k -i --http1.1 https://127.0.0.1:${1}/${3}
diff --git a/tests/gold_tests/timeout/delay-inactive-server.sh b/tests/gold_tests/timeout/delay-inactive-server.sh
new file mode 100644
index 0000000..c76df43
--- /dev/null
+++ b/tests/gold_tests/timeout/delay-inactive-server.sh
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+sleep 4
+printf "HTTP/1.1 200\r\nTransfer-encoding: chunked\r\n\r\n"
+printf "F\r\n123456789012345\r\n"
+printf "0\r\n\r\n"
diff --git a/tests/gold_tests/timeout/inactive_client_post_timeout.test.py b/tests/gold_tests/timeout/inactive_client_post_timeout.test.py
new file mode 100644
index 0000000..9bf7c8f
--- /dev/null
+++ b/tests/gold_tests/timeout/inactive_client_post_timeout.test.py
@@ -0,0 +1,108 @@
+'''
+'''
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+Test.Summary = 'Testing ATS client inactivity timeout'
+
+Test.SkipUnless(
+ Condition.HasCurlFeature('http2')
+)
+
+ts = Test.MakeATSProcess("ts", select_ports=True, enable_tls=True)
+
+Test.ContinueOnFail = True
+
+Test.GetTcpPort("upstream_port1")
+Test.GetTcpPort("upstream_port2")
+Test.GetTcpPort("upstream_port3")
+Test.GetTcpPort("upstream_port4")
+Test.GetTcpPort("upstream_port5")
+Test.GetTcpPort("upstream_port6")
+
+ts.addSSLfile("../tls/ssl/server.pem")
+ts.addSSLfile("../tls/ssl/server.key")
+
+ts.Disk.records_config.update({
+ 'proxy.config.diags.debug.enabled': 1,
+ 'proxy.config.diags.debug.tags': 'http',
+ 'proxy.config.ssl.server.cert.path': '{0}'.format(ts.Variables.SSLDir),
+ 'proxy.config.ssl.server.private_key.path': '{0}'.format(ts.Variables.SSLDir),
+ 'proxy.config.url_remap.remap_required': 1,
+ 'proxy.config.http.transaction_no_activity_timeout_in': 2,
+})
+
+ts.Disk.remap_config.AddLines([
+ 'map /case1 http://127.0.0.1:{0}'.format(Test.Variables.upstream_port1),
+ 'map /case2 http://127.0.0.1:{0}'.format(Test.Variables.upstream_port2),
+ 'map /case3 http://127.0.0.1:{0}'.format(Test.Variables.upstream_port3),
+ 'map /case4 http://127.0.0.1:{0}'.format(Test.Variables.upstream_port4),
+ 'map /case5 http://127.0.0.1:{0}'.format(Test.Variables.upstream_port5),
+ 'map /case6 http://127.0.0.1:{0}'.format(Test.Variables.upstream_port6),
+])
+
+ts.Disk.ssl_multicert_config.AddLine(
+ 'dest_ip=* ssl_cert_name=server.pem ssl_key_name=server.key'
+)
+
+# Using netcat with explicit delays instead of the delay option with microserver because it appears
+# that microserver will not delay responses to POST requests
+# The delay-inactive-server.sh will deplay for 4 seconds before returning a response. This is more
+# than the 2 second proxy.config.http.transaction_no_activity_timeout_in
+# These tests exercise that the client inactivity timeout is disabled after the request and post body
+# are sent. So a slow to respond server will not trigger the client inactivity timeout.
+
+tr4 = Test.AddTestRun("tr")
+tr4.Processes.Default.StartBefore(ts, ready=When.PortOpen(ts.Variables.ssl_port))
+tr4.Setup.Copy('delay-inactive-server.sh')
+tr4.Setup.Copy('case-inactive4.sh')
+tr4.Processes.Default.ReturnCode = 0
+tr4.Processes.Default.Command = 'sh -x ./case-inactive4.sh {0} {1} case4'.format(
+ ts.Variables.ssl_port, Test.Variables.upstream_port4)
+tr4.Processes.Default.Streams.All = Testers.ContainsExpression("HTTP/2 200", "Should get successful response")
+
+tr = Test.AddTestRun("tr")
+tr.Setup.Copy('case-inactive1.sh')
+tr.Processes.Default.Command = 'sh -x ./case-inactive1.sh {0} {1} case1'.format(ts.Variables.port, Test.Variables.upstream_port1)
+tr.Processes.Default.Streams.stdout = Testers.ContainsExpression(
+ "HTTP/1.1 200", "Client inactivity should not trigger during server stall")
+
+tr2 = Test.AddTestRun("tr")
+tr2.Setup.Copy('case-inactive2.sh')
+tr2.Processes.Default.Command = 'sh -x ./case-inactive2.sh {0} {1} case2'.format(
+ ts.Variables.ssl_port, Test.Variables.upstream_port2)
+tr2.Processes.Default.Streams.stdout = Testers.ContainsExpression(
+ "HTTP/1.1 200", "Client inactivity should not trigger during server stall")
+
+tr3 = Test.AddTestRun("tr")
+tr3.Setup.Copy('case-inactive3.sh')
+tr3.Processes.Default.Command = 'sh -x ./case-inactive3.sh {0} {1} case3'.format(
+ ts.Variables.ssl_port, Test.Variables.upstream_port3)
+tr3.Processes.Default.Streams.stdout = Testers.ContainsExpression(
+ "HTTP/2 200", "Client inactivity should not trigger during server stall")
+
+tr5 = Test.AddTestRun("tr")
+tr5.Setup.Copy('case-inactive5.sh')
+tr5.Processes.Default.Command = 'sh -x ./case-inactive5.sh {0} {1} case5'.format(ts.Variables.port, Test.Variables.upstream_port5)
+tr5.Processes.Default.Streams.stdout = Testers.ContainsExpression(
+ "HTTP/1.1 200", "Client inactivity timeout should not apply during server stall")
+
+tr6 = Test.AddTestRun("tr")
+tr6.Setup.Copy('case-inactive6.sh')
+tr6.Processes.Default.Command = 'sh -x ./case-inactive6.sh {0} {1} case6'.format(
+ ts.Variables.ssl_port, Test.Variables.upstream_port6)
+tr6.Processes.Default.Streams.stdout = Testers.ContainsExpression(
+ "HTTP/1.1 200", "Client inactivity timeout should not apply during server stall")