diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 1c3d477e0a3..707378ff823 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -3812,17 +3812,28 @@ int main(int argc, const char **argv) OPT::SCRIPT_GET, }; + std::set gc_ops_list = { + OPT::GC_LIST, + OPT::GC_PROCESS, + OPT::OBJECT_RM, + OPT::BUCKET_RM, // --purge-objects + OPT::USER_RM, // --purge-data + OPT::OBJECTS_EXPIRE, + OPT::OBJECTS_EXPIRE_STALE_RM, + OPT::LC_PROCESS + }; raw_storage_op = (raw_storage_ops_list.find(opt_cmd) != raw_storage_ops_list.end() || raw_period_update || raw_period_pull); bool need_cache = readonly_ops_list.find(opt_cmd) == readonly_ops_list.end(); + bool need_gc = (gc_ops_list.find(opt_cmd) != gc_ops_list.end()) && !bypass_gc; if (raw_storage_op) { store = StoreManager::get_raw_storage(dpp(), g_ceph_context, "rados"); } else { store = StoreManager::get_storage(dpp(), g_ceph_context, "rados", false, false, false, false, false, - need_cache && g_conf()->rgw_cache_enabled); + need_cache && g_conf()->rgw_cache_enabled, need_gc); } if (!store) { cerr << "couldn't init storage provider" << std::endl; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index b4f2d7db782..7acff692131 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -1199,12 +1199,16 @@ int RGWRados::init_complete(const DoutPrefixProvider *dpp) pools_initialized = true; - gc = new RGWGC(); - gc->initialize(cct, this); + if (use_gc) { + gc = new RGWGC(); + gc->initialize(cct, this); + } else { + ldpp_dout(dpp, 5) << "note: GC not initialized" << dendl; + } obj_expirer = new RGWObjectExpirer(this->store); - if (use_gc_thread) { + if (use_gc_thread && use_gc) { gc->start_processor(); obj_expirer->start_processor(); } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 2600165d5e0..6b695899f56 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -401,7 +401,7 @@ class RGWRados SafeTimer *timer; rgw::sal::RadosStore* store; - RGWGC *gc; + RGWGC *gc = nullptr; RGWLC *lc; RGWObjectExpirer *obj_expirer; bool use_gc_thread; @@ -480,6 +480,7 @@ protected: RGWIndexCompletionManager *index_completion_manager{nullptr}; bool use_cache{false}; + bool use_gc{true}; int get_obj_head_ioctx(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, librados::IoCtx *ioctx); public: @@ -501,6 +502,11 @@ public: return *this; } + RGWRados& set_use_gc(bool status) { + use_gc = status; + return *this; + } + RGWLC *get_lc() { return lc; } diff --git a/src/rgw/rgw_sal.cc b/src/rgw/rgw_sal.cc index 2105e547fed..167f1f91ece 100644 --- a/src/rgw/rgw_sal.cc +++ b/src/rgw/rgw_sal.cc @@ -30,7 +30,7 @@ extern "C" { extern rgw::sal::Store* newStore(void); } -rgw::sal::Store* StoreManager::init_storage_provider(const DoutPrefixProvider* dpp, CephContext* cct, const std::string svc, bool use_gc_thread, bool use_lc_thread, bool quota_threads, bool run_sync_thread, bool run_reshard_thread, bool use_cache) +rgw::sal::Store* StoreManager::init_storage_provider(const DoutPrefixProvider* dpp, CephContext* cct, const std::string svc, bool use_gc_thread, bool use_lc_thread, bool quota_threads, bool run_sync_thread, bool run_reshard_thread, bool use_cache, bool use_gc) { rgw::sal::Store* store = nullptr; if (svc.compare("rados") == 0) { @@ -38,6 +38,7 @@ rgw::sal::Store* StoreManager::init_storage_provider(const DoutPrefixProvider* d RGWRados* rados = static_cast(store)->getRados(); if ((*rados).set_use_cache(use_cache) + .set_use_gc(use_gc) .set_run_gc_thread(use_gc_thread) .set_run_lc_thread(use_lc_thread) .set_run_quota_threads(quota_threads) diff --git a/src/rgw/rgw_sal.h b/src/rgw/rgw_sal.h index 5901b4749eb..84511194466 100644 --- a/src/rgw/rgw_sal.h +++ b/src/rgw/rgw_sal.h @@ -934,16 +934,16 @@ class StoreManager { public: StoreManager() {} static rgw::sal::Store* get_storage(const DoutPrefixProvider* dpp, CephContext* cct, const std::string svc, bool use_gc_thread, bool use_lc_thread, bool quota_threads, - bool run_sync_thread, bool run_reshard_thread, bool use_cache = true) { + bool run_sync_thread, bool run_reshard_thread, bool use_cache = true, bool use_gc = true) { rgw::sal::Store* store = init_storage_provider(dpp, cct, svc, use_gc_thread, use_lc_thread, - quota_threads, run_sync_thread, run_reshard_thread, use_cache); + quota_threads, run_sync_thread, run_reshard_thread, use_cache, use_gc); return store; } static rgw::sal::Store* get_raw_storage(const DoutPrefixProvider* dpp, CephContext* cct, const std::string svc) { rgw::sal::Store* store = init_raw_storage_provider(dpp, cct, svc); return store; } - static rgw::sal::Store* init_storage_provider(const DoutPrefixProvider* dpp, CephContext* cct, const std::string svc, bool use_gc_thread, bool use_lc_thread, bool quota_threads, bool run_sync_thread, bool run_reshard_thread, bool use_metadata_cache); + static rgw::sal::Store* init_storage_provider(const DoutPrefixProvider* dpp, CephContext* cct, const std::string svc, bool use_gc_thread, bool use_lc_thread, bool quota_threads, bool run_sync_thread, bool run_reshard_thread, bool use_metadata_cache, bool use_gc); static rgw::sal::Store* init_raw_storage_provider(const DoutPrefixProvider* dpp, CephContext* cct, const std::string svc); static void close_storage(rgw::sal::Store* store);