From: John Coyle Date: Fri, 16 Oct 2015 17:12:41 +0000 (-0400) Subject: rgw/rgw_resolve: musl libc does not implement res_nquery. Added fallback to res_query. X-Git-Tag: v10.0.2~196^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cb2d4540d6356dd1346e53958b2d87d86d4d4713;p=ceph.git rgw/rgw_resolve: musl libc does not implement res_nquery. Added fallback to res_query. 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 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 35a5104abac0..9b62baf97a71 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/configure.ac b/configure.ac index 6396fea22192..9ef766e42569 100644 --- a/configure.ac +++ b/configure.ac @@ -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="" diff --git a/src/include/config-h.in.cmake b/src/include/config-h.in.cmake index 8486d4cd3cd9..2b65ae578794 100644 --- a/src/include/config-h.in.cmake +++ b/src/include/config-h.in.cmake @@ -234,4 +234,10 @@ #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 */ diff --git a/src/rgw/rgw_resolve.cc b/src/rgw/rgw_resolve.cc index a69658966b98..f29a0059849e 100644 --- a/src/rgw/rgw_resolve.cc +++ b/src/rgw/rgw_resolve.cc @@ -18,12 +18,13 @@ #define dout_subsys ceph_subsys_rgw class RGWDNSResolver { - list states; Mutex lock; +#ifdef HAVE_RES_NQUERY + list 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::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; }