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

Reply via email to