This is an automated email from the ASF dual-hosted git repository.
maskit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new dc7843b020 Add configuration for UDP poll timeout (#9733)
dc7843b020 is described below
commit dc7843b02073b1013f9e71b133c461299e5143a1
Author: JosiahWI <[email protected]>
AuthorDate: Thu May 25 11:30:47 2023 -0500
Add configuration for UDP poll timeout (#9733)
* Add configuration for UDP poll timeout
Add proxy.config.udp.poll_timeout with a default value of 100. Default
value and value of 10 are verified with autest.
Closes #4634
* Move udp.poll_timeout autests into separate file
* Revert changes to quic_no_activity_timeout.test.py
* Remove unused parameters from quic_poll_timeout
* Remove ssl and http tags from quic_poll_timeout
* Fix option path in quic_poll_timeout
---
doc/admin-guide/files/records.yaml.en.rst | 8 +++
iocore/net/UnixUDPNet.cc | 8 ++-
src/records/RecordsConfig.cc | 2 +
tests/gold_tests/timeout/quic_poll_timeout.test.py | 83 ++++++++++++++++++++++
4 files changed, 98 insertions(+), 3 deletions(-)
diff --git a/doc/admin-guide/files/records.yaml.en.rst
b/doc/admin-guide/files/records.yaml.en.rst
index 35982acd6e..ded30d08c4 100644
--- a/doc/admin-guide/files/records.yaml.en.rst
+++ b/doc/admin-guide/files/records.yaml.en.rst
@@ -4838,6 +4838,14 @@ removed in the future without prior notice.
UDP Configuration
=====================
+.. ts:cv:: CONFIG proxy.config.udp.poll_timeout INT 100
+ :units: milliseconds
+
+ This is the timeout for listening UDP connections to ``epoll_wait()`` on
+ Linux platforms, and to ``kevent()`` on BSD type OSs. The default value is
+ 100. See :ts:cv:`proxy.config.net.poll_timeout` for general information on
+ poll_timeout.
+
.. ts:cv:: CONFIG proxy.config.udp.threads INT 0
Specifies the number of UDP threads to run. By default 0 threads are
dedicated to UDP,
diff --git a/iocore/net/UnixUDPNet.cc b/iocore/net/UnixUDPNet.cc
index 26c9574392..429beae24d 100644
--- a/iocore/net/UnixUDPNet.cc
+++ b/iocore/net/UnixUDPNet.cc
@@ -144,6 +144,7 @@ UDPPacket::free()
UDPNetProcessorInternal udpNetInternal;
UDPNetProcessor &udpNet = udpNetInternal;
+int g_udp_pollTimeout;
int32_t g_udp_periodicCleanupSlots;
int32_t g_udp_periodicFreeCancelledPkts;
int32_t g_udp_numSendRetries;
@@ -172,9 +173,10 @@ initialize_thread_for_udp_net(EThread *thread)
PollCont *upc = get_UDPPollCont(thread);
PollDescriptor *upd = upc->pollDescriptor;
- // due to ET_UDP is really simple, it should sleep for a long time
- // TODO: fixed size
- upc->poll_timeout = 100;
+
+ REC_ReadConfigInteger(g_udp_pollTimeout, "proxy.config.udp.poll_timeout");
+ upc->poll_timeout = g_udp_pollTimeout;
+
// This variable controls how often we cleanup the cancelled packets.
// If it is set to 0, then cleanup never occurs.
REC_ReadConfigInt32(g_udp_periodicFreeCancelledPkts,
"proxy.config.udp.free_cancelled_pkts_sec");
diff --git a/src/records/RecordsConfig.cc b/src/records/RecordsConfig.cc
index 18ff2c5818..c01d2a9b76 100644
--- a/src/records/RecordsConfig.cc
+++ b/src/records/RecordsConfig.cc
@@ -254,6 +254,8 @@ static const RecordElement RecordsConfig[] =
,
{RECT_CONFIG, "proxy.config.udp.send_retries", RECD_INT, "0", RECU_NULL,
RR_NULL, RECC_NULL, nullptr, RECA_NULL}
,
+ {RECT_CONFIG, "proxy.config.udp.poll_timeout", RECD_INT, "100",
RECU_RESTART_TS, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
+ ,
{RECT_CONFIG, "proxy.config.udp.threads", RECD_INT, "0", RECU_RESTART_TS,
RR_NULL, RECC_NULL, nullptr, RECA_NULL}
,
{RECT_CONFIG, "proxy.config.udp.enable_gso", RECD_INT, "1", RECU_NULL,
RR_NULL, RECC_NULL, nullptr, RECA_NULL}
diff --git a/tests/gold_tests/timeout/quic_poll_timeout.test.py
b/tests/gold_tests/timeout/quic_poll_timeout.test.py
new file mode 100644
index 0000000000..04ea8b7510
--- /dev/null
+++ b/tests/gold_tests/timeout/quic_poll_timeout.test.py
@@ -0,0 +1,83 @@
+# 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.
+
+from typing import Optional
+
+Test.Summary = 'Checks ts.proxy.config.udp.poll_timeout'
+
+Test.SkipUnless(
+ Condition.HasATSFeature('TS_HAS_QUICHE')
+)
+
+
+class TestPollTimeout:
+ """Configure a test for poll_timeout."""
+
+ ts_counter: int = 0
+
+ def __init__(self, name: str, udp_poll_timeout_in: Optional[int] = None)
-> None:
+ """Initialize the test.
+
+ :param name: The name of the test.
+ :param udp_poll_timeout_in: Configuration value for
proxy.config.udp.poll_timeout
+ """
+ self.name = name
+ self.udp_poll_timeout_in = udp_poll_timeout_in
+ self.expected_udp_poll_timeout = 100
+ if udp_poll_timeout_in is not None:
+ self.expected_udp_poll_timeout = udp_poll_timeout_in
+
+ def _configure_traffic_server(self, tr: 'TestRun'):
+ """Configure Traffic Server.
+
+ :param tr: The TestRun object to associate the ts process with.
+ """
+ ts = tr.MakeATSProcess(f"ts-{TestPollTimeout.ts_counter}",
enable_quic=True, enable_tls=True)
+
+ TestPollTimeout.ts_counter += 1
+ self._ts = ts
+ self._ts.Disk.records_config.update({
+ 'proxy.config.diags.debug.enabled': 1,
+ 'proxy.config.diags.debug.tags':
'net|v_quic|quic|socket|inactivity_cop|v_iocore_net_poll',
+ })
+
+ if self.udp_poll_timeout_in is not None:
+ self._ts.Disk.records_config.update({
+ 'proxy.config.udp.poll_timeout': self.udp_poll_timeout_in
+ })
+
+ def run(self):
+ """Run the test."""
+ tr = Test.AddTestRun(self.name)
+ self._configure_traffic_server(tr)
+
+ tr.Processes.Default.Command = "echo 'testing
ts.proxy.config.udp.poll_timeout'"
+ tr.Processes.Default.StartBefore(self._ts)
+
+ self._ts.Disk.traffic_out.Content += Testers.IncludesExpression(
+ f"ET_UDP.*timeout: {self.expected_udp_poll_timeout},", "Verify UDP
poll timeout.")
+
+# Tests start.
+
+
+test0 = TestPollTimeout(
+ "Test ts.proxy.config.udp.poll_timeout with default value.")
+test0.run()
+
+test1 = TestPollTimeout(
+ "Test ts.proxy.config.udp.poll_timeout with value of 10.",
+ udp_poll_timeout_in=10)
+test1.run()