This is an automated email from the ASF dual-hosted git repository. zwoop pushed a commit to branch 7.1.x in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/7.1.x by this push: new 1a7d6e9 HostDB - removing infinite ttl (0) 1a7d6e9 is described below commit 1a7d6e95c4d2a2ba8e7a0037ae5c45942bdad7f9 Author: Aaron Canary <acan...@oath.com> AuthorDate: Wed Apr 4 13:40:07 2018 -0500 HostDB - removing infinite ttl (0) format --- iocore/hostdb/HostDB.cc | 38 +++++++++++------------- iocore/hostdb/I_HostDBProcessor.h | 7 ++--- iocore/hostdb/P_HostDBProcessor.h | 2 +- lib/ts/ink_std_compat.h | 62 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 26 deletions(-) diff --git a/iocore/hostdb/HostDB.cc b/iocore/hostdb/HostDB.cc index f657852..072c397 100644 --- a/iocore/hostdb/HostDB.cc +++ b/iocore/hostdb/HostDB.cc @@ -23,6 +23,8 @@ #define _HOSTDB_CC_ +#include "ts/ink_std_compat.h" + #include "P_HostDB.h" #include "P_RefCountCacheSerializer.h" #include "ts/I_Layout.h" @@ -566,12 +568,10 @@ HostDBContinuation::insert(unsigned int attl) ink_assert(this_ethread() == hostDB.refcountcache->lock_for_key(folded_md5)->thread_holding); - HostDBInfo *r = HostDBInfo::alloc(); - r->key = folded_md5; - if (attl > HOST_DB_MAX_TTL) - attl = HOST_DB_MAX_TTL; - r->ip_timeout_interval = attl; + HostDBInfo *r = HostDBInfo::alloc(); + r->key = folded_md5; r->ip_timestamp = hostdb_current_interval; + r->ip_timeout_interval = std::clamp(attl, 1u, HOST_DB_MAX_TTL); Debug("hostdb", "inserting for: %.*s: (md5: %" PRIx64 ") now: %u timeout: %u ttl: %u", md5.host_len, md5.host_name, folded_md5, r->ip_timestamp, r->ip_timeout_interval, attl); @@ -1070,16 +1070,20 @@ HostDBContinuation::lookup_done(IpAddr const &ip, const char *aname, bool around Debug("hostdb", "failed for %s", md5.ip.toString(b, sizeof b)); } if (r == nullptr) { - r = insert(hostdb_ip_fail_timeout_interval); // currently ... 0 + r = insert(hostdb_ip_fail_timeout_interval); } else { - ttl_seconds = hostdb_ip_fail_timeout_interval; + r->ip_timestamp = hostdb_current_interval; + r->ip_timeout_interval = std::clamp(hostdb_ip_fail_timeout_interval, 1u, HOST_DB_MAX_TTL); } + r->round_robin = false; r->round_robin_elt = false; r->is_srv = is_srv(); r->reverse_dns = !is_byname() && !is_srv(); r->set_failed(); + return r; + } else { switch (hostdb_ttl_mode) { default: @@ -1102,15 +1106,14 @@ HostDBContinuation::lookup_done(IpAddr const &ip, const char *aname, bool around } HOSTDB_SUM_DYN_STAT(hostdb_ttl_stat, ttl_seconds); - // Not sure about this - it seems wrong but I can't be sure. If we got a fail - // in the DNS event, 0 is passed in which we then change to 1 here. Do we need this - // to be non-zero to avoid an infinite timeout? - if (0 == ttl_seconds) - ttl_seconds = 1; - if (r == nullptr) { - r = insert(hostdb_ip_fail_timeout_interval); // currently ... 0 + r = insert(ttl_seconds); + } else { + // update the TTL + r->ip_timestamp = hostdb_current_interval; + r->ip_timeout_interval = std::clamp(ttl_seconds, 1u, HOST_DB_MAX_TTL); } + r->round_robin_elt = false; // only true for elements explicitly added as RR elements. if (is_byname()) { ip_text_buffer b; @@ -1145,13 +1148,6 @@ HostDBContinuation::lookup_done(IpAddr const &ip, const char *aname, bool around } } - // Finally, set the TTL - r->ip_timeout_interval = ttl_seconds; - // set the "lookup_done" interval - r->ip_timestamp = hostdb_current_interval; - - if (from_cont) - do_put_response(from, r, from_cont); ink_assert(!r->round_robin || !r->reverse_dns); return r; } diff --git a/iocore/hostdb/I_HostDBProcessor.h b/iocore/hostdb/I_HostDBProcessor.h index 3e042ce..9ae3e27 100644 --- a/iocore/hostdb/I_HostDBProcessor.h +++ b/iocore/hostdb/I_HostDBProcessor.h @@ -244,7 +244,7 @@ struct HostDBInfo : public RefCountObj { bool is_ip_timeout() const { - return ip_timeout_interval && ip_interval() >= ip_timeout_interval; + return ip_interval() >= ip_timeout_interval; } bool @@ -339,9 +339,8 @@ struct HostDBInfo : public RefCountObj { unsigned int hostname_offset; // always maintain a permanent copy of the hostname for non-rev dns records. unsigned int ip_timestamp; - // limited to HOST_DB_MAX_TTL (0x1FFFFF, 24 days) - // if this is 0 then no timeout. - unsigned int ip_timeout_interval; + + unsigned int ip_timeout_interval; // bounded between 1 and HOST_DB_MAX_TTL (0x1FFFFF, 24 days) unsigned int is_srv : 1; unsigned int reverse_dns : 1; diff --git a/iocore/hostdb/P_HostDBProcessor.h b/iocore/hostdb/P_HostDBProcessor.h index 17f56a3..5cd703d 100644 --- a/iocore/hostdb/P_HostDBProcessor.h +++ b/iocore/hostdb/P_HostDBProcessor.h @@ -121,7 +121,7 @@ HOSTDB_CLIENT_IP_HASH(sockaddr const *lhs, sockaddr const *rhs) #define HOST_DB_IP_FAIL_TIMEOUT (60 * 60) //#define HOST_DB_MAX_INTERVAL (0x7FFFFFFF) -#define HOST_DB_MAX_TTL (0x1FFFFF) // 24 days +const unsigned int HOST_DB_MAX_TTL = (0x1FFFFF); // 24 days // // Constants diff --git a/lib/ts/ink_std_compat.h b/lib/ts/ink_std_compat.h new file mode 100644 index 0000000..0b76f6d --- /dev/null +++ b/lib/ts/ink_std_compat.h @@ -0,0 +1,62 @@ +/** @file + + Compatibility with future versions of the C++ standard library + + @section license License + + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#pragma once + +#ifdef __cplusplus +// +#if __cplusplus < 201402L +// +// C++ 14 compatibility +// +#include <memory> +namespace std +{ +template <typename T, typename... Args> +std::unique_ptr<T> +make_unique(Args &&... args) +{ + return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); +} +} // namespace std +#endif // C++ 14 compatibility + +// +#if __cplusplus < 201700L +// +// C++ 17 compatibility +// +#include <cassert> +namespace std +{ +template <typename T> +inline const T & +clamp(const T &v, const T &lo, const T &hi) +{ + assert(lo <= hi); + return (v < lo) ? lo : ((hi < v) ? hi : v); +} + +} // namespace std +#endif // C++ 17 compatibility +#endif // __cplusplus -- To stop receiving notification emails like this one, please contact zw...@apache.org.