TS-1851: Remove HostDBInfo constructor so it becomes a POD Somewhere down the line HostDBInfo grew enough constructor complexity that it became a non-POD type. The allocation treats it like a POD type, so we should make sure that the compiler agrees.
Rename HostDBRoundRobin::n to HostDBRoundRobin::rrcount. Remove unused HostDBInfo::set_from Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/2915206c Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/2915206c Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/2915206c Branch: refs/heads/sphinx-docs Commit: 2915206c73f08dcb9d262dfa0f19967f20eaabdf Parents: bb2fcaa Author: James Peach <[email protected]> Authored: Wed Apr 3 15:36:53 2013 -0700 Committer: James Peach <[email protected]> Committed: Wed Apr 24 16:31:06 2013 -0700 ---------------------------------------------------------------------- CHANGES | 2 + iocore/dns/DNS.cc | 2 +- iocore/dns/SRV.h | 6 ++-- iocore/hostdb/HostDB.cc | 44 ++++++++++++++------------ iocore/hostdb/I_HostDBProcessor.h | 52 +++++--------------------------- iocore/hostdb/P_HostDBProcessor.h | 8 ++-- proxy/http/HttpSM.cc | 2 +- proxy/http/HttpTransact.h | 2 +- 8 files changed, 44 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2915206c/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index d75f00d..9720edb 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,8 @@ Changes with Apache Traffic Server 3.3.3 + *) [TS-1851] Turn HostDBInfo back into a POD type. + *) [TS-1850] Improve SSL certificate error reporting. *) [TS-1848] Fix MIMEHdr::field_value_set_int64() wrapper. http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2915206c/iocore/dns/DNS.cc ---------------------------------------------------------------------- diff --git a/iocore/dns/DNS.cc b/iocore/dns/DNS.cc index 3efd938..2d99eea 100644 --- a/iocore/dns/DNS.cc +++ b/iocore/dns/DNS.cc @@ -1360,7 +1360,7 @@ dns_process(DNSHandler *handler, HostEnt *buf, int len) ink_assert(buf->srv_hosts.srv_host_count == 0 && buf->srv_hosts.srv_hosts_length == 0); buf->srv_hosts.srv_host_count = 0; buf->srv_hosts.srv_hosts_length = 0; - int &num_srv = buf->srv_hosts.srv_host_count; + unsigned& num_srv = buf->srv_hosts.srv_host_count; int rname_len = -1; // http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2915206c/iocore/dns/SRV.h ---------------------------------------------------------------------- diff --git a/iocore/dns/SRV.h b/iocore/dns/SRV.h index 4393d7e..8e3e697 100644 --- a/iocore/dns/SRV.h +++ b/iocore/dns/SRV.h @@ -58,11 +58,11 @@ operator<(const SRV &left, const SRV &right) struct SRVHosts { - int srv_host_count; - int srv_hosts_length; + unsigned srv_host_count; + unsigned srv_hosts_length; SRV hosts[HOST_DB_MAX_ROUND_ROBIN_INFO]; - ~SRVHosts() + ~SRVHosts() { } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2915206c/iocore/hostdb/HostDB.cc ---------------------------------------------------------------------- diff --git a/iocore/hostdb/HostDB.cc b/iocore/hostdb/HostDB.cc index 52075d6..6221885 100644 --- a/iocore/hostdb/HostDB.cc +++ b/iocore/hostdb/HostDB.cc @@ -82,7 +82,7 @@ HostDBInfo::srvname(HostDBRoundRobin *rr) { if (!is_srv || !data.srv.srv_offset) return NULL; - ink_assert(this - rr->info >= 0 && this - rr->info < rr->n && data.srv.srv_offset < rr->length); + ink_assert(this - rr->info >= 0 && this - rr->info < rr->rrcount && data.srv.srv_offset < rr->length); return (char *) rr + data.srv.srv_offset; } @@ -239,8 +239,8 @@ HostDBCache::rebuild_callout(HostDBInfo * e, RebuildMC & r) HostDBRoundRobin *rr = (HostDBRoundRobin *) ptr(&e->app.rr.offset, r.partition); if (!rr) return corrupt_debugging_callout(e, r); - if (rr->n > HOST_DB_MAX_ROUND_ROBIN_INFO || rr->n <= 0 || - rr->good > HOST_DB_MAX_ROUND_ROBIN_INFO || rr->good <= 0 || rr->good > rr->n) + if (rr->rrcount > HOST_DB_MAX_ROUND_ROBIN_INFO || rr->rrcount <= 0 || + rr->good > HOST_DB_MAX_ROUND_ROBIN_INFO || rr->good <= 0 || rr->good > rr->rrcount) return corrupt_debugging_callout(e, r); for (int i = 0; i < rr->good; i++) { if (!valid_heap_pointer(((char *) &rr->info[i + 1]) - 1)) @@ -601,7 +601,7 @@ reply_to_cont(Continuation * cont, HostDBInfo * ar, bool is_srv = false) goto Lerror; } ip_text_buffer ipb; - Debug("hostdb", "RR of %d with %d good, 1st IP = %s", r->rr()->n, r->rr()->good, ats_ip_ntop(r->ip(), ipb, sizeof ipb)); + Debug("hostdb", "RR of %d with %d good, 1st IP = %s", r->rr()->rrcount, r->rr()->good, ats_ip_ntop(r->ip(), ipb, sizeof ipb)); } cont->handleEvent(is_srv ? EVENT_SRV_LOOKUP : EVENT_HOST_DB_LOOKUP, r); @@ -1045,7 +1045,7 @@ do_setby(HostDBInfo * r, HostDBApplicationInfo * app, const char *hostname, IpAd if (rr) { if (is_srv) { uint32_t key = makeHostHash(hostname); - for (int i = 0; i < rr->n; i++) { + for (int i = 0; i < rr->rrcount; i++) { if (key == rr->info[i].data.srv.key && !strcmp(hostname, rr->info[i].srvname(rr))) { Debug("hostdb", "immediate setby for %s", hostname); rr->info[i].app.allotment.application1 = app->allotment.application1; @@ -1054,7 +1054,7 @@ do_setby(HostDBInfo * r, HostDBApplicationInfo * app, const char *hostname, IpAd } } } else - for (int i = 0; i < rr->n; i++) { + for (int i = 0; i < rr->rrcount; i++) { if (rr->info[i].ip() == ip) { Debug("hostdb", "immediate setby for %s", hostname ? hostname : "<addr>"); rr->info[i].app.allotment.application1 = app->allotment.application1; @@ -1389,7 +1389,7 @@ static int restore_info(HostDBInfo * r, HostDBInfo * old_r, HostDBInfo & old_info, HostDBRoundRobin * old_rr_data) { if (old_rr_data) { - for (int j = 0; j < old_rr_data->n; j++) + for (int j = 0; j < old_rr_data->rrcount; j++) if (ats_ip_addr_eq(old_rr_data->info[j].ip(), r->ip())) { r->app = old_rr_data->info[j].app; return true; @@ -1459,7 +1459,7 @@ HostDBContinuation::dnsEvent(int event, HostEnt * e) HostDBRoundRobin *old_rr_data = old_r ? old_r->rr() : NULL; #ifdef DEBUG if (old_rr_data) { - for (int i = 0; i < old_rr_data->n; ++i) { + for (int i = 0; i < old_rr_data->rrcount; ++i) { if (old_r->md5_high != old_rr_data->info[i].md5_high || old_r->md5_low != old_rr_data->info[i].md5_low || old_r->md5_low_low != old_rr_data->info[i].md5_low_low) @@ -1522,11 +1522,13 @@ HostDBContinuation::dnsEvent(int event, HostEnt * e) ink_assert(!r || (r->app.allotment.application1 == 0 && r->app.allotment.application2 == 0)); if (rr) { - int s = HostDBRoundRobin::size(n, e->srv_hosts.srv_hosts_length); - HostDBRoundRobin *rr_data = (HostDBRoundRobin *) hostDB.alloc(&r->app.rr.offset, s); - Debug("hostdb", "allocating %d bytes for %d RR at %p %d", s, n, rr_data, r->app.rr.offset); + const int rrsize = HostDBRoundRobin::size(n, e->srv_hosts.srv_hosts_length); + HostDBRoundRobin *rr_data = (HostDBRoundRobin *) hostDB.alloc(&r->app.rr.offset, rrsize); + + Debug("hostdb", "allocating %d bytes for %d RR at %p %d", rrsize, n, rr_data, r->app.rr.offset); + if (rr_data) { - rr_data->length = s; + rr_data->length = rrsize; int i = 0, ii = 0; if (is_srv()) { int skip = 0; @@ -1550,6 +1552,8 @@ HostDBContinuation::dnsEvent(int event, HostEnt * e) for (i = 0; i < n; ++i) { SRV *t = q[i]; HostDBInfo& item = rr_data->info[i]; + + memset(&item, 0, sizeof(item)); item.round_robin = 0; item.reverse_dns = 0; item.is_srv = 1; @@ -1558,7 +1562,7 @@ HostDBContinuation::dnsEvent(int event, HostEnt * e) item.data.srv.srv_port = t->port; item.data.srv.key = t->key; - ink_assert (skip + (int) t->host_len <= e->srv_hosts.srv_hosts_length); + ink_assert((skip + t->host_len) <= e->srv_hosts.srv_hosts_length); memcpy(pos + skip, t->host, t->host_len); item.data.srv.srv_offset = (pos - (char *) rr_data) + skip; @@ -1574,13 +1578,13 @@ HostDBContinuation::dnsEvent(int event, HostEnt * e) item.app.allotment.application2 = 0; Debug("dns_srv", "inserted SRV RR record [%s] into HostDB with TTL: %d seconds", t->host, ttl_seconds); } - rr_data->good = rr_data->n = n; + rr_data->good = rr_data->rrcount = n; rr_data->current = 0; // restore if (old_rr_data) { - for (i = 0; i < rr_data->n; ++i) { - for (ii = 0; ii < old_rr_data->n; ++ii) { + for (i = 0; i < rr_data->rrcount; ++i) { + for (ii = 0; ii < old_rr_data->rrcount; ++ii) { if (rr_data->info[i].data.srv.key == old_rr_data->info[ii].data.srv.key) { char *new_host = rr_data->info[i].srvname(rr_data); char *old_host = old_rr_data->info[ii].srvname(old_rr_data); @@ -1610,7 +1614,7 @@ HostDBContinuation::dnsEvent(int event, HostEnt * e) ++i; } } - rr_data->good = rr_data->n = n; + rr_data->good = rr_data->rrcount = n; rr_data->current = 0; } } else { @@ -2233,7 +2237,7 @@ HostDBInfo::rr() HostDBRoundRobin *r = (HostDBRoundRobin *) hostDB.ptr(&app.rr.offset, hostDB.ptr_to_partition((char *) this)); - if (r && (r->n > HOST_DB_MAX_ROUND_ROBIN_INFO || r->n <= 0 || r->good > HOST_DB_MAX_ROUND_ROBIN_INFO || r->good <= 0)) { + if (r && (r->rrcount > HOST_DB_MAX_ROUND_ROBIN_INFO || r->rrcount <= 0 || r->good > HOST_DB_MAX_ROUND_ROBIN_INFO || r->good <= 0)) { ink_assert(!"bad round-robin"); return NULL; } @@ -2359,12 +2363,12 @@ struct ShowHostDB: public ShowCont HostDBRoundRobin *rr_data = r->rr(); if (rr_data) { CHECK_SHOW(show("<table border=1>\n")); - CHECK_SHOW(show("<tr><td>%s</td><td>%d</td></tr>\n", "Total", rr_data->n)); + CHECK_SHOW(show("<tr><td>%s</td><td>%d</td></tr>\n", "Total", rr_data->rrcount)); CHECK_SHOW(show("<tr><td>%s</td><td>%d</td></tr>\n", "Good", rr_data->good)); CHECK_SHOW(show("<tr><td>%s</td><td>%d</td></tr>\n", "Current", rr_data->current)); CHECK_SHOW(show("</table>\n")); - for (int i = 0; i < rr_data->n; i++) + for (int i = 0; i < rr_data->rrcount; i++) showOne(&rr_data->info[i], true, event, e); } } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2915206c/iocore/hostdb/I_HostDBProcessor.h ---------------------------------------------------------------------- diff --git a/iocore/hostdb/I_HostDBProcessor.h b/iocore/hostdb/I_HostDBProcessor.h index 9029d80..a1fd949 100644 --- a/iocore/hostdb/I_HostDBProcessor.h +++ b/iocore/hostdb/I_HostDBProcessor.h @@ -217,25 +217,6 @@ struct HostDBInfo } - /** - These are the only fields which will be inserted into the - database. Any new user fields must be added to this function. - - */ - void set_from(HostDBInfo const& that) - { - memcpy(&data, &that.data, sizeof data); - ip_timestamp = that.ip_timestamp; - ip_timeout_interval = that.ip_timeout_interval; - is_srv = that.is_srv; - round_robin = that.round_robin; - reverse_dns = that.reverse_dns; - - app.allotment.application1 = that.app.allotment.application1; - app.allotment.application2 = that.app.allotment.application2; - } - - // // Private // @@ -321,32 +302,13 @@ struct HostDBInfo bool match(INK_MD5 &, int, int); int heap_size(); int *heap_offset_ptr(); - -HostDBInfo() - : ip_timestamp(0) - , ip_timeout_interval(0) - , full(0) - , backed(0) - , deleted(0) - , hits(0) - , is_srv(0) - , round_robin(0) - , reverse_dns(0) - , md5_low_low(0) - , md5_low(0), md5_high(0) { - app.allotment.application1 = 0; - app.allotment.application2 = 0; - ats_ip_invalidate(ip()); - - return; - } }; struct HostDBRoundRobin { /** Total number (to compute space used). */ - short n; + short rrcount; /** Number which have not failed a connect. */ short good; @@ -355,12 +317,14 @@ struct HostDBRoundRobin unsigned short length; ink_time_t timed_rr_ctime; - HostDBInfo info[1]; + HostDBInfo info[]; - static int size(int nn, int srv_len = 0) + // Return the allocation size of a HostDBRoundRobin struct suitable for storing + // "count" HostDBInfo records. + static unsigned size(unsigned count, unsigned srv_len = 0) { - ink_assert(nn > 0); - return INK_ALIGN((int) (sizeof(HostDBRoundRobin) + (nn-1) * sizeof(HostDBInfo) + srv_len), 8); + ink_assert(count > 0); + return INK_ALIGN((sizeof(HostDBRoundRobin) + (count * sizeof(HostDBInfo)) + srv_len), 8); } /** Find the index of @a addr in member @a info. @@ -378,7 +342,7 @@ struct HostDBRoundRobin HostDBInfo *select_best_http(sockaddr const* client_ip, ink_time_t now, int32_t fail_window); HostDBInfo *select_best_srv(char *target, InkRand *rand, ink_time_t now, int32_t fail_window); HostDBRoundRobin() - : n(0), good(0), current(0), length(0), timed_rr_ctime(0) + : rrcount(0), good(0), current(0), length(0), timed_rr_ctime(0) { } }; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2915206c/iocore/hostdb/P_HostDBProcessor.h ---------------------------------------------------------------------- diff --git a/iocore/hostdb/P_HostDBProcessor.h b/iocore/hostdb/P_HostDBProcessor.h index 9691392..1920c2e 100644 --- a/iocore/hostdb/P_HostDBProcessor.h +++ b/iocore/hostdb/P_HostDBProcessor.h @@ -184,7 +184,7 @@ struct HostDBCache: public MultiCache<HostDBInfo> inline int HostDBRoundRobin::index_of(sockaddr const* ip) { - bool bad = (n <= 0 || n > HOST_DB_MAX_ROUND_ROBIN_INFO || good <= 0 || good > HOST_DB_MAX_ROUND_ROBIN_INFO); + bool bad = (rrcount <= 0 || rrcount > HOST_DB_MAX_ROUND_ROBIN_INFO || good <= 0 || good > HOST_DB_MAX_ROUND_ROBIN_INFO); if (bad) { ink_assert(!"bad round robin size"); return -1; @@ -220,7 +220,7 @@ HostDBRoundRobin::select_next(sockaddr const* ip) { inline HostDBInfo * HostDBRoundRobin::find_target(const char *target) { - bool bad = (n <= 0 || n > HOST_DB_MAX_ROUND_ROBIN_INFO || good <= 0 || good > HOST_DB_MAX_ROUND_ROBIN_INFO); + bool bad = (rrcount <= 0 || rrcount > HOST_DB_MAX_ROUND_ROBIN_INFO || good <= 0 || good > HOST_DB_MAX_ROUND_ROBIN_INFO); if (bad) { ink_assert(!"bad round robin size"); return NULL; @@ -237,7 +237,7 @@ HostDBRoundRobin::find_target(const char *target) { inline HostDBInfo * HostDBRoundRobin::select_best_http(sockaddr const* client_ip, ink_time_t now, int32_t fail_window) { - bool bad = (n <= 0 || n > HOST_DB_MAX_ROUND_ROBIN_INFO || good <= 0 || good > HOST_DB_MAX_ROUND_ROBIN_INFO); + bool bad = (rrcount <= 0 || rrcount > HOST_DB_MAX_ROUND_ROBIN_INFO || good <= 0 || good > HOST_DB_MAX_ROUND_ROBIN_INFO); if (bad) { ink_assert(!"bad round robin size"); @@ -314,7 +314,7 @@ HostDBRoundRobin::select_best_http(sockaddr const* client_ip, ink_time_t now, in inline HostDBInfo * HostDBRoundRobin::select_best_srv(char *target, InkRand *rand, ink_time_t now, int32_t fail_window) { - bool bad = (n <= 0 || n > HOST_DB_MAX_ROUND_ROBIN_INFO || good <= 0 || good > HOST_DB_MAX_ROUND_ROBIN_INFO); + bool bad = (rrcount <= 0 || rrcount > HOST_DB_MAX_ROUND_ROBIN_INFO || good <= 0 || good > HOST_DB_MAX_ROUND_ROBIN_INFO); if (bad) { ink_assert(!"bad round robin size"); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2915206c/proxy/http/HttpSM.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc index 300b890..db3a415 100644 --- a/proxy/http/HttpSM.cc +++ b/proxy/http/HttpSM.cc @@ -2026,7 +2026,7 @@ HttpSM::process_hostdb_info(HostDBInfo * r) // set the srv target`s last_failure if (t_state.dns_info.srv_lookup_success) { uint32_t last_failure = 0xFFFFFFFF; - for (int i = 0; i < rr->n && last_failure != 0; ++i) { + for (int i = 0; i < rr->rrcount && last_failure != 0; ++i) { if (last_failure > rr->info[i].app.http_data.last_failure) last_failure = rr->info[i].app.http_data.last_failure; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2915206c/proxy/http/HttpTransact.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransact.h b/proxy/http/HttpTransact.h index 2e53b2d..21383fe 100644 --- a/proxy/http/HttpTransact.h +++ b/proxy/http/HttpTransact.h @@ -1035,7 +1035,6 @@ public: next_hop_scheme(scheme), orig_scheme(scheme), method(0), - host_db_info(), cause_of_death_errno(-UNKNOWN_INTERNAL_ERROR), client_request_time(UNDEFINED_TIME), request_sent_time(UNDEFINED_TIME), @@ -1116,6 +1115,7 @@ public: memset(return_xbuf, 0, sizeof(return_xbuf)); memset(user_args, 0, sizeof(user_args)); + memset(&host_db_info, 0, sizeof(host_db_info)); } void
