This is an automated email from the ASF dual-hosted git repository.

masaori pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 4e2ac3b  Fix lookup split dns rule with fast path (#7320)
4e2ac3b is described below

commit 4e2ac3b2be8b535ab89d0f5762b3201647e5efba
Author: Masaori Koshiba <masa...@apache.org>
AuthorDate: Fri Nov 27 07:57:57 2020 +0900

    Fix lookup split dns rule with fast path (#7320)
---
 iocore/dns/P_SplitDNSProcessor.h |  8 +++++---
 iocore/dns/SplitDNS.cc           | 22 ++++++++++------------
 2 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/iocore/dns/P_SplitDNSProcessor.h b/iocore/dns/P_SplitDNSProcessor.h
index ef20b0e..5fa119e 100644
--- a/iocore/dns/P_SplitDNSProcessor.h
+++ b/iocore/dns/P_SplitDNSProcessor.h
@@ -32,6 +32,8 @@
 
 #include "ProxyConfig.h"
 
+#include "tscore/HostLookup.h"
+
 /* ---------------------------
    forward declarations ...
    --------------------------- */
@@ -88,9 +90,9 @@ struct SplitDNS : public ConfigInfo {
      required by the alleged fast
      path
      ---------------------------- */
-  bool m_bEnableFastPath = false;
-  void *m_pxLeafArray    = nullptr;
-  int m_numEle           = 0;
+  bool m_bEnableFastPath               = false;
+  HostLookup::LeafArray *m_pxLeafArray = nullptr;
+  int m_numEle                         = 0;
 };
 
 /* --------------------------------------------------------------
diff --git a/iocore/dns/SplitDNS.cc b/iocore/dns/SplitDNS.cc
index cf6a9b9..6747c16 100644
--- a/iocore/dns/SplitDNS.cc
+++ b/iocore/dns/SplitDNS.cc
@@ -222,7 +222,7 @@ SplitDNS::findServer(RequestData *rdata, SplitDNSResult 
*result)
   /* ---------------------------
      the 'alleged' fast path ...
      --------------------------- */
-  if (m_bEnableFastPath) {
+  if (m_bEnableFastPath && m_pxLeafArray) {
     SplitDNSRecord *data_ptr = nullptr;
     char *pHost              = const_cast<char *>(rdata->get_host());
     if (nullptr == pHost) {
@@ -230,30 +230,28 @@ SplitDNS::findServer(RequestData *rdata, SplitDNSResult 
*result)
       return;
     }
 
-    int len        = strlen(pHost);
-    HostLeaf *pxHL = static_cast<HostLeaf *>(m_pxLeafArray);
-    for (int i = 0; i < m_numEle; i++) {
-      if (nullptr == pxHL) {
-        break;
-      }
+    int len = strlen(pHost);
+    int n   = std::min(static_cast<size_t>(m_numEle), m_pxLeafArray->size());
+    for (int i = 0; i < n; i++) {
+      const HostLeaf &pxHL = m_pxLeafArray->at(i);
 
-      if (false == pxHL[i].isNot && static_cast<int>(pxHL[i].match.size()) > 
len) {
+      if (false == pxHL.isNot && static_cast<int>(pxHL.match.size()) > len) {
         continue;
       }
 
-      int idx            = len - pxHL[i].match.size();
+      int idx            = len - pxHL.match.size();
       char *pH           = &pHost[idx];
-      const char *pMatch = pxHL[i].match.data();
+      const char *pMatch = pxHL.match.data();
       char cNot          = *pMatch;
 
       if ('!' == cNot) {
         pMatch++;
       }
 
-      int res = memcmp(pH, pMatch, pxHL[i].match.size());
+      int res = memcmp(pH, pMatch, pxHL.match.size());
 
       if ((0 != res && '!' == cNot) || (0 == res && '!' != cNot)) {
-        data_ptr = static_cast<SplitDNSRecord *>(pxHL[i].opaque_data);
+        data_ptr = static_cast<SplitDNSRecord *>(pxHL.opaque_data);
         data_ptr->UpdateMatch(result, rdata);
         break;
       }

Reply via email to