Repository: trafficserver Updated Branches: refs/heads/master 2a5893a10 -> 55d57be2b
[TS-3872] Enhance open_write_fail_action feature to support returning error on revalidation. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/55d57be2 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/55d57be2 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/55d57be2 Branch: refs/heads/master Commit: 55d57be2b348e49d490859fe60a2a8cb1bf83351 Parents: 2a5893a Author: Sudheer Vinukonda <[email protected]> Authored: Thu Aug 27 23:43:00 2015 +0000 Committer: Sudheer Vinukonda <[email protected]> Committed: Thu Aug 27 23:43:38 2015 +0000 ---------------------------------------------------------------------- mgmt/RecordsConfig.cc | 2 ++ proxy/http/HttpSM.cc | 9 ++++++--- proxy/http/HttpTransact.cc | 23 ++++++++++++++--------- proxy/http/HttpTransact.h | 10 ++++++---- 4 files changed, 28 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/55d57be2/mgmt/RecordsConfig.cc ---------------------------------------------------------------------- diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc index 2db3c66..d5f6c25 100644 --- a/mgmt/RecordsConfig.cc +++ b/mgmt/RecordsConfig.cc @@ -653,6 +653,8 @@ static const RecordElement RecordsConfig[] = // # 0 - default. disable cache and goto origin // # 1 - return error if cache miss // # 2 - serve stale until proxy.config.http.cache.max_stale_age, then goto origin, if refresh_miss + // # 3 - return error if cache miss or serve stale until proxy.config.http.cache.max_stale_age, then goto origin, if refresh_miss + // # 4 - return error if cache miss or error on stale until proxy.config.http.cache.max_stale_age, then goto origin, if refresh_miss {RECT_CONFIG, "proxy.config.http.cache.open_write_fail_action", RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_NULL, NULL, RECA_NULL} , // # when_to_revalidate has 4 options: http://git-wip-us.apache.org/repos/asf/trafficserver/blob/55d57be2/proxy/http/HttpSM.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc index 2fab41c..4fce169 100644 --- a/proxy/http/HttpSM.cc +++ b/proxy/http/HttpSM.cc @@ -2374,17 +2374,20 @@ HttpSM::state_cache_open_write(int event, void *data) // for reading if (t_state.redirect_info.redirect_in_process) { DebugSM("http_redirect", "[%" PRId64 "] CACHE_EVENT_OPEN_WRITE_FAILED during redirect follow", sm_id); - t_state.cache_open_write_fail_action = HttpTransact::CACHE_OPEN_WRITE_FAIL_DEFAULT; + t_state.cache_open_write_fail_action = HttpTransact::CACHE_WL_FAIL_ACTION_DEFAULT; t_state.cache_info.write_lock_state = HttpTransact::CACHE_WL_FAIL; break; } - if (t_state.txn_conf->cache_open_write_fail_action == HttpTransact::CACHE_OPEN_WRITE_FAIL_DEFAULT) { + if (t_state.txn_conf->cache_open_write_fail_action == HttpTransact::CACHE_WL_FAIL_ACTION_DEFAULT) { t_state.cache_info.write_lock_state = HttpTransact::CACHE_WL_FAIL; break; } else { t_state.cache_open_write_fail_action = t_state.txn_conf->cache_open_write_fail_action; - if (!t_state.cache_info.object_read) { + if (!t_state.cache_info.object_read || + (t_state.cache_open_write_fail_action == HttpTransact::CACHE_WL_FAIL_ACTION_ERROR_ON_MISS_OR_REVALIDATE)) { // cache miss, set wl_state to fail + DebugSM("http", "[%" PRId64 "] cache object read %p, cache_wl_fail_action %d", sm_id, t_state.cache_info.object_read, + t_state.cache_open_write_fail_action); t_state.cache_info.write_lock_state = HttpTransact::CACHE_WL_FAIL; break; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/55d57be2/proxy/http/HttpTransact.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransact.cc b/proxy/http/HttpTransact.cc index 5e62a9d..ed20174 100644 --- a/proxy/http/HttpTransact.cc +++ b/proxy/http/HttpTransact.cc @@ -2951,29 +2951,34 @@ HttpTransact::handle_cache_write_lock(State *s) // No write lock, ignore the cache and proxy only; // FIX: Should just serve from cache if this is a revalidate s->cache_info.action = CACHE_DO_NO_ACTION; - if (s->cache_open_write_fail_action & CACHE_OPEN_WRITE_FAIL_ERROR_ON_MISS) { - DebugTxn("http_error", "cache_open_write_fail_action, cache miss, return error"); + switch (s->cache_open_write_fail_action) { + case CACHE_WL_FAIL_ACTION_ERROR_ON_MISS: + case CACHE_WL_FAIL_ACTION_ERROR_ON_MISS_STALE_ON_REVALIDATE: + case CACHE_WL_FAIL_ACTION_ERROR_ON_MISS_OR_REVALIDATE: + DebugTxn("http_error", "cache_open_write_fail_action %d, cache miss, return error", s->cache_open_write_fail_action); s->cache_info.write_status = CACHE_WRITE_ERROR; build_error_response(s, HTTP_STATUS_BAD_GATEWAY, "Connection Failed", "connect#failed_connect", NULL); MIMEField *ats_field; - HTTPHdr *header = &(s->hdr_info.client_response); - + HTTPHdr *header; + header = &(s->hdr_info.client_response); if ((ats_field = header->field_find(MIME_FIELD_ATS_INTERNAL, MIME_LEN_ATS_INTERNAL)) == NULL) { if (likely((ats_field = header->field_create(MIME_FIELD_ATS_INTERNAL, MIME_LEN_ATS_INTERNAL)) != NULL)) header->field_attach(ats_field); } if (likely(ats_field)) { - Debug("http_error", "Adding Ats-Internal-Messages: %d", CACHE_WL_FAIL); - header->field_value_set_int(ats_field, CACHE_WL_FAIL); + int value = (s->cache_info.object_read) ? 1 : 0; + Debug("http_error", "Adding Ats-Internal-Messages: %d", value); + header->field_value_set_int(ats_field, value); } else { - Debug("http_error", "failed to add Ats-Internal-Messages: %d", CACHE_WL_FAIL); + Debug("http_error", "failed to add Ats-Internal-Messages"); } TRANSACT_RETURN(SM_ACTION_SEND_ERROR_CACHE_NOOP, NULL); return; - } else { + default: s->cache_info.write_status = CACHE_WRITE_LOCK_MISS; remove_ims = true; + break; } break; case CACHE_WL_READ_RETRY: @@ -7301,7 +7306,7 @@ HttpTransact::what_is_document_freshness(State *s, HTTPHdr *client_request, HTTP uint32_t cc_mask, cooked_cc_mask; uint32_t os_specifies_revalidate; - if (s->cache_open_write_fail_action & CACHE_OPEN_WRITE_FAIL_STALE_OR_REVALIDATE) { + if (s->cache_open_write_fail_action & CACHE_WL_FAIL_ACTION_STALE_ON_REVALIDATE) { if (is_stale_cache_response_returnable(s)) { DebugTxn("http_match", "[what_is_document_freshness] cache_serve_stale_on_write_lock_fail, return FRESH"); return (FRESHNESS_FRESH); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/55d57be2/proxy/http/HttpTransact.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransact.h b/proxy/http/HttpTransact.h index e2deecc..c5a9100 100644 --- a/proxy/http/HttpTransact.h +++ b/proxy/http/HttpTransact.h @@ -301,10 +301,12 @@ public: }; enum CacheOpenWriteFailAction_t { - CACHE_OPEN_WRITE_FAIL_DEFAULT = 0, - CACHE_OPEN_WRITE_FAIL_ERROR_ON_MISS = 1, - CACHE_OPEN_WRITE_FAIL_STALE_OR_REVALIDATE = 2, - TOTAL_OPEN_WRITE_FAIL_ACTION_TYPES + CACHE_WL_FAIL_ACTION_DEFAULT = 0x00, + CACHE_WL_FAIL_ACTION_ERROR_ON_MISS = 0x01, + CACHE_WL_FAIL_ACTION_STALE_ON_REVALIDATE = 0x02, + CACHE_WL_FAIL_ACTION_ERROR_ON_MISS_STALE_ON_REVALIDATE = 0x03, + CACHE_WL_FAIL_ACTION_ERROR_ON_MISS_OR_REVALIDATE = 0x04, + TOTAL_CACHE_WL_FAIL_ACTION_TYPES }; enum CacheWriteLock_t {
