From 853d5221e938511732fe8580e58df4ade2e192dc Mon Sep 17 00:00:00 2001 From: Bassam Tabbara Date: Sun, 4 Dec 2016 20:56:35 -0800 Subject: [PATCH] rgw: make fcgi optional during build fcgi can now be compiled out of the binary. this reduces the system dependencies when fcgi is not needed or used. Signed-off-by: Bassam Tabbara --- CMakeLists.txt | 7 +++++-- src/include/config-h.in.cmake | 3 +++ src/rgw/CMakeLists.txt | 18 ++++++++++++------ src/rgw/rgw_main.cc | 24 +++++++++++++++++------- src/rgw/rgw_request.h | 5 ++++- 5 files changed, 41 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 898e4abdbc5f9..b6a3a249de486 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -337,12 +337,15 @@ endif(WITH_DPDK) #option for RGW option(WITH_RADOSGW "Rados Gateway is enabled" ON) +option(WITH_RADOSGW_FCGI_FRONTEND "Rados Gateway's FCGI frontend is enabled" ON) +option(WITH_RADOSGW_ASIO_FRONTEND "Rados Gateway's ASIO frontend is enabled" ON) if(WITH_RADOSGW) find_package(EXPAT REQUIRED) - find_package(fcgi REQUIRED) + if(WITH_RADOSGW_FCGI_FRONTEND) + find_package(fcgi REQUIRED) + endif() endif(WITH_RADOSGW) -option(WITH_RADOSGW_ASIO_FRONTEND "Rados Gateway's ASIO frontend is enabled" ON) if (WITH_RADOSGW) if (NOT DEFINED OPENSSL_FOUND) diff --git a/src/include/config-h.in.cmake b/src/include/config-h.in.cmake index dd92974c4492c..1ce47083bb3be 100644 --- a/src/include/config-h.in.cmake +++ b/src/include/config-h.in.cmake @@ -145,6 +145,9 @@ /* define if radosgw enabled */ #cmakedefine WITH_RADOSGW +/* define if radosgw enabled */ +#cmakedefine WITH_RADOSGW_FCGI_FRONTEND + /* define if leveldb is enabled */ #cmakedefine WITH_LEVELDB diff --git a/src/rgw/CMakeLists.txt b/src/rgw/CMakeLists.txt index cd8a8f5193157..1bce3aea98da0 100644 --- a/src/rgw/CMakeLists.txt +++ b/src/rgw/CMakeLists.txt @@ -41,7 +41,6 @@ set(rgw_a_srcs rgw_cors_s3.cc rgw_dencoder.cc rgw_env.cc - rgw_fcgi.cc rgw_formats.cc rgw_frontend.cc rgw_gc.cc @@ -101,6 +100,10 @@ set(rgw_a_srcs rgw_xml_enc.cc rgw_torrent.cc) +if (WITH_RADOSGW_FCGI_FRONTEND) + list(APPEND rgw_a_srcs rgw_fcgi.cc) +endif() + add_library(rgw_a STATIC ${rgw_a_srcs}) add_dependencies(rgw_a civetweb_h) @@ -117,12 +120,15 @@ target_link_libraries(rgw_a librados cls_lock_client cls_rgw_client cls_refcount ${OPENLDAP_LIBRARIES} ${CRYPTO_LIBS}) set(radosgw_srcs - rgw_fcgi_process.cc rgw_loadgen_process.cc rgw_civetweb.cc rgw_civetweb_frontend.cc rgw_civetweb_log.cc) +if (WITH_RADOSGW_FCGI_FRONTEND) + list(APPEND radosgw_srcs rgw_fcgi_process.cc) +endif() + if (WITH_RADOSGW_ASIO_FRONTEND) list(APPEND radosgw_srcs rgw_asio_client.cc @@ -138,7 +144,7 @@ target_link_libraries(radosgw radosgw_a librados cls_rgw_client cls_lock_client cls_refcount_client cls_log_client cls_statelog_client cls_timeindex_client cls_version_client cls_replica_log_client cls_user_client - global fcgi ${LIB_RESOLV} + global ${FCGI_LIBRARY} ${LIB_RESOLV} ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${SSL_LIBRARIES} ${BLKID_LIBRARIES} ${ALLOC_LIBS}) # radosgw depends on cls libraries at runtime, but not as link dependencies @@ -155,7 +161,7 @@ target_link_libraries(radosgw-admin rgw_a librados cls_rgw_client cls_lock_client cls_refcount_client cls_log_client cls_statelog_client cls_timeindex_client cls_version_client cls_replica_log_client cls_user_client - global fcgi ${LIB_RESOLV} + global ${FCGI_LIBRARY} ${LIB_RESOLV} ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${SSL_LIBRARIES} ${BLKID_LIBRARIES}) install(TARGETS radosgw-admin DESTINATION bin) @@ -173,7 +179,7 @@ target_link_libraries(radosgw-object-expirer rgw_a librados cls_rgw_client cls_lock_client cls_refcount_client cls_log_client cls_statelog_client cls_timeindex_client cls_version_client cls_replica_log_client cls_user_client - global fcgi ${LIB_RESOLV} + global ${FCGI_LIBRARY} ${LIB_RESOLV} ${CURL_LIBRARIES} ${EXPAT_LIBRARIES}) install(TARGETS radosgw-object-expirer DESTINATION bin) @@ -206,5 +212,5 @@ if(WITH_EMBEDDED) add_library(cephd_rgw_base STATIC rgw_main.cc ${radosgw_admin_srcs}) set_target_properties(cephd_rgw_base PROPERTIES COMPILE_DEFINITIONS BUILDING_FOR_EMBEDDED) merge_static_libraries(cephd_rgw cephd_rgw_base rgw_a radosgw_a) - target_link_libraries(cephd_rgw fcgi) + target_link_libraries(cephd_rgw ${FCGI_LIBRARY}) endif() diff --git a/src/rgw/rgw_main.cc b/src/rgw/rgw_main.cc index 88be22651f101..363807617318a 100644 --- a/src/rgw/rgw_main.cc +++ b/src/rgw/rgw_main.cc @@ -110,7 +110,9 @@ static void signal_fd_finalize() static void handle_sigterm(int signum) { dout(1) << __func__ << dendl; +#if defined(WITH_RADOSGW_FCGI_FRONTEND) FCGX_ShutdownPending(); +#endif // send a signal to make fcgi's accept(2) wake up. unfortunately the // initial signal often isn't sufficient because we race with accept's @@ -319,7 +321,9 @@ int main(int argc, const char **argv) curl_global_init(CURL_GLOBAL_ALL); +#if defined(WITH_RADOSGW_FCGI_FRONTEND) FCGX_Init(); +#endif RGWRados *store = RGWStoreManager::get_storage(g_ceph_context, g_conf->rgw_enable_gc_threads, g_conf->rgw_enable_lc_threads, g_conf->rgw_enable_quota_threads, @@ -453,7 +457,7 @@ int main(int argc, const char **argv) fiter != fe_map.end(); ++fiter) { RGWFrontendConfig *config = fiter->second; string framework = config->get_framework(); - RGWFrontend *fe; + RGWFrontend *fe = NULL; #if defined(WITH_RADOSGW_ASIO_FRONTEND) if ((framework == "asio") && cct->check_experimental_feature_enabled("rgw-asio-frontend")) { @@ -463,23 +467,28 @@ int main(int argc, const char **argv) config->get_val("prefix", "", &uri_prefix); RGWProcessEnv env{ store, &rest, olog, port, uri_prefix }; fe = new RGWAsioFrontend(env); - } else if (framework == "fastcgi" || framework == "fcgi") { -#else - if (framework == "fastcgi" || framework == "fcgi") { + } #endif /* WITH_RADOSGW_ASIO_FRONTEND */ +#if defined(WITH_RADOSGW_FCGI_FRONTEND) + if (framework == "fastcgi" || framework == "fcgi") { std::string uri_prefix; config->get_val("prefix", "", &uri_prefix); RGWProcessEnv fcgi_pe = { store, &rest, olog, 0, uri_prefix }; fe = new RGWFCGXFrontend(fcgi_pe, config); - } else if (framework == "civetweb" || framework == "mongoose") { + } +#endif /* WITH_RADOSGW_FCGI_FRONTEND */ + if (framework == "civetweb" || framework == "mongoose") { + int port; + config->get_val("port", 80, &port); std::string uri_prefix; config->get_val("prefix", "", &uri_prefix); RGWProcessEnv env = { store, &rest, olog, 0, uri_prefix }; fe = new RGWCivetWebFrontend(env, config); - } else if (framework == "loadgen") { + } + if (framework == "loadgen") { int port; config->get_val("port", 80, &port); std::string uri_prefix; @@ -488,7 +497,8 @@ int main(int argc, const char **argv) RGWProcessEnv env = { store, &rest, olog, port, uri_prefix }; fe = new RGWLoadGenFrontend(env, config); - } else { + } + if (fe == NULL) { dout(0) << "WARNING: skipping unknown framework: " << framework << dendl; continue; } diff --git a/src/rgw/rgw_request.h b/src/rgw/rgw_request.h index 29060d010c025..08b3717decdec 100644 --- a/src/rgw/rgw_request.h +++ b/src/rgw/rgw_request.h @@ -9,8 +9,9 @@ #include "rgw_acl.h" #include "rgw_user.h" #include "rgw_op.h" +#if defined(WITH_RADOSGW_FCGI_FRONTEND) #include "rgw_fcgi.h" - +#endif #include "common/QueueRing.h" struct RGWRequest @@ -34,6 +35,7 @@ struct RGWRequest void log(struct req_state *s, const char *msg); }; /* RGWRequest */ +#if defined(WITH_RADOSGW_FCGI_FRONTEND) struct RGWFCGXRequest : public RGWRequest { FCGX_Request *fcgx; QueueRing *qr; @@ -48,6 +50,7 @@ struct RGWFCGXRequest : public RGWRequest { qr->enqueue(fcgx); } }; +#endif struct RGWLoadGenRequest : public RGWRequest { string method; -- 2.39.5