]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/rgw_resolve: musl libc does not implement res_nquery. Added fallback to res_query. 6292/head
authorJohn Coyle <dx9err@gmail.com>
Fri, 16 Oct 2015 17:12:41 +0000 (13:12 -0400)
committerJohn Coyle <dx9err@gmail.com>
Tue, 27 Oct 2015 13:57:47 +0000 (09:57 -0400)
res_query in musl libc is thread safe. Added a WITH_THREAD_SAFE_RES_QUERY cmake build option to disable default res_query lock.

Signed-off-by: John Coyle <dx9err@gmail.com>
CMakeLists.txt
configure.ac
src/include/config-h.in.cmake
src/rgw/rgw_resolve.cc

index 35a5104abac0d9e699b5aab2c3ecd76337770616..9b62baf97a7135854cfafdb939f6cf2cc70d00da 100644 (file)
@@ -82,6 +82,8 @@ CHECK_SYMBOL_EXISTS(__u8 "sys/types.h;linux/types.h" HAVE___U8)
 CHECK_SYMBOL_EXISTS(__u64 "sys/types.h;linux/types.h" HAVE___U64)
 CHECK_SYMBOL_EXISTS(__s64 "sys/types.h;linux/types.h" HAVE___S64)
 
+CHECK_SYMBOL_EXISTS(res_nquery "resolv.h" HAVE_RES_NQUERY)
+
 set(CEPH_MAN_DIR "share/man" CACHE STRING "Install location for man pages (relative to prefix).")
 
 option(ENABLE_SHARED "build shared libraries" ON)
@@ -209,6 +211,11 @@ option(WITH_RADOSGW "Rados Gateway is enabled" ON)
 #option for CephFS
 option(WITH_CEPHFS "CephFS is enabled" ON)
 
+option(WITH_THREAD_SAFE_RES_QUERY "res_query is thread safe" OFF)
+if(WITH_THREAD_SAFE_RES_QUERY)
+    set(HAVE_THREAD_SAFE_RES_QUERY 1 CACHE INTERNAL "Thread safe res_query supported.")
+endif(WITH_THREAD_SAFE_RES_QUERY)
+
 # Now create a useable config.h
 configure_file(
   ${PROJECT_SOURCE_DIR}/src/include/config-h.in.cmake
index 6396fea221924b2fe73e6fc3479403c5163f1166..9ef766e42569600d03b2cdc02e11ee84f0b7a24b 100644 (file)
@@ -338,6 +338,7 @@ if test x"$resolv_libs" != "xok"; then
   fi
 fi
 AC_SUBST([RESOLV_LIBS])
+AC_DEFINE(HAVE_RES_NQUERY, 1, [Define if you have res_nquery])
 
 dnl check for libkeyutils on linux
 KEYUTILS_LIB=""
index 8486d4cd3cd95ebb29448991963b8d677d058f61..2b65ae578794e7cb2cbbf09dd8171efcb541380f 100644 (file)
 #cmakedefine HAVE_GPERFTOOLS_MALLOC_EXTENSION_H
 #cmakedefine HAVE_GPERFTOOLS_PROFILER_H
 
+/* res_nquery is supported */
+#cmakedefine HAVE_RES_NQUERY
+
+/* res_query is thread safe */
+#cmakedefine HAVE_THREAD_SAFE_RES_QUERY
+
 #endif /* CONFIG_H */
index a69658966b98b78f85234ef8a38a10a84fa356a7..f29a0059849e67197f885ae121d453089473d3e5 100644 (file)
 #define dout_subsys ceph_subsys_rgw
 
 class RGWDNSResolver {
-  list<res_state> states;
   Mutex lock;
+#ifdef HAVE_RES_NQUERY
+  list<res_state> states;
 
   int get_state(res_state *ps);
   void put_state(res_state s);
-
+#endif
 
 public:
   ~RGWDNSResolver();
@@ -33,14 +34,16 @@ public:
 
 RGWDNSResolver::~RGWDNSResolver()
 {
+#ifdef HAVE_RES_NQUERY
   list<res_state>::iterator iter;
   for (iter = states.begin(); iter != states.end(); ++iter) {
     struct __res_state *s = *iter;
     delete s;
   }
+#endif
 }
 
-
+#ifdef HAVE_RES_NQUERY
 int RGWDNSResolver::get_state(res_state *ps)
 {
   lock.Lock();
@@ -68,18 +71,19 @@ void RGWDNSResolver::put_state(res_state s)
   Mutex::Locker l(lock);
   states.push_back(s);
 }
-
+#endif
 
 int RGWDNSResolver::resolve_cname(const string& hostname, string& cname, bool *found)
 {
-  res_state res;
-
   *found = false;
 
+#ifdef HAVE_RES_NQUERY
+  res_state res;
   int r = get_state(&res);
   if (r < 0) {
     return r;
   }
+#endif
 
   int ret;
 
@@ -91,7 +95,18 @@ int RGWDNSResolver::resolve_cname(const string& hostname, string& cname, bool *f
   const char *origname = hostname.c_str();
   unsigned char *pt, *answer;
   unsigned char *answend;
-  int len = res_nquery(res, origname, C_IN, T_CNAME, buf, sizeof(buf));
+  int len;
+
+#ifdef HAVE_RES_NQUERY
+  len = res_nquery(res, origname, C_IN, T_CNAME, buf, sizeof(buf));
+#else
+  {
+# ifndef HAVE_THREAD_SAFE_RES_QUERY
+    Mutex::Locker l(lock);
+# endif
+    len = res_query(origname, C_IN, T_CNAME, buf, sizeof(buf));
+  }
+#endif
   if (len < 0) {
     dout(20) << "res_query() failed" << dendl;
     ret = 0;
@@ -157,7 +172,9 @@ int RGWDNSResolver::resolve_cname(const string& hostname, string& cname, bool *f
   *found = true;
   ret = 0;
 done:
+#ifdef HAVE_RES_NQUERY
   put_state(res);
+#endif
   return ret;
 }