This is an automated email from the ASF dual-hosted git repository.
bcall 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 54d44fc863 Use slice req method type in Data obj (#10925)
54d44fc863 is described below
commit 54d44fc86367ba3fbb0a0e5de75d498fb15aa3fe
Author: Serris Lew <[email protected]>
AuthorDate: Mon Dec 18 09:24:10 2023 -0800
Use slice req method type in Data obj (#10925)
* Save slice req method type in Data obj
* refactor request_block code
* bypass vio logic for PURGE
---------
Co-authored-by: Serris Lew <[email protected]>
(cherry picked from commit db7e10542a3bc928c26e4ed1cdf81e7a01ccbb7d)
---
plugins/experimental/slice/Config.h | 12 ++----------
plugins/experimental/slice/Data.h | 9 +++++++++
plugins/experimental/slice/server.cc | 25 ++++++++++++++-----------
plugins/experimental/slice/slice.cc | 6 ++----
plugins/experimental/slice/util.cc | 2 +-
5 files changed, 28 insertions(+), 26 deletions(-)
diff --git a/plugins/experimental/slice/Config.h
b/plugins/experimental/slice/Config.h
index 430495333a..fe409e6866 100644
--- a/plugins/experimental/slice/Config.h
+++ b/plugins/experimental/slice/Config.h
@@ -45,9 +45,8 @@ struct Config {
int m_paceerrsecs{0}; // -1 disable logging, 0 no pacing, max 60s
int m_prefetchcount{0}; // 0 disables prefetching
enum RefType { First, Relative };
- RefType m_reftype{First}; // reference slice is relative to request
- const char *m_method_type{nullptr}; // type of header request
- bool m_head_strip_range{false}; // strip range header for head requests
+ RefType m_reftype{First}; // reference slice is relative to request
+ bool m_head_strip_range{false}; // strip range header for head requests
std::string m_skip_header;
std::string m_crr_ims_header;
@@ -71,13 +70,6 @@ struct Config {
return None != m_regex_type;
}
- // Check if response only expects header
- bool
- onlyHeader() const
- {
- return (m_method_type == TS_HTTP_METHOD_HEAD || m_method_type ==
TS_HTTP_METHOD_PURGE);
- }
-
// If no null reg, true, otherwise check against regex
bool matchesRegex(char const *const url, int const urllen) const;
diff --git a/plugins/experimental/slice/Data.h
b/plugins/experimental/slice/Data.h
index 8e654a69bc..5cd7e8538f 100644
--- a/plugins/experimental/slice/Data.h
+++ b/plugins/experimental/slice/Data.h
@@ -71,6 +71,8 @@ struct Data {
TSHttpStatus m_statustype{TS_HTTP_STATUS_NONE}; // 200 or 206
+ const char *m_method_type{nullptr}; // type of header request
+
Range m_req_range; // converted to half open interval
int64_t m_blocknum{-1}; // block number to work on, -1 bad/stop
@@ -108,6 +110,13 @@ struct Data {
m_lastmodified[0] = '\0';
}
+ // Check if response only expects header
+ bool
+ onlyHeader() const
+ {
+ return (m_method_type == TS_HTTP_METHOD_HEAD || m_method_type ==
TS_HTTP_METHOD_PURGE);
+ }
+
~Data()
{
if (nullptr != m_urlbuf) {
diff --git a/plugins/experimental/slice/server.cc
b/plugins/experimental/slice/server.cc
index ba342d862e..3df401240e 100644
--- a/plugins/experimental/slice/server.cc
+++ b/plugins/experimental/slice/server.cc
@@ -111,7 +111,7 @@ handleFirstServerHeader(Data *const data, TSCont const
contp)
// Should run TSVIONSetBytes(output_io, hlen + bodybytes);
int64_t const hlen = TSHttpHdrLengthGet(header.m_buffer, header.m_lochdr);
int64_t const clen = contentLengthFrom(header);
- if (TS_HTTP_STATUS_OK == header.status() && data->m_config->onlyHeader()) {
+ if (TS_HTTP_STATUS_OK == header.status() && data->onlyHeader()) {
DEBUG_LOG("HEAD/PURGE request stripped Range header: expects 200");
data->m_bytestosend = hlen;
data->m_blockexpected = 0;
@@ -220,7 +220,7 @@ handleFirstServerHeader(Data *const data, TSCont const
contp)
int const hbytes = TSHttpHdrLengthGet(header.m_buffer, header.m_lochdr);
// HEAD request only sends header
- if (data->m_config->onlyHeader()) {
+ if (data->onlyHeader()) {
data->m_bytestosend = hbytes;
data->m_blockexpected = 0;
} else {
@@ -364,7 +364,7 @@ handleNextServerHeader(Data *const data, TSCont const contp)
switch (header.status()) {
case TS_HTTP_STATUS_NOT_FOUND:
- if (data->m_config->onlyHeader()) {
+ if (data->onlyHeader()) {
return false;
}
// need to reissue reference slice
@@ -374,7 +374,7 @@ handleNextServerHeader(Data *const data, TSCont const contp)
case TS_HTTP_STATUS_PARTIAL_CONTENT:
break;
default:
- if (data->m_config->onlyHeader() && header.status() == TS_HTTP_STATUS_OK) {
+ if (data->onlyHeader() && header.status() == TS_HTTP_STATUS_OK) {
return true;
}
DEBUG_LOG("Non 206/404 internal block response encountered");
@@ -640,7 +640,7 @@ handle_server_resp(TSCont contp, TSEvent event, Data *const
data)
// corner condition, good source header + 0 length aborted content
// results in no header being read, just an EOS.
// trying to delete the upstream will crash ATS (??)
- if (0 == data->m_blockexpected && !data->m_config->onlyHeader()) {
+ if (0 == data->m_blockexpected && !data->onlyHeader()) {
shutdown(contp, data); // this will crash if first block
return;
}
@@ -673,12 +673,15 @@ handle_server_resp(TSCont contp, TSEvent event, Data
*const data)
// continue processing blocks if more requests need to be made
// HEAD requests only has one slice block
if (data->m_req_range.blockIsInside(data->m_config->m_blockbytes,
data->m_blocknum) &&
- data->m_config->m_method_type != TS_HTTP_METHOD_HEAD) {
+ data->m_method_type != TS_HTTP_METHOD_HEAD) {
// Don't immediately request the next slice if the client
// isn't keeping up
- bool start_next_block = true;
- if (data->m_dnstream.m_write.isOpen()) {
+ bool start_next_block = false;
+ if (data->m_method_type == TS_HTTP_METHOD_PURGE) {
+ // for PURGE requests, clients won't request more data (no body
content)
+ start_next_block = true;
+ } else if (data->m_dnstream.m_write.isOpen()) {
// check throttle condition
TSVIO const output_vio = data->m_dnstream.m_write.m_vio;
int64_t const output_done = TSVIONDoneGet(output_vio);
@@ -686,10 +689,10 @@ handle_server_resp(TSCont contp, TSEvent event, Data
*const data)
int64_t const threshout = data->m_config->m_blockbytes;
int64_t const buffered = output_sent - output_done;
- // for PURGE requests, clients won't request more data (no body
content)
- if (threshout < buffered && !data->m_config->onlyHeader()) {
- start_next_block = false;
+ if (threshout < buffered) {
DEBUG_LOG("%p handle_server_resp: throttling %" PRId64, data,
buffered);
+ } else {
+ start_next_block = true;
}
}
if (start_next_block) {
diff --git a/plugins/experimental/slice/slice.cc
b/plugins/experimental/slice/slice.cc
index 09d2847383..1989116330 100644
--- a/plugins/experimental/slice/slice.cc
+++ b/plugins/experimental/slice/slice.cc
@@ -50,9 +50,6 @@ read_request(TSHttpTxn txnp, Config *const config)
return false;
}
- // set header method config to only expect header response
- config->m_method_type = header.method();
-
if (config->hasRegex()) {
int urllen = 0;
char *const urlstr = TSHttpTxnEffectiveUrlStringGet(txnp, &urllen);
@@ -84,7 +81,8 @@ read_request(TSHttpTxn txnp, Config *const config)
TSAssert(nullptr != config);
Data *const data = new Data(config);
- data->m_txnp = txnp;
+ data->m_method_type = header.method();
+ data->m_txnp = txnp;
// set up feedback connect
if (AF_INET == ip->sa_family) {
diff --git a/plugins/experimental/slice/util.cc
b/plugins/experimental/slice/util.cc
index 71d99b9869..c4d9a314e8 100644
--- a/plugins/experimental/slice/util.cc
+++ b/plugins/experimental/slice/util.cc
@@ -80,7 +80,7 @@ request_block(TSCont contp, Data *const data)
HttpHeader header(data->m_req_hdrmgr.m_buffer, data->m_req_hdrmgr.m_lochdr);
// if configured, remove range header from head requests
- if (data->m_config->m_method_type == TS_HTTP_METHOD_HEAD &&
data->m_config->m_head_strip_range) {
+ if (data->m_method_type == TS_HTTP_METHOD_HEAD &&
data->m_config->m_head_strip_range) {
header.removeKey(TS_MIME_FIELD_RANGE, TS_MIME_LEN_RANGE);
} else {
// add/set sub range key and add slicer tag