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 <dx9err@gmail.com>
This commit is contained in:
John Coyle 2015-10-16 13:12:41 -04:00
parent 89b2b9b5c0
commit cb2d4540d6
4 changed files with 38 additions and 7 deletions

View 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(__u64 "sys/types.h;linux/types.h" HAVE___U64)
CHECK_SYMBOL_EXISTS(__s64 "sys/types.h;linux/types.h" HAVE___S64) 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).") set(CEPH_MAN_DIR "share/man" CACHE STRING "Install location for man pages (relative to prefix).")
option(ENABLE_SHARED "build shared libraries" ON) option(ENABLE_SHARED "build shared libraries" ON)
@ -209,6 +211,11 @@ option(WITH_RADOSGW "Rados Gateway is enabled" ON)
#option for CephFS #option for CephFS
option(WITH_CEPHFS "CephFS is enabled" ON) 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 # Now create a useable config.h
configure_file( configure_file(
${PROJECT_SOURCE_DIR}/src/include/config-h.in.cmake ${PROJECT_SOURCE_DIR}/src/include/config-h.in.cmake

View File

@ -338,6 +338,7 @@ if test x"$resolv_libs" != "xok"; then
fi fi
fi fi
AC_SUBST([RESOLV_LIBS]) AC_SUBST([RESOLV_LIBS])
AC_DEFINE(HAVE_RES_NQUERY, 1, [Define if you have res_nquery])
dnl check for libkeyutils on linux dnl check for libkeyutils on linux
KEYUTILS_LIB="" KEYUTILS_LIB=""

View File

@ -234,4 +234,10 @@
#cmakedefine HAVE_GPERFTOOLS_MALLOC_EXTENSION_H #cmakedefine HAVE_GPERFTOOLS_MALLOC_EXTENSION_H
#cmakedefine HAVE_GPERFTOOLS_PROFILER_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 */ #endif /* CONFIG_H */

View File

@ -18,12 +18,13 @@
#define dout_subsys ceph_subsys_rgw #define dout_subsys ceph_subsys_rgw
class RGWDNSResolver { class RGWDNSResolver {
list<res_state> states;
Mutex lock; Mutex lock;
#ifdef HAVE_RES_NQUERY
list<res_state> states;
int get_state(res_state *ps); int get_state(res_state *ps);
void put_state(res_state s); void put_state(res_state s);
#endif
public: public:
~RGWDNSResolver(); ~RGWDNSResolver();
@ -33,14 +34,16 @@ public:
RGWDNSResolver::~RGWDNSResolver() RGWDNSResolver::~RGWDNSResolver()
{ {
#ifdef HAVE_RES_NQUERY
list<res_state>::iterator iter; list<res_state>::iterator iter;
for (iter = states.begin(); iter != states.end(); ++iter) { for (iter = states.begin(); iter != states.end(); ++iter) {
struct __res_state *s = *iter; struct __res_state *s = *iter;
delete s; delete s;
} }
#endif
} }
#ifdef HAVE_RES_NQUERY
int RGWDNSResolver::get_state(res_state *ps) int RGWDNSResolver::get_state(res_state *ps)
{ {
lock.Lock(); lock.Lock();
@ -68,18 +71,19 @@ void RGWDNSResolver::put_state(res_state s)
Mutex::Locker l(lock); Mutex::Locker l(lock);
states.push_back(s); states.push_back(s);
} }
#endif
int RGWDNSResolver::resolve_cname(const string& hostname, string& cname, bool *found) int RGWDNSResolver::resolve_cname(const string& hostname, string& cname, bool *found)
{ {
res_state res;
*found = false; *found = false;
#ifdef HAVE_RES_NQUERY
res_state res;
int r = get_state(&res); int r = get_state(&res);
if (r < 0) { if (r < 0) {
return r; return r;
} }
#endif
int ret; int ret;
@ -91,7 +95,18 @@ int RGWDNSResolver::resolve_cname(const string& hostname, string& cname, bool *f
const char *origname = hostname.c_str(); const char *origname = hostname.c_str();
unsigned char *pt, *answer; unsigned char *pt, *answer;
unsigned char *answend; 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) { if (len < 0) {
dout(20) << "res_query() failed" << dendl; dout(20) << "res_query() failed" << dendl;
ret = 0; ret = 0;
@ -157,7 +172,9 @@ int RGWDNSResolver::resolve_cname(const string& hostname, string& cname, bool *f
*found = true; *found = true;
ret = 0; ret = 0;
done: done:
#ifdef HAVE_RES_NQUERY
put_state(res); put_state(res);
#endif
return ret; return ret;
} }