Repository: trafficserver Updated Branches: refs/heads/master fe4ee3664 -> 1614f4f28
[TS-3927] Fix Cache Open Write Retries and make the setting overridable. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/1614f4f2 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/1614f4f2 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/1614f4f2 Branch: refs/heads/master Commit: 1614f4f284a9ff63f19808d5eb34e8cd17cf2ad9 Parents: fe4ee36 Author: Sudheer Vinukonda <[email protected]> Authored: Mon Sep 21 23:24:39 2015 +0000 Committer: Sudheer Vinukonda <[email protected]> Committed: Mon Sep 21 23:24:39 2015 +0000 ---------------------------------------------------------------------- lib/ts/apidefs.h.in | 1 + .../experimental/ts_lua/ts_lua_http_config.c | 7 +++- proxy/InkAPI.cc | 6 ++++ proxy/InkAPITest.cc | 3 +- proxy/http/HttpCacheSM.cc | 34 +++++++++++++++++--- proxy/http/HttpConfig.cc | 4 +-- proxy/http/HttpConfig.h | 22 ++++++------- 7 files changed, 57 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1614f4f2/lib/ts/apidefs.h.in ---------------------------------------------------------------------- diff --git a/lib/ts/apidefs.h.in b/lib/ts/apidefs.h.in index 332d53f..6dba244 100644 --- a/lib/ts/apidefs.h.in +++ b/lib/ts/apidefs.h.in @@ -691,6 +691,7 @@ typedef enum { TS_CONFIG_HTTP_CACHE_OPEN_WRITE_FAIL_ACTION, TS_CONFIG_HTTP_ENABLE_REDIRECTION, TS_CONFIG_HTTP_NUMBER_OF_REDIRECTIONS, + TS_CONFIG_HTTP_CACHE_MAX_OPEN_WRITE_RETRIES, TS_CONFIG_LAST_ENTRY } TSOverridableConfigKey; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1614f4f2/plugins/experimental/ts_lua/ts_lua_http_config.c ---------------------------------------------------------------------- diff --git a/plugins/experimental/ts_lua/ts_lua_http_config.c b/plugins/experimental/ts_lua/ts_lua_http_config.c index 0f07c26..b87baba 100644 --- a/plugins/experimental/ts_lua/ts_lua_http_config.c +++ b/plugins/experimental/ts_lua/ts_lua_http_config.c @@ -86,6 +86,9 @@ typedef enum { TS_LUA_CONFIG_OPEN_WRITE_FAIL_ACTION = TS_CONFIG_HTTP_CACHE_OPEN_WRITE_FAIL_ACTION, TS_LUA_CONFIG_HTTP_ENABLE_REDIRECTION = TS_CONFIG_HTTP_ENABLE_REDIRECTION, TS_LUA_CONFIG_HTTP_NUMBER_OF_REDIRECTIONS = TS_CONFIG_HTTP_NUMBER_OF_REDIRECTIONS, + TS_LUA_CONFIG_HTTP_CACHE_OPEN_READ_RETRY_TIME = TS_CONFIG_HTTP_CACHE_OPEN_READ_RETRY_TIME, + TS_LUA_CONFIG_HTTP_CACHE_MAX_OPEN_READ_RETRIES = TS_CONFIG_HTTP_CACHE_MAX_OPEN_READ_RETRIES, + TS_LUA_CONFIG_HTTP_CACHE_MAX_OPEN_WRITE_RETRIES = TS_CONFIG_HTTP_CACHE_MAX_OPEN_WRITE_RETRIES, TS_LUA_CONFIG_LAST_ENTRY = TS_CONFIG_LAST_ENTRY, } TSLuaOverridableConfigKey; @@ -148,7 +151,9 @@ ts_lua_var_item ts_lua_http_config_vars[] = { TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_NET_SOCK_PACKET_TOS_OUT), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_SLOW_LOG_THRESHOLD), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_BODY_FACTORY_TEMPLATE_BASE), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_OPEN_WRITE_FAIL_ACTION), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_ENABLE_REDIRECTION), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_NUMBER_OF_REDIRECTIONS), - TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_LAST_ENTRY), + TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_CACHE_OPEN_READ_RETRY_TIME), + TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_CACHE_MAX_OPEN_READ_RETRIES), + TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_CACHE_MAX_OPEN_WRITE_RETRIES), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_LAST_ENTRY), }; ts_lua_var_item ts_lua_http_timeout_vars[] = { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1614f4f2/proxy/InkAPI.cc ---------------------------------------------------------------------- diff --git a/proxy/InkAPI.cc b/proxy/InkAPI.cc index a9d70a6..2c6a946 100644 --- a/proxy/InkAPI.cc +++ b/proxy/InkAPI.cc @@ -7938,6 +7938,10 @@ _conf_to_memberp(TSOverridableConfigKey conf, OverridableHttpConfigParams *overr typ = OVERRIDABLE_TYPE_INT; ret = &overridableHttpConfig->max_cache_open_read_retries; break; + case TS_CONFIG_HTTP_CACHE_MAX_OPEN_WRITE_RETRIES: + typ = OVERRIDABLE_TYPE_INT; + ret = &overridableHttpConfig->max_cache_open_write_retries; + break; case TS_CONFIG_HTTP_CACHE_OPEN_WRITE_FAIL_ACTION: typ = OVERRIDABLE_TYPE_INT; ret = &overridableHttpConfig->cache_open_write_fail_action; @@ -8486,6 +8490,8 @@ TSHttpTxnConfigFind(const char *name, int length, TSOverridableConfigKey *conf, case 's': if (!strncmp(name, "proxy.config.http.connect_attempts_max_retries", length)) cnf = TS_CONFIG_HTTP_CONNECT_ATTEMPTS_MAX_RETRIES; + else if (!strncmp(name, "proxy.config.http.cache.max_open_write_retries", length)) + cnf = TS_CONFIG_HTTP_CACHE_MAX_OPEN_WRITE_RETRIES; break; case 't': if (!strncmp(name, "proxy.config.http.forward.proxy_auth_to_parent", length)) http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1614f4f2/proxy/InkAPITest.cc ---------------------------------------------------------------------- diff --git a/proxy/InkAPITest.cc b/proxy/InkAPITest.cc index ffba7d9..fae5f9e 100644 --- a/proxy/InkAPITest.cc +++ b/proxy/InkAPITest.cc @@ -7239,7 +7239,8 @@ const char *SDK_Overridable_Configs[TS_CONFIG_LAST_ENTRY] = { "proxy.config.http.post.check.content_length.enabled", "proxy.config.http.global_user_agent_header", "proxy.config.http.auth_server_session_private", "proxy.config.http.slow.log.threshold", "proxy.config.http.cache.generation", "proxy.config.body_factory.template_base", "proxy.config.http.cache.open_write_fail_action", - "proxy.config.http.redirection_enabled", "proxy.config.http.number_of_redirections"}; + "proxy.config.http.redirection_enabled", "proxy.config.http.number_of_redirections", + "proxy.config.http.cache.max_open_write_retries"}; REGRESSION_TEST(SDK_API_OVERRIDABLE_CONFIGS)(RegressionTest *test, int /* atype ATS_UNUSED */, int *pstatus) { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1614f4f2/proxy/http/HttpCacheSM.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpCacheSM.cc b/proxy/http/HttpCacheSM.cc index c259b38..64e2650 100644 --- a/proxy/http/HttpCacheSM.cc +++ b/proxy/http/HttpCacheSM.cc @@ -172,10 +172,33 @@ HttpCacheSM::state_cache_open_write(int event, void *data) break; case CACHE_EVENT_OPEN_WRITE_FAILED: - // The cache is hosed or full or something. - // Forward the failure to the main sm - open_write_cb = true; - master_sm->handleEvent(event, data); + if (open_write_tries <= master_sm->t_state.txn_conf->max_cache_open_write_retries) { + // Retry open write; + open_write_cb = false; + do_schedule_in(); + } else { + // The cache is hosed or full or something. + // Forward the failure to the main sm + Debug("http_cache", "[%" PRId64 "] [state_cache_open_write] cache open write failure %d. " + "done retrying...", + master_sm->sm_id, open_write_tries); + open_write_cb = true; + master_sm->handleEvent(event, data); + } + break; + + case EVENT_INTERVAL: + // Retry the cache open write if the number retries is less + // than or equal to the max number of open write retries + ink_assert(open_write_tries <= master_sm->t_state.txn_conf->max_cache_open_write_retries); + Debug("http_cache", "[%" PRId64 "] [state_cache_open_write] cache open write failure %d. " + "retrying cache open write...", + master_sm->sm_id, open_write_tries); + + open_write( + &cache_key, lookup_url, read_request_hdr, master_sm->t_state.cache_info.object_read, + (time_t)((master_sm->t_state.cache_control.pin_in_cache_for < 0) ? 0 : master_sm->t_state.cache_control.pin_in_cache_for), + retry_write, false); break; default: @@ -286,6 +309,7 @@ HttpCacheSM::open_write(const HttpCacheKey *key, URL *url, HTTPHdr *request, Cac ink_assert(request == read_request_hdr || read_request_hdr == NULL); this->lookup_url = url; this->read_request_hdr = request; + cache_key = *key; // Make sure we are not stuck in a loop where the write // fails but the retry read succeeds causing to issue @@ -293,7 +317,7 @@ HttpCacheSM::open_write(const HttpCacheKey *key, URL *url, HTTPHdr *request, Cac // that must be revalidated every time) // Changed by YTS Team, yamsat Plugin if (open_write_tries > master_sm->redirection_tries && - open_write_tries > master_sm->t_state.http_config_param->max_cache_open_write_retries) { + open_write_tries > master_sm->t_state.txn_conf->max_cache_open_write_retries) { master_sm->handleEvent(CACHE_EVENT_OPEN_WRITE_FAILED, (void *)-ECACHE_DOC_BUSY); return ACTION_RESULT_DONE; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1614f4f2/proxy/http/HttpConfig.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpConfig.cc b/proxy/http/HttpConfig.cc index 96fe448..6cc56c9 100644 --- a/proxy/http/HttpConfig.cc +++ b/proxy/http/HttpConfig.cc @@ -1023,7 +1023,7 @@ HttpConfig::startup() HttpEstablishStaticConfigLongLong(c.oride.cache_generation_number, "proxy.config.http.cache.generation"); // open write failure retries - HttpEstablishStaticConfigLongLong(c.max_cache_open_write_retries, "proxy.config.http.cache.max_open_write_retries"); + HttpEstablishStaticConfigLongLong(c.oride.max_cache_open_write_retries, "proxy.config.http.cache.max_open_write_retries"); HttpEstablishStaticConfigByte(c.oride.cache_http, "proxy.config.http.cache.http"); HttpEstablishStaticConfigByte(c.oride.cache_cluster_cache_local, "proxy.config.http.cache.cluster_cache_local"); @@ -1286,7 +1286,7 @@ HttpConfig::reconfigure() params->oride.cache_generation_number = m_master.oride.cache_generation_number; // open write failure retries - params->max_cache_open_write_retries = m_master.max_cache_open_write_retries; + params->oride.max_cache_open_write_retries = m_master.oride.max_cache_open_write_retries; params->oride.cache_http = INT_TO_BOOL(m_master.oride.cache_http); params->oride.cache_cluster_cache_local = INT_TO_BOOL(m_master.oride.cache_cluster_cache_local); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1614f4f2/proxy/http/HttpConfig.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpConfig.h b/proxy/http/HttpConfig.h index 62cc4a4..f6fdda6 100644 --- a/proxy/http/HttpConfig.h +++ b/proxy/http/HttpConfig.h @@ -382,8 +382,8 @@ struct OverridableHttpConfigParams { connect_attempts_max_retries_dead_server(3), connect_attempts_rr_retries(3), connect_attempts_timeout(30), post_connect_attempts_timeout(1800), down_server_timeout(300), client_abort_threshold(10), freshness_fuzz_time(240), freshness_fuzz_min_time(0), max_cache_open_read_retries(-1), cache_open_read_retry_time(10), cache_generation_number(-1), - background_fill_active_timeout(60), http_chunking_size(4096), flow_high_water_mark(0), flow_low_water_mark(0), - default_buffer_size_index(8), default_buffer_water_mark(32768), slow_log_threshold(0), + max_cache_open_write_retries(1), background_fill_active_timeout(60), http_chunking_size(4096), flow_high_water_mark(0), + flow_low_water_mark(0), default_buffer_size_index(8), default_buffer_water_mark(32768), slow_log_threshold(0), // Strings / floats must come last body_factory_template_base(NULL), body_factory_template_base_len(0), proxy_response_server_string(NULL), @@ -549,6 +549,9 @@ struct OverridableHttpConfigParams { MgmtInt cache_open_read_retry_time; // time is in mseconds MgmtInt cache_generation_number; + // open write failure retries. + MgmtInt max_cache_open_write_retries; + MgmtInt background_fill_active_timeout; MgmtInt http_chunking_size; // Maximum chunk size for chunked output. @@ -684,9 +687,6 @@ public: char *cache_vary_default_images; char *cache_vary_default_other; - // open write failure retries. - MgmtInt max_cache_open_write_retries; - /////////////////// // cache control // /////////////////// @@ -853,12 +853,12 @@ inline HttpConfigParams::HttpConfigParams() session_auth_cache_keep_alive_enabled(1), transaction_active_timeout_in(900), accept_no_activity_timeout(120), parent_connect_attempts(4), per_parent_connect_attempts(2), parent_connect_timeout(30), anonymize_other_header_list(NULL), enable_http_stats(1), icp_enabled(0), stale_icp_enabled(0), cache_vary_default_text(NULL), cache_vary_default_images(NULL), - cache_vary_default_other(NULL), max_cache_open_write_retries(1), cache_enable_default_vary_headers(0), cache_post_method(0), - connect_ports_string(NULL), connect_ports(NULL), push_method_enabled(0), referer_filter_enabled(0), referer_format_redirect(0), - reverse_proxy_enabled(0), url_remap_required(1), record_cop_page(0), errors_log_error_pages(1), enable_http_info(0), - cluster_time_delta(0), redirection_host_no_port(1), post_copy_size(2048), ignore_accept_mismatch(0), - ignore_accept_language_mismatch(0), ignore_accept_encoding_mismatch(0), ignore_accept_charset_mismatch(0), - send_100_continue_response(0), disallow_post_100_continue(0), parser_allow_non_http(1), max_post_size(0), + cache_vary_default_other(NULL), cache_enable_default_vary_headers(0), cache_post_method(0), connect_ports_string(NULL), + connect_ports(NULL), push_method_enabled(0), referer_filter_enabled(0), referer_format_redirect(0), reverse_proxy_enabled(0), + url_remap_required(1), record_cop_page(0), errors_log_error_pages(1), enable_http_info(0), cluster_time_delta(0), + redirection_host_no_port(1), post_copy_size(2048), ignore_accept_mismatch(0), ignore_accept_language_mismatch(0), + ignore_accept_encoding_mismatch(0), ignore_accept_charset_mismatch(0), send_100_continue_response(0), + disallow_post_100_continue(0), parser_allow_non_http(1), max_post_size(0), server_session_sharing_pool(TS_SERVER_SESSION_SHARING_POOL_THREAD), synthetic_port(0) { }
