This is an automated email from the ASF dual-hosted git repository. bneradt pushed a commit to branch 11-Dev in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit fe7f13763ae19c6feb69749b86a6e891cc879edd Merge: 5bab268cb4 f6dd1c7701 Author: bneradt <[email protected]> AuthorDate: Mon Mar 16 10:55:51 2026 -0500 Merge master into 11-Dev Conflicts: include/ts/ts.h include/tscore/ArgParser.h src/iocore/cache/P_CacheHosting.h src/proxy/ReverseProxy.cc src/tscore/ArgParser.cc CMakeLists.txt | 19 +- ci/rat-regex.txt | 1 + cmake/ExperimentalPlugins.cmake | 10 +- cmake/Findcap.cmake | 22 +- configs/volume.config.default | 33 +- doc/admin-guide/configuration/hrw4u.en.rst | 357 ++++++++++- doc/admin-guide/files/records.yaml.en.rst | 62 +- doc/admin-guide/files/remap.config.en.rst | 48 ++ doc/admin-guide/files/volume.config.en.rst | 86 ++- doc/admin-guide/logging/formatting.en.rst | 127 ++-- doc/admin-guide/plugins/compress.en.rst | 27 +- doc/admin-guide/plugins/index.en.rst | 4 + doc/admin-guide/plugins/ja4_fingerprint.en.rst | 209 +++++++ doc/admin-guide/plugins/lua.en.rst | 2 + .../api/functions/TSHttpTxnMilestoneGet.en.rst | 12 +- .../api/functions/TSLifecycleHookAdd.en.rst | 6 + .../api/functions/TSLogFieldRegister.en.rst | 99 +++ .../api/functions/TSVConnClientHelloGet.en.rst | 50 ++ doc/developer-guide/api/types/TSClientHello.en.rst | 83 +++ doc/developer-guide/api/types/TSEvent.en.rst | 4 + doc/developer-guide/cripts/cripts-misc.en.rst | 62 ++ doc/release-notes/upgrading.en.rst | 1 + example/cripts/cache_groups.cc | 106 ++++ example/plugins/c-api/CMakeLists.txt | 1 + .../c-api/custom_logfield/custom_logfield.cc | 230 +++++++ include/cripts/CacheGroup.hpp | 217 +++++++ include/iocore/cache/Cache.h | 5 +- include/iocore/net/ProxyProtocol.h | 2 + include/iocore/net/TLSSNISupport.h | 45 +- include/proxy/Milestones.h | 2 +- include/proxy/ReverseProxy.h | 7 +- include/proxy/http/HttpConfig.h | 1 + include/proxy/http/HttpTransact.h | 24 +- include/proxy/http/remap/RemapConfig.h | 1 + include/proxy/http/remap/UrlMapping.h | 37 +- include/proxy/http/remap/UrlMappingPathIndex.h | 13 + include/proxy/logging/Log.h | 1 + include/proxy/logging/LogAccess.h | 24 +- include/proxy/logging/LogField.h | 8 + include/records/RecCore.h | 33 +- include/ts/apidefs.h.in | 89 ++- include/ts/ts.h | 95 +++ include/tscore/ArgParser.h | 2 +- include/tscore/ink_config.h.cmake.in | 1 + plugins/compress/sample.compress.config | 3 +- plugins/experimental/ja4_fingerprint/README.md | 2 + plugins/experimental/ja4_fingerprint/plugin.cc | 75 ++- plugins/header_rewrite/condition.h | 6 + plugins/header_rewrite/header_rewrite.cc | 5 +- plugins/lua/ts_lua_http_milestone.cc | 54 +- src/api/InkAPI.cc | 243 ++++++++ src/api/InkAPITest.cc | 32 +- src/cripts/CMakeLists.txt | 10 +- src/cripts/CacheGroup.cc | 453 ++++++++++++++ src/cripts/unit_tests/stub.cc | 78 +++ src/cripts/unit_tests/test_CacheGroup.cc | 224 +++++++ src/iocore/cache/Cache.cc | 106 ++-- src/iocore/cache/CacheHosting.cc | 120 +++- src/iocore/cache/CacheProcessor.cc | 121 +++- src/iocore/cache/CacheVC.cc | 12 +- src/iocore/cache/P_CacheHosting.h | 43 +- src/iocore/cache/P_CacheInternal.h | 11 +- src/iocore/cache/Stripe.h | 2 + src/iocore/hostdb/HostDB.cc | 4 +- src/iocore/net/OCSPStapling.cc | 17 +- src/iocore/net/ProxyProtocol.cc | 6 + src/iocore/net/SSLNetVConnection.cc | 12 + src/iocore/net/SSLUtils.cc | 2 + src/iocore/net/TLSSNISupport.cc | 102 ++++ src/iocore/net/unit_tests/test_ProxyProtocol.cc | 6 +- src/proxy/ReverseProxy.cc | 76 ++- src/proxy/http/HttpCacheSM.cc | 38 +- src/proxy/http/HttpConfig.cc | 4 +- src/proxy/http/HttpSM.cc | 107 +++- src/proxy/http/HttpTransact.cc | 238 +++++++- src/proxy/http/remap/RemapConfig.cc | 76 ++- src/proxy/http/remap/RemapProcessor.cc | 3 + src/proxy/http/remap/UrlMapping.cc | 33 + src/proxy/logging/Log.cc | 28 +- src/proxy/logging/LogAccess.cc | 104 ++++ src/proxy/logging/LogField.cc | 117 +++- src/records/RecConfigParse.cc | 54 +- src/records/RecYAMLDecoder.cc | 9 +- src/records/RecordsConfig.cc | 6 +- src/records/RecordsConfigUtils.cc | 17 +- src/traffic_ctl/traffic_ctl.cc | 14 +- src/traffic_layout/traffic_layout.cc | 11 +- src/traffic_server/traffic_server.cc | 14 + src/tscore/ArgParser.cc | 2 +- tests/gold_tests/autest-site/ats_replay.test.ext | 37 ++ .../cache/cache-read-retry-stale.test.py | 33 +- .../cache/cache-write-lock-contention.test.py | 175 ++++++ .../cache/cache_volume_defaults.replay.yaml | 144 +++++ .../gold_tests/cache/cache_volume_defaults.test.py | 31 +- .../cache/cache_volume_features.replay.yaml | 141 +++++ .../gold_tests/cache/cache_volume_features.test.py | 32 +- .../replay/cache-read-retry-stale.replay.yaml | 187 ++++++ .../connect_down_policy_3.test.py | 113 ++++ .../replay/inactive_timeout.replay.yaml} | 31 +- .../gold_tests/dns/connect_attempts.test.py | 34 +- tests/gold_tests/dns/dns_host_down.test.py | 14 +- .../connect_attempts_rr_max_retries_error_log.gold | 8 + .../dns/gold/connect_attempts_rr_no_error_log.gold | 6 + .../connect_attempts_rr_retries_error_log.gold | 8 + .../connect_attempts_rr_max_retries.replay.yaml | 129 ++++ .../connect_attempts_rr_no_retry.replay.yaml | 129 ++++ .../replay/connect_attempts_rr_retries.replay.yaml | 165 +++++ .../gold_tests/dns/replay/server_down.replay.yaml | 5 +- tests/gold_tests/logging/log-mstsms.test.py | 121 ++++ .../compress/compress-cache-untransformed.test.py | 118 ++++ .../compress/compress_100_continue_origin.py | 126 ++++ .../compress/etc/compress-cache-false.config | 5 + .../header_rewrite_bundle.replay.yaml | 669 +++++++++++++++++++++ .../header_rewrite/rules/complex_logics.conf | 158 +++++ .../records/records_runroot_precedence.test.py | 163 +++++ tools/hrw4u/.gitignore | 1 + tools/hrw4u/Makefile | 10 +- tools/hrw4u/grammar/hrw4u.g4 | 41 +- tools/hrw4u/pyproject.toml | 5 +- tools/hrw4u/schema/sandbox.schema.json | 136 +++++ tools/hrw4u/scripts/hrw4u | 34 +- tools/hrw4u/scripts/hrw4u-lsp | 264 ++++++-- tools/hrw4u/scripts/testcase.py | 18 +- tools/hrw4u/src/common.py | 93 ++- tools/hrw4u/src/errors.py | 179 ++++-- tools/hrw4u/src/hrw_symbols.py | 5 +- tools/hrw4u/src/hrw_visitor.py | 19 +- tools/hrw4u/src/lsp/hover.py | 214 +++---- tools/hrw4u/src/lsp/strings.py | 70 +-- tools/hrw4u/{scripts/hrw4u => src/procedures.py} | 28 +- tools/hrw4u/src/sandbox.py | 180 ++++++ tools/hrw4u/src/symbols.py | 16 +- tools/hrw4u/src/symbols_base.py | 18 +- tools/hrw4u/src/visitor.py | 652 ++++++++++++++++++-- tools/hrw4u/src/visitor_base.py | 252 ++------ .../tests/data/conds/double-negation.output.txt | 4 +- tools/hrw4u/tests/data/conds/exceptions.txt | 2 +- tools/hrw4u/tests/data/conds/group-and-not.ast.txt | 1 + .../hrw4u/tests/data/conds/group-and-not.input.txt | 5 + .../tests/data/conds/group-and-not.output.txt | 6 + tools/hrw4u/tests/data/conds/group-in-if.ast.txt | 1 + tools/hrw4u/tests/data/conds/group-in-if.input.txt | 11 + .../hrw4u/tests/data/conds/group-in-if.output.txt | 15 + tools/hrw4u/tests/data/conds/group-nested.ast.txt | 1 + .../hrw4u/tests/data/conds/group-nested.input.txt | 5 + .../hrw4u/tests/data/conds/group-nested.output.txt | 7 + tools/hrw4u/tests/data/conds/group-or.ast.txt | 1 + tools/hrw4u/tests/data/conds/group-or.input.txt | 5 + tools/hrw4u/tests/data/conds/group-or.output.txt | 6 + tools/hrw4u/tests/data/conds/group-two.ast.txt | 1 + tools/hrw4u/tests/data/conds/group-two.input.txt | 5 + tools/hrw4u/tests/data/conds/group-two.output.txt | 10 + .../tests/data/examples/all-nonsense.output.txt | 22 +- .../hrw4u/tests/data/procedures/basic-call.ast.txt | 1 + .../tests/data/procedures/basic-call.input.txt | 5 + .../tests/data/procedures/basic-call.output.txt | 2 + .../data/procedures/circular-use.fail.error.txt | 1 + .../data/procedures/circular-use.fail.input.txt | 5 + .../tests/data/procedures/default-param.ast.txt | 1 + .../tests/data/procedures/default-param.input.txt | 5 + .../tests/data/procedures/default-param.output.txt | 2 + .../data/procedures/duplicate-proc.fail.error.txt | 1 + .../data/procedures/duplicate-proc.fail.input.txt | 11 + .../tests/data/procedures/elif-in-proc.ast.txt | 1 + .../tests/data/procedures/elif-in-proc.flatten.txt | 20 + .../tests/data/procedures/elif-in-proc.input.txt | 8 + .../tests/data/procedures/elif-in-proc.output.txt | 24 + .../tests/data/procedures/in-conditional.ast.txt | 1 + .../data/procedures/in-conditional.flatten.txt | 5 + .../tests/data/procedures/in-conditional.input.txt | 7 + .../data/procedures/in-conditional.output.txt | 3 + .../tests/data/procedures/local-and-use.ast.txt | 1 + .../tests/data/procedures/local-and-use.input.txt | 10 + .../tests/data/procedures/local-and-use.output.txt | 3 + .../tests/data/procedures/local-mixed-body.ast.txt | 1 + .../data/procedures/local-mixed-body.flatten.txt | 6 + .../data/procedures/local-mixed-body.input.txt | 11 + .../data/procedures/local-mixed-body.output.txt | 6 + .../data/procedures/local-multi-section.ast.txt | 1 + .../data/procedures/local-multi-section.input.txt | 11 + .../data/procedures/local-multi-section.output.txt | 5 + .../hrw4u/tests/data/procedures/local-proc.ast.txt | 1 + .../tests/data/procedures/local-proc.input.txt | 7 + .../tests/data/procedures/local-proc.output.txt | 2 + .../data/procedures/local-with-params.ast.txt | 1 + .../data/procedures/local-with-params.input.txt | 7 + .../data/procedures/local-with-params.output.txt | 2 + .../hrw4u/tests/data/procedures/mixed-body.ast.txt | 1 + .../tests/data/procedures/mixed-body.flatten.txt | 6 + .../tests/data/procedures/mixed-body.input.txt | 5 + .../tests/data/procedures/mixed-body.output.txt | 6 + .../hrw4u/tests/data/procedures/multi-proc.ast.txt | 1 + .../tests/data/procedures/multi-proc.input.txt | 6 + .../tests/data/procedures/multi-proc.output.txt | 3 + .../data/procedures/multi-section-mixed.ast.txt | 1 + .../procedures/multi-section-mixed.flatten.txt | 13 + .../data/procedures/multi-section-mixed.input.txt | 15 + .../data/procedures/multi-section-mixed.output.txt | 13 + .../hrw4u/tests/data/procedures/multi-use.ast.txt | 1 + .../tests/data/procedures/multi-use.input.txt | 7 + .../tests/data/procedures/multi-use.output.txt | 3 + .../tests/data/procedures/override-param.ast.txt | 1 + .../tests/data/procedures/override-param.input.txt | 5 + .../data/procedures/override-param.output.txt | 2 + .../procedures/proc-after-section.fail.error.txt | 1 + .../procedures/proc-after-section.fail.input.txt | 7 + .../tests/data/procedures/procs/base/Stamp.hrw4u | 3 + .../tests/data/procedures/procs/caller/Wrap.hrw4u | 6 + .../tests/data/procedures/procs/circular/A.hrw4u | 5 + .../tests/data/procedures/procs/circular/B.hrw4u | 5 + .../data/procedures/procs/reexport/debug.hrw4u | 1 + .../data/procedures/procs/test/TagAndOrigin.hrw4u | 7 + .../procedures/procs/test/add-debug-header.hrw4u | 3 + .../procedures/procs/test/classify-request.hrw4u | 10 + .../data/procedures/procs/test/mixed-body.hrw4u | 7 + .../data/procedures/procs/test/set-cache.hrw4u | 3 + .../data/procedures/procs/test/set-origin.hrw4u | 3 + .../procedures/procs/test/wrong-namespace.hrw4u | 3 + tools/hrw4u/tests/data/procedures/reexport.ast.txt | 1 + .../hrw4u/tests/data/procedures/reexport.input.txt | 5 + .../tests/data/procedures/reexport.output.txt | 2 + .../tests/data/procedures/string-param.ast.txt | 1 + .../tests/data/procedures/string-param.input.txt | 5 + .../tests/data/procedures/string-param.output.txt | 2 + .../data/procedures/top-level-only.fail.error.txt | 1 + .../data/procedures/top-level-only.fail.input.txt | 5 + .../hrw4u/tests/data/procedures/transitive.ast.txt | 1 + .../tests/data/procedures/transitive.input.txt | 5 + .../tests/data/procedures/transitive.output.txt | 3 + .../data/procedures/unknown-proc.fail.error.txt | 1 + .../data/procedures/unknown-proc.fail.input.txt | 3 + .../data/procedures/wrong-arity.fail.error.txt | 1 + .../data/procedures/wrong-arity.fail.input.txt | 5 + .../data/procedures/wrong-namespace.fail.error.txt | 1 + .../data/procedures/wrong-namespace.fail.input.txt | 5 + tools/hrw4u/tests/data/sandbox/allowed.ast.txt | 1 + tools/hrw4u/tests/data/sandbox/allowed.input.txt | 3 + tools/hrw4u/tests/data/sandbox/allowed.output.txt | 2 + .../tests/data/sandbox/denied-function.ast.txt | 1 + .../tests/data/sandbox/denied-function.error.txt | 2 + .../tests/data/sandbox/denied-function.input.txt | 3 + .../data/sandbox/denied-language-break.ast.txt | 1 + .../data/sandbox/denied-language-break.error.txt | 2 + .../data/sandbox/denied-language-break.input.txt | 4 + .../data/sandbox/denied-language-elif.ast.txt | 1 + .../data/sandbox/denied-language-elif.error.txt | 1 + .../data/sandbox/denied-language-elif.input.txt | 7 + .../data/sandbox/denied-language-elif.sandbox.yaml | 6 + .../data/sandbox/denied-language-else.ast.txt | 1 + .../data/sandbox/denied-language-else.error.txt | 1 + .../data/sandbox/denied-language-else.input.txt | 7 + .../data/sandbox/denied-language-else.sandbox.yaml | 6 + .../tests/data/sandbox/denied-language-in.ast.txt | 1 + .../data/sandbox/denied-language-in.error.txt | 1 + .../data/sandbox/denied-language-in.input.txt | 5 + .../data/sandbox/denied-language-in.sandbox.yaml | 6 + .../data/sandbox/denied-modifier-nocase.ast.txt | 1 + .../data/sandbox/denied-modifier-nocase.error.txt | 1 + .../data/sandbox/denied-modifier-nocase.input.txt | 5 + .../sandbox/denied-modifier-nocase.sandbox.yaml | 6 + .../tests/data/sandbox/denied-modifier-or.ast.txt | 1 + .../data/sandbox/denied-modifier-or.error.txt | 1 + .../data/sandbox/denied-modifier-or.input.txt | 5 + .../data/sandbox/denied-modifier-or.sandbox.yaml | 6 + .../tests/data/sandbox/denied-section.ast.txt | 1 + .../tests/data/sandbox/denied-section.error.txt | 2 + .../tests/data/sandbox/denied-section.input.txt | 3 + tools/hrw4u/tests/data/sandbox/exceptions.txt | 10 + .../tests/data/sandbox/multiple-denials.ast.txt | 1 + .../tests/data/sandbox/multiple-denials.error.txt | 4 + .../tests/data/sandbox/multiple-denials.input.txt | 4 + .../tests/data/sandbox/per-test-sandbox.error.txt | 1 + .../tests/data/sandbox/per-test-sandbox.input.txt | 3 + .../data/sandbox/per-test-sandbox.sandbox.yaml | 4 + tools/hrw4u/tests/data/sandbox/sandbox.yaml | 12 + .../tests/data/sandbox/warned-function.ast.txt | 1 + .../tests/data/sandbox/warned-function.input.txt | 3 + .../tests/data/sandbox/warned-function.output.txt | 2 + .../data/sandbox/warned-function.sandbox.yaml | 6 + .../tests/data/sandbox/warned-function.warning.txt | 2 + tools/hrw4u/tests/test_lsp.py | 84 ++- tools/hrw4u/tests/test_procedures.py | 51 ++ tools/hrw4u/tests/test_sandbox.py | 43 ++ tools/hrw4u/tests/test_units.py | 218 ++++--- tools/hrw4u/tests/utils.py | 296 +++++++-- tools/slow_log_report.pl | 13 +- 286 files changed, 9929 insertions(+), 1394 deletions(-) diff --cc include/proxy/ReverseProxy.h index 20cf5a0cea,c24748b796..201327d8aa --- a/include/proxy/ReverseProxy.h +++ b/include/proxy/ReverseProxy.h @@@ -55,7 -56,8 +57,8 @@@ mapping_type request_url_remap_redirect bool response_url_remap(HTTPHdr *response_header, UrlRewrite *table); // Reload Functions -bool reloadUrlRewrite(); +bool reloadUrlRewrite(ConfigContext ctx); bool urlRewriteVerify(); - int url_rewrite_CB(const char *name, RecDataT data_type, RecData data, void *cookie); + void init_remap_volume_host_records(); + int url_rewrite_CB(const char *name, RecDataT data_type, RecData data, void *cookie); diff --cc src/iocore/cache/Cache.cc index aeb5cb2e98,14855e98fa..f7e302daa9 --- a/src/iocore/cache/Cache.cc +++ b/src/iocore/cache/Cache.cc @@@ -228,25 -229,7 +230,25 @@@ Cache::open_done( { CacheHostTable *hosttable_raw = new CacheHostTable(this, scheme); hosttable.reset(hosttable_raw); - hosttable_raw->register_config_callback(&hosttable); + + auto *ppt = &this->hosttable; + config::ConfigRegistry::Get_Instance().register_config( // late config registration + "cache_hosting", // registry key + ts::filename::HOSTING, // default filename + "proxy.config.cache.hosting_filename", // record holding the filename + [ppt](ConfigContext ctx) { // reload handler + CacheType type = CacheType::HTTP; + Cache *cache = nullptr; + { + ReplaceablePtr<CacheHostTable>::ScopedReader ht(ppt); - type = ht->type; - cache = ht->cache; ++ type = ht->getType(); ++ cache = ht->getCache(); + } + ppt->reset(new CacheHostTable(cache, type)); + ctx.complete("Finished loading"); + }, + config::ConfigSource::FileOnly, // no RPC content source. Legacy for now. + {"proxy.config.cache.hosting_filename"}); // trigger records } ReplaceablePtr<CacheHostTable>::ScopedReader hosttable(&this->hosttable); diff --cc src/iocore/cache/P_CacheHosting.h index 37008ccba8,d36821c51e..0e1a6f3618 --- a/src/iocore/cache/P_CacheHosting.h +++ b/src/iocore/cache/P_CacheHosting.h @@@ -241,12 -256,31 +257,25 @@@ public return hostMatch.get(); } - CacheType type = CacheType::HTTP; - Cache *cache = nullptr; - int m_numEntries = 0; - CacheHostRecord gen_host_rec; + CacheType + getType() const + { + return type; + } + + Cache * + getCache() const + { + return cache; + } - void - register_config_callback(ReplaceablePtr<CacheHostTable> *p) - { - RecRegisterConfigUpdateCb("proxy.config.cache.hosting_filename", CacheHostTable::config_callback, (void *)p); - } - private: + static int config_callback(const char *, RecDataT, RecData, void *); + + CacheType type = CacheType::HTTP; + Cache *cache = nullptr; + int m_numEntries = 0; + CacheHostRecord gen_host_rec; std::unique_ptr<CacheHostMatcher> hostMatch = nullptr; const matcher_tags config_tags = {"hostname", "domain", nullptr, nullptr, nullptr, nullptr, false}; const char *matcher_name = "unknown"; // Used for Debug/Warning/Error messages diff --cc src/proxy/ReverseProxy.cc index 9fb8da55c5,8deb9d0016..246aba2372 --- a/src/proxy/ReverseProxy.cc +++ b/src/proxy/ReverseProxy.cc @@@ -66,33 -67,23 +67,31 @@@ thread_local PluginThreadContext *plugi int init_reverse_proxy() { - ink_assert(rewrite_table == nullptr); + ink_assert(rewrite_table.load() == nullptr); reconfig_mutex = new_ProxyMutex(); - rewrite_table = new UrlRewrite(); + rewrite_table.store(new UrlRewrite()); + // Register with ConfigRegistry BEFORE load() so that remap.config is in + // FileManager's bindings when .include directives call configFileChild() + // to register child files (e.g. test.inc). + config::ConfigRegistry::Get_Instance().register_config("remap", // registry key + ts::filename::REMAP, // default filename + "proxy.config.url_remap.filename", // record holding the filename + [](ConfigContext ctx) { reloadUrlRewrite(ctx); }, // reload handler + config::ConfigSource::FileOnly, // file-based only + {"proxy.config.url_remap.filename", // trigger records + "proxy.config.proxy_name", "proxy.config.http.referer_default_redirect"}); + + rewrite_table.load()->acquire(); Note("%s loading ...", ts::filename::REMAP); - if (!rewrite_table->load()) { + if (!rewrite_table.load()->load()) { Emergency("%s failed to load", ts::filename::REMAP); } else { Note("%s finished loading", ts::filename::REMAP); } - RecRegisterConfigUpdateCb("proxy.config.url_remap.filename", url_rewrite_CB, (void *)FILE_CHANGED); - RecRegisterConfigUpdateCb("proxy.config.proxy_name", url_rewrite_CB, (void *)TSNAME_CHANGED); RecRegisterConfigUpdateCb("proxy.config.reverse_proxy.enabled", url_rewrite_CB, (void *)REVERSE_CHANGED); - RecRegisterConfigUpdateCb("proxy.config.http.referer_default_redirect", url_rewrite_CB, (void *)HTTP_DEFAULT_REDIRECT_CHANGED); - // Hold at least one lease, until we reload the configuration - rewrite_table->acquire(); - return 0; } @@@ -168,10 -167,89 +167,69 @@@ reloadUrlRewrite(ConfigContext ctx } } + /** + * Helper function to initialize volume_host_rec for a single url_mapping. + * This is a no-op if the mapping has no volume string or is already initialized. + */ + static void + init_mapping_volume_host_rec(url_mapping &mapping) + { + char errbuf[256]; + + if (!mapping.initVolumeHostRec(errbuf, sizeof(errbuf))) { + Error("Failed to initialize volume record for @volume=%s: %s", mapping.getVolume().c_str(), errbuf); + } + } + + static void + init_store_volume_host_records(UrlRewrite::MappingsStore &store) + { + if (store.hash_lookup) { + for (auto &entry : *store.hash_lookup) { + UrlMappingPathIndex *path_index = entry.second; + + if (path_index) { + path_index->foreach_mapping(init_mapping_volume_host_rec); + } + } + } + + for (UrlRewrite::RegexMapping *reg_map = store.regex_list.head; reg_map; reg_map = reg_map->link.next) { + if (reg_map->url_map) { + init_mapping_volume_host_rec(*reg_map->url_map); + } + } + } + + // This is called after the cache is initialized, since we may need the volume_host_records. + // Must only be called during startup before any remap reload can occur. + void + init_remap_volume_host_records() + { + UrlRewrite *table = rewrite_table.load(std::memory_order_acquire); + + if (!table) { + return; + } + + table->acquire(); + + Dbg(dbg_ctl_url_rewrite, "Initializing volume_host_rec for all remap rules after cache init"); + + // Initialize for all mapping stores + init_store_volume_host_records(table->forward_mappings); + init_store_volume_host_records(table->reverse_mappings); + init_store_volume_host_records(table->permanent_redirects); + init_store_volume_host_records(table->temporary_redirects); + init_store_volume_host_records(table->forward_mappings_with_recv_port); + + table->release(); + } + int -url_rewrite_CB(const char * /* name ATS_UNUSED */, RecDataT /* data_type ATS_UNUSED */, RecData data, void *cookie) +url_rewrite_CB(const char * /* name ATS_UNUSED */, RecDataT /* data_type ATS_UNUSED */, RecData data, + void * /* cookie ATS_UNUSED */) { - rewrite_table->SetReverseFlag(data.rec_int); - int my_token = static_cast<int>((long)cookie); - - switch (my_token) { - case REVERSE_CHANGED: - rewrite_table.load()->SetReverseFlag(data.rec_int); - break; - - case TSNAME_CHANGED: - case FILE_CHANGED: - case HTTP_DEFAULT_REDIRECT_CHANGED: - eventProcessor.schedule_imm(new UR_UpdateContinuation(reconfig_mutex), ET_TASK); - break; - - case URL_REMAP_MODE_CHANGED: - // You need to restart TS. - break; - - default: - ink_assert(0); - break; - } - ++ rewrite_table.load()->SetReverseFlag(data.rec_int); return 0; }
