diff options
Diffstat (limited to 'src/cls/rgw/cls_rgw_client.h')
-rw-r--r-- | src/cls/rgw/cls_rgw_client.h | 80 |
1 files changed, 63 insertions, 17 deletions
diff --git a/src/cls/rgw/cls_rgw_client.h b/src/cls/rgw/cls_rgw_client.h index b708d5b51b3..f14380b2919 100644 --- a/src/cls/rgw/cls_rgw_client.h +++ b/src/cls/rgw/cls_rgw_client.h @@ -264,6 +264,7 @@ public: /* bucket index */ void cls_rgw_bucket_init_index(librados::ObjectWriteOperation& o); +void cls_rgw_bucket_init_index2(librados::ObjectWriteOperation& o); class CLSRGWConcurrentIO { protected: @@ -316,6 +317,20 @@ public: }; +class CLSRGWIssueBucketIndexInit2 : public CLSRGWConcurrentIO { +protected: + int issue_op(int shard_id, const std::string& oid) override; + int valid_ret_code() override { return -EEXIST; } + void cleanup() override; +public: + CLSRGWIssueBucketIndexInit2(librados::IoCtx& ioc, + std::map<int, std::string>& _bucket_objs, + uint32_t _max_aio) : + CLSRGWConcurrentIO(ioc, _bucket_objs, _max_aio) {} + virtual ~CLSRGWIssueBucketIndexInit2() override {} +}; + + class CLSRGWIssueBucketIndexClean : public CLSRGWConcurrentIO { protected: int issue_op(int shard_id, const std::string& oid) override; @@ -346,7 +361,8 @@ public: void cls_rgw_bucket_update_stats(librados::ObjectWriteOperation& o, bool absolute, - const std::map<RGWObjCategory, rgw_bucket_category_stats>& stats); + const std::map<RGWObjCategory, rgw_bucket_category_stats>& stats, + const std::map<RGWObjCategory, rgw_bucket_category_stats>* dec_stats = nullptr); void cls_rgw_bucket_prepare_op(librados::ObjectWriteOperation& o, RGWModifyOp op, const std::string& tag, const cls_rgw_obj_key& key, const std::string& locator, bool log_op, @@ -370,10 +386,15 @@ int cls_rgw_bi_get(librados::IoCtx& io_ctx, const std::string oid, rgw_cls_bi_entry *entry); int cls_rgw_bi_put(librados::IoCtx& io_ctx, const std::string oid, const rgw_cls_bi_entry& entry); void cls_rgw_bi_put(librados::ObjectWriteOperation& op, const std::string oid, const rgw_cls_bi_entry& entry); +// Write the given array of index entries and update bucket stats accordingly. +// If existing entries may be overwritten, pass check_existing=true to decrement +// their stats first. +void cls_rgw_bi_put_entries(librados::ObjectWriteOperation& op, + std::vector<rgw_cls_bi_entry> entries, + bool check_existing); int cls_rgw_bi_list(librados::IoCtx& io_ctx, const std::string& oid, const std::string& name, const std::string& marker, uint32_t max, - std::list<rgw_cls_bi_entry> *entries, bool *is_truncated); - + std::list<rgw_cls_bi_entry> *entries, bool *is_truncated, bool reshardlog = false); void cls_rgw_bucket_link_olh(librados::ObjectWriteOperation& op, const cls_rgw_obj_key& key, const ceph::buffer::list& olh_tag, @@ -505,6 +526,23 @@ public: virtual ~CLSRGWIssueBILogTrim() override {} }; +class CLSRGWIssueReshardLogTrim : public CLSRGWConcurrentIO { +protected: + int issue_op(int shard_id, const std::string& oid) override; + // Trim until -ENODATA is returned. + int valid_ret_code() override { return -ENODATA; } + bool need_multiple_rounds() override { return true; } + void add_object(int shard, const std::string& oid) override { objs_container[shard] = oid; } + void reset_container(std::map<int, std::string>& objs) override { + objs_container.swap(objs); + iter = objs_container.begin(); + objs.clear(); + } +public: + CLSRGWIssueReshardLogTrim(librados::IoCtx& io_ctx, std::map<int, std::string>& _bucket_objs, uint32_t max_aio) : + CLSRGWConcurrentIO(io_ctx, _bucket_objs, max_aio) {} +}; + /** * Check the bucket index. * @@ -607,19 +645,19 @@ int cls_rgw_gc_list_decode(const bufferlist& bl, bool *truncated, std::string& next_marker); /* lifecycle */ -// these overloads which call io_ctx.operate() should not be called in the rgw. -// rgw_rados_operate() should be called after the overloads w/o calls to io_ctx.operate() -#ifndef CLS_CLIENT_HIDE_IOCTX -int cls_rgw_lc_get_head(librados::IoCtx& io_ctx, const std::string& oid, cls_rgw_lc_obj_head& head); -int cls_rgw_lc_put_head(librados::IoCtx& io_ctx, const std::string& oid, cls_rgw_lc_obj_head& head); -int cls_rgw_lc_get_next_entry(librados::IoCtx& io_ctx, const std::string& oid, const std::string& marker, cls_rgw_lc_entry& entry); -int cls_rgw_lc_rm_entry(librados::IoCtx& io_ctx, const std::string& oid, const cls_rgw_lc_entry& entry); -int cls_rgw_lc_set_entry(librados::IoCtx& io_ctx, const std::string& oid, const cls_rgw_lc_entry& entry); -int cls_rgw_lc_get_entry(librados::IoCtx& io_ctx, const std::string& oid, const std::string& marker, cls_rgw_lc_entry& entry); -int cls_rgw_lc_list(librados::IoCtx& io_ctx, const std::string& oid, - const std::string& marker, uint32_t max_entries, - std::vector<cls_rgw_lc_entry>& entries); -#endif +void cls_rgw_lc_get_head(librados::ObjectReadOperation& op, bufferlist& bl); +int cls_rgw_lc_get_head_decode(const bufferlist& bl, cls_rgw_lc_obj_head& head); +void cls_rgw_lc_put_head(librados::ObjectWriteOperation& op, const cls_rgw_lc_obj_head& head); +void cls_rgw_lc_get_next_entry(librados::ObjectReadOperation& op, const std::string& marker, bufferlist& bl); +int cls_rgw_lc_get_next_entry_decode(const bufferlist& bl, cls_rgw_lc_entry& entry); +void cls_rgw_lc_rm_entry(librados::ObjectWriteOperation& op, const cls_rgw_lc_entry& entry); +void cls_rgw_lc_set_entry(librados::ObjectWriteOperation& op, const cls_rgw_lc_entry& entry); +void cls_rgw_lc_get_entry(librados::ObjectReadOperation& op, const std::string& marker, bufferlist& bl); +int cls_rgw_lc_get_entry_decode(const bufferlist& bl, cls_rgw_lc_entry& entry); +void cls_rgw_lc_list(librados::ObjectReadOperation& op, + const std::string& marker, uint32_t max_entries, + bufferlist& bl); +int cls_rgw_lc_list_decode(const bufferlist& bl, std::vector<cls_rgw_lc_entry>& entries); /* multipart */ void cls_rgw_mp_upload_part_info_update(librados::ObjectWriteOperation& op, const std::string& part_key, const RGWUploadPartInfo& info); @@ -637,8 +675,16 @@ int cls_rgw_reshard_list(librados::IoCtx& io_ctx, const std::string& oid, std::s int cls_rgw_reshard_get(librados::IoCtx& io_ctx, const std::string& oid, cls_rgw_reshard_entry& entry); #endif -/* resharding attribute on bucket index shard headers */ +// If writes to the bucket index should be blocked during resharding, fail with +// the given error code. RGWRados::guard_reshard() calls this in a loop to retry +// the write until the reshard completes. +// +// As of the T release, all index write ops in cls_rgw perform this check +// themselves. RGW can stop issuing this call in the T+2 (V) release once it +// knows that OSDs are running T at least. The call can be safely removed from +// cls_rgw in the T+4 (X) release. void cls_rgw_guard_bucket_resharding(librados::ObjectOperation& op, int ret_err); + // these overloads which call io_ctx.operate() should not be called in the rgw. // rgw_rados_operate() should be called after the overloads w/o calls to io_ctx.operate() #ifndef CLS_CLIENT_HIDE_IOCTX |