HostDB: remove unused field in HostDBApplicationInfo, and update remaining types in http_data to fix broken padding. (#7264)

diff --git a/iocore/hostdb/HostDB.cc b/iocore/hostdb/HostDB.cc
index ede43d0..9ca0f4e 100644
--- a/iocore/hostdb/HostDB.cc
+++ b/iocore/hostdb/HostDB.cc
@@ -64,6 +64,10 @@
 int hostdb_disable_reverse_lookup                  = 0;
 int hostdb_max_iobuf_index                         = BUFFER_SIZE_INDEX_32K;
 
+// Verify the generic storage is sufficient to cover all alternate members.
+static_assert(sizeof(HostDBApplicationInfo::allotment) == sizeof(HostDBApplicationInfo),
+              "Generic storage for HostDBApplicationInfo is smaller than the union storage.");
+
 ClassAllocator<HostDBContinuation> hostDBContAllocator("hostDBContAllocator");
 
 // Static configuration information
diff --git a/iocore/hostdb/I_HostDBProcessor.h b/iocore/hostdb/I_HostDBProcessor.h
index d709bdf..80f9b68 100644
--- a/iocore/hostdb/I_HostDBProcessor.h
+++ b/iocore/hostdb/I_HostDBProcessor.h
@@ -83,43 +83,44 @@
 // Types
 //
 
-//
-// This structure contains the host information required by
-// the application.  Except for the initial fields it
-// is treated as opaque by the database.
-//
-
+/** Host information metadata used by various parts of HostDB.
+ * It is stored as generic data in the cache.
+ *
+ * As a @c union only one of the members is valid, Which one depends on context data in the
+ * @c HostDBInfo. This data is written literally to disk therefore if any change is made,
+ * the @c object_version for the cache must be updated by modifying @c HostDBInfo::version.
+ *
+ * @see HostDBInfo::version
+ */
 union HostDBApplicationInfo {
+  /// Generic storage. This is verified to be the size of the union.
   struct application_data_allotment {
     unsigned int application1;
     unsigned int application2;
   } allotment;
 
+  enum HttpVersion : uint8_t {
+    HTTP_VERSION_UNDEFINED = 0,
+    HTTP_VERSION_09        = 1,
+    HTTP_VERSION_10        = 2,
+    HTTP_VERSION_11        = 3,
+  };
+
   //////////////////////////////////////////////////////////
   // http server attributes in the host database          //
   //                                                      //
-  // http_version       - one of HttpVersion_t            //
-  // keep_alive_timeout - in seconds. (up to 63 seconds). //
+  // http_version       - one of HttpVersion              //
   // last_failure       - UNIX time for the last time     //
   //                      we tried the server & failed    //
   // fail_count         - Number of times we tried and    //
   //                       and failed to contact the host //
   //////////////////////////////////////////////////////////
   struct http_server_attr {
-    unsigned int http_version : 3;
-    unsigned int keepalive_timeout : 6;
-    unsigned int fail_count : 8;
-    unsigned int unused1 : 8;
-    unsigned int last_failure : 32;
+    uint32_t last_failure;
+    HttpVersion http_version;
+    uint8_t fail_count;
   } http_data;
 
-  enum HttpVersion_t {
-    HTTP_VERSION_UNDEFINED = 0,
-    HTTP_VERSION_09        = 1,
-    HTTP_VERSION_10        = 2,
-    HTTP_VERSION_11        = 3,
-  };
-
   struct application_data_rr {
     unsigned int offset;
   } rr;
@@ -161,11 +162,15 @@
     ioBufAllocator[_iobuffer_index].free_void((void *)(this));
   }
 
-  // return a version number-- so we can manage compatibility with the marshal/unmarshal
+  /// Effectively the @c object_version for cache data.
+  /// This is used to indicate incompatible changes in the binary layout of HostDB records.
+  /// It must be updated if any such change is made, even if it is functionally equivalent.
   static ts::VersionNumber
   version()
   {
-    return ts::VersionNumber(1, 0);
+    /// - 1.0 Initial version.
+    /// - 1.1 tweak HostDBApplicationInfo::http_data.
+    return ts::VersionNumber(1, 1);
   }
 
   static HostDBInfo *
diff --git a/proxy/http/HttpTransact.h b/proxy/http/HttpTransact.h
index 8b062df..bfca7f5 100644
--- a/proxy/http/HttpTransact.h
+++ b/proxy/http/HttpTransact.h
@@ -682,10 +682,10 @@
     DNSLookupInfo dns_info;
     RedirectInfo redirect_info;
     OutboundConnTrack::TxnState outbound_conn_track_state;
-    unsigned int updated_server_version   = HostDBApplicationInfo::HTTP_VERSION_UNDEFINED;
-    bool force_dns                        = false;
-    MgmtByte cache_open_write_fail_action = 0;
-    bool is_revalidation_necessary        = false; // Added to check if revalidation is necessary - YTS Team, yamsat
+    HostDBApplicationInfo::HttpVersion updated_server_version = HostDBApplicationInfo::HTTP_VERSION_UNDEFINED;
+    bool force_dns                                            = false;
+    MgmtByte cache_open_write_fail_action                     = 0;
+    bool is_revalidation_necessary = false; // Added to check if revalidation is necessary - YTS Team, yamsat
     ConnectionAttributes client_info;
     ConnectionAttributes parent_info;
     ConnectionAttributes server_info;