From: fang.yuxiang Date: Wed, 19 Jul 2017 10:49:11 +0000 (+0800) Subject: rgw: fix rgw hang when do RGWRealmReloader::reload after go SIGHUP X-Git-Tag: v12.1.2~140^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=957b9bdee2024723da240e488b17d777942ac77d;p=ceph.git 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 --- diff --git a/src/rgw/rgw_quota.cc b/src/rgw/rgw_quota.cc index 370cf3f1a606..79b5ebebaaf0 100644 --- a/src/rgw/rgw_quota.cc +++ b/src/rgw/rgw_quota.cc @@ -85,6 +85,7 @@ public: void set_stats(const rgw_user& user, const rgw_bucket& bucket, RGWQuotaCacheStats& qs, RGWStorageStats& stats); int async_refresh(const rgw_user& user, const 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: @@ -157,6 +158,14 @@ int RGWQuotaCache::async_refresh(const rgw_user& user, const rgw_bucket& buck 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) { @@ -294,7 +303,8 @@ void BucketAsyncRefreshHandler::handle_response(const 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; @@ -405,7 +415,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 052ed7e0c2b5..40621f992ca8 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -11588,16 +11588,16 @@ public: int RGWRados::get_bucket_stats_async(RGWBucketInfo& bucket_info, int shard_id, RGWGetBucketStats_CB *ctx) { int num_aio = 0; - RGWGetBucketStatsContext *get_ctx = new RGWGetBucketStatsContext(ctx, bucket_info.num_shards); + RGWGetBucketStatsContext *get_ctx = new RGWGetBucketStatsContext(ctx, bucket_info.num_shards ? : 1); assert(get_ctx); int r = cls_bucket_head_async(bucket_info, 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; }