This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a commit to branch 9.2.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/9.2.x by this push:
new 8685ec342 Enable slice prefetching for range requests (#9130)
8685ec342 is described below
commit 8685ec3421057397e96f190e4ea9c9d96e7bf566
Author: Serris Lew <[email protected]>
AuthorDate: Mon Oct 31 15:42:45 2022 -0700
Enable slice prefetching for range requests (#9130)
Co-authored-by: Serris Lew <[email protected]>
(cherry picked from commit 8183e931b15a60b2e5ce802b36c27dbeea840694)
---
doc/admin-guide/plugins/slice.en.rst | 5 +++--
plugins/experimental/slice/server.cc | 8 +++++++-
plugins/experimental/slice/util.cc | 7 ++++---
.../gold_tests/pluginTest/slice/gold/slice_prefetch.gold | 15 +++++++--------
tests/gold_tests/pluginTest/slice/slice_prefetch.test.py | 15 ++++++++-------
5 files changed, 29 insertions(+), 21 deletions(-)
diff --git a/doc/admin-guide/plugins/slice.en.rst
b/doc/admin-guide/plugins/slice.en.rst
index f9f26bdf3..8426c18b0 100644
--- a/doc/admin-guide/plugins/slice.en.rst
+++ b/doc/admin-guide/plugins/slice.en.rst
@@ -130,8 +130,9 @@ The slice plugin supports the following options::
Default is 0
Prefetches successive 'n' slice block requests in the background
and caches (with `cache_range_requests` plugin). Prefetching is only
- enabled when first block is a cacheable object with miss or hit-stale
status.
- Especially for large objects, prefetching can improve cache miss
latency.
+ enabled when first block (of the client request) is a cacheable object
+ with miss or hit-stale status. Especially for large objects,
prefetching
+ can improve cache miss latency.
-f for short
Examples::
diff --git a/plugins/experimental/slice/server.cc
b/plugins/experimental/slice/server.cc
index 2d4c1d812..d79425921 100644
--- a/plugins/experimental/slice/server.cc
+++ b/plugins/experimental/slice/server.cc
@@ -223,7 +223,8 @@ handleFirstServerHeader(Data *const data, TSCont const
contp)
data->m_bytessent = hbytes;
TSVIOReenable(output_vio);
- if (data->m_config->m_prefetchcount > 0 &&
header.hasKey(SLICE_CRR_HEADER.data(), SLICE_CRR_HEADER.size())) {
+ if (data->m_config->m_prefetchcount > 0 && data->m_blocknum ==
data->m_req_range.firstBlockFor(data->m_config->m_blockbytes) &&
+ header.hasKey(SLICE_CRR_HEADER.data(), SLICE_CRR_HEADER.size())) {
data->m_prefetchable = true;
}
@@ -479,6 +480,11 @@ handleNextServerHeader(Data *const data, TSCont const
contp)
data->m_blockexpected = blockcr.rangeSize();
+ if (data->m_config->m_prefetchcount > 0 && data->m_blocknum ==
data->m_req_range.firstBlockFor(data->m_config->m_blockbytes) &&
+ header.hasKey(SLICE_CRR_HEADER.data(), SLICE_CRR_HEADER.size())) {
+ data->m_prefetchable = true;
+ }
+
return true;
}
diff --git a/plugins/experimental/slice/util.cc
b/plugins/experimental/slice/util.cc
index f9c74ed1a..60b7a175d 100644
--- a/plugins/experimental/slice/util.cc
+++ b/plugins/experimental/slice/util.cc
@@ -88,7 +88,8 @@ request_block(TSCont contp, Data *const data)
}
header.removeKey(SLICE_CRR_HEADER.data(), SLICE_CRR_HEADER.size());
- if (data->m_blocknum == 0 && data->m_config->m_prefetchcount > 0) {
+ if (data->m_config->m_prefetchcount > 0 && data->m_req_range.m_beg >= 0 &&
+ data->m_blocknum ==
data->m_req_range.firstBlockFor(data->m_config->m_blockbytes)) {
header.setKeyVal(SLICE_CRR_HEADER.data(), SLICE_CRR_HEADER.size(),
SLICE_CRR_VAL.data(), SLICE_CRR_VAL.size());
}
@@ -119,8 +120,8 @@ request_block(TSCont contp, Data *const data)
// if prefetch config set, schedule next block requests in background
if (data->m_prefetchable && data->m_config->m_prefetchcount > 0) {
- int nextblocknum = 2;
- if (data->m_blocknum > 1) {
+ int nextblocknum = data->m_blocknum + 1;
+ if (data->m_blocknum >
data->m_req_range.firstBlockFor(data->m_config->m_blockbytes) + 1) {
nextblocknum = data->m_blocknum + data->m_config->m_prefetchcount;
}
for (int i = nextblocknum; i <= data->m_blocknum +
data->m_config->m_prefetchcount; i++) {
diff --git a/tests/gold_tests/pluginTest/slice/gold/slice_prefetch.gold
b/tests/gold_tests/pluginTest/slice/gold/slice_prefetch.gold
index 1a82ca139..3445708de 100644
--- a/tests/gold_tests/pluginTest/slice/gold/slice_prefetch.gold
+++ b/tests/gold_tests/pluginTest/slice/gold/slice_prefetch.gold
@@ -12,16 +12,15 @@ bytes ``/18 hit-stale
bytes ``/18 hit-stale
bytes 14-17/18 hit-fresh
- hit-stale, none
-bytes 0-4/18 miss
-bytes ``/18 ``
-bytes ``/18 ``
-bytes ``/18 ``
-bytes ``/18 ``
-bytes 15-17/18 hit-fresh
-bytes 0-17/18 miss, none
bytes 0-6/18 hit-fresh
bytes 7-13/18 hit-fresh
bytes 14-17/18 hit-fresh
-bytes 5-16/18 hit-fresh, none
+bytes 0-17/18 hit-fresh, none
+bytes 0-4/18 miss
+bytes ``/18 miss
+bytes ``/18 miss
+bytes ``/18 miss
+bytes 15-17/18 hit-fresh
+bytes 5-16/18 miss, none
bytes 0-6/18 hit-fresh
*/18 hit-fresh, none
diff --git a/tests/gold_tests/pluginTest/slice/slice_prefetch.test.py
b/tests/gold_tests/pluginTest/slice/slice_prefetch.test.py
index 4201d6873..59b028669 100644
--- a/tests/gold_tests/pluginTest/slice/slice_prefetch.test.py
+++ b/tests/gold_tests/pluginTest/slice/slice_prefetch.test.py
@@ -150,25 +150,26 @@ ps.Streams.stdout.Content =
Testers.ContainsExpression("200 OK", "expected 200 O
ps.Streams.stdout.Content += Testers.ContainsExpression("X-Cache: hit-stale",
"expected cache hit-stale")
tr.StillRunningAfter = ts
-# 3 Test - Full object slice (miss) with only blocks 10-14, 15-19 prefetched
in background, block bytes= 5
-tr = Test.AddTestRun("Full object slice: first block is miss, only blocks
10-14, 15-19 prefetched")
+# 3 Test - Full object slice (hit-fresh) with no prefetched blocks, block
bytes= 7
+tr = Test.AddTestRun("Full object slice: first block is hit-fresh with range
0-, no blocks prefetched")
ps = tr.Processes.Default
-ps.Command = curl_and_args + ' http://sliceprefetchbytes2/path' + ' -r 0-'
+ps.Command = curl_and_args + ' http://sliceprefetchbytes1/path' + ' -r 0-'
ps.ReturnCode = 0
ps.Streams.stderr = "gold/slice_200.stderr.gold"
ps.Streams.stdout.Content = Testers.ContainsExpression("206 Partial Content",
"expected 206 response")
ps.Streams.stdout.Content += Testers.ContainsExpression("Content-Range: bytes
0-17/18", "mismatch byte content response")
-ps.Streams.stdout.Content += Testers.ContainsExpression("X-Cache: miss",
"expected cache miss")
+ps.Streams.stdout.Content += Testers.ContainsExpression("X-Cache: hit-fresh",
"expected cache hit-fresh")
tr.StillRunningAfter = ts
-# 4 Test - Non aligned slice request
-tr = Test.AddTestRun("Non aligned slice request")
+# 4 Test - Client range request (hit-stale/miss) enables prefetching
+tr = Test.AddTestRun("Client range request")
ps = tr.Processes.Default
-ps.Command = curl_and_args + ' http://sliceprefetchbytes1/path' + ' -r 5-16'
+ps.Command = curl_and_args + ' http://sliceprefetchbytes2/path' + ' -r 5-16'
ps.ReturnCode = 0
ps.Streams.stderr = "gold/slice_mid.stderr.gold"
ps.Streams.stdout.Content = Testers.ContainsExpression("206 Partial Content",
"expected 206 response")
ps.Streams.stdout.Content += Testers.ContainsExpression("Content-Range: bytes
5-16/18", "mismatch byte content response")
+ps.Streams.stdout.Content += Testers.ContainsExpression("X-Cache: miss",
"expected cache miss")
tr.StillRunningAfter = ts
# 5 Test - special case, begin inside last slice block but outside asset len