diff --git a/CMakeLists.txt b/CMakeLists.txt index 35a5104abac..9b62baf97a7 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 6396fea2219..9ef766e4256 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 8486d4cd3cd..2b65ae57879 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 a69658966b9..f29a0059849 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; }