From 3c227e3f086cbfbfff23d11515d9261906c7219d Mon Sep 17 00:00:00 2001 From: "fang.yuxiang" Date: Wed, 19 Jul 2017 18:49:11 +0800 Subject: [PATCH] rgw: fix rgw hang when do RGWRealmReloader::reload after go SIGHUP Quota async processer reference count err when bucket has no explicit shard Fixes: http://tracker.ceph.com/issues/20686 Signed-off-by: fang yuxiang fang.yuxiang@eisoo.com (cherry picked from commit 957b9bdee2024723da240e488b17d777942ac77d) Conflicts: src/rgw/rgw_rados.cc - master has diverged from jewel; applied change manually to the RGWGetBucketStatsContext ctor call --- src/rgw/rgw_quota.cc | 15 +++++++++++++-- src/rgw/rgw_rados.cc | 4 ++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/rgw/rgw_quota.cc b/src/rgw/rgw_quota.cc index 4abeb0c7e53ee..87cb3c41086a5 100644 --- a/src/rgw/rgw_quota.cc +++ b/src/rgw/rgw_quota.cc @@ -82,6 +82,7 @@ public: void set_stats(const rgw_user& user, rgw_bucket& bucket, RGWQuotaCacheStats& qs, RGWStorageStats& stats); int async_refresh(const rgw_user& user, rgw_bucket& bucket, RGWQuotaCacheStats& qs); void async_refresh_response(const rgw_user& user, rgw_bucket& bucket, RGWStorageStats& stats); + void async_refresh_fail(const rgw_user& user, rgw_bucket& bucket); class AsyncRefreshHandler { protected: @@ -153,6 +154,14 @@ int RGWQuotaCache::async_refresh(const rgw_user& user, rgw_bucket& bucket, RG return 0; } +template +void RGWQuotaCache::async_refresh_fail(const rgw_user& user, rgw_bucket& bucket) +{ + ldout(store->ctx(), 20) << "async stats refresh response for bucket=" << bucket << dendl; + + async_refcount->put(); +} + template void RGWQuotaCache::async_refresh_response(const rgw_user& user, rgw_bucket& bucket, RGWStorageStats& stats) { @@ -273,7 +282,8 @@ void BucketAsyncRefreshHandler::handle_response(int r) { if (r < 0) { ldout(store->ctx(), 20) << "AsyncRefreshHandler::handle_response() r=" << r << dendl; - return; /* nothing to do here */ + cache->async_refresh_fail(user, bucket); + return; } RGWStorageStats bs; @@ -374,7 +384,8 @@ void UserAsyncRefreshHandler::handle_response(int r) { if (r < 0) { ldout(store->ctx(), 20) << "AsyncRefreshHandler::handle_response() r=" << r << dendl; - return; /* nothing to do here */ + cache->async_refresh_fail(user, bucket); + return; } cache->async_refresh_response(user, bucket, stats); diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index f50cff8b406af..ddec99cda33a8 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -10610,16 +10610,16 @@ int RGWRados::get_bucket_stats_async(rgw_bucket& bucket, int shard_id, RGWGetBuc return r; int num_aio = 0; - RGWGetBucketStatsContext *get_ctx = new RGWGetBucketStatsContext(ctx, binfo.num_shards); + RGWGetBucketStatsContext *get_ctx = new RGWGetBucketStatsContext(ctx, binfo.num_shards ? : 1); assert(get_ctx); r = cls_bucket_head_async(bucket, shard_id, get_ctx, &num_aio); - get_ctx->put(); if (r < 0) { ctx->put(); if (num_aio) { get_ctx->unset_cb(); } } + get_ctx->put(); return r; } -- 2.39.5