From 80dda3ca94c767a2aeea14b5f3351bf43ab39f87 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Wed, 1 Jan 2025 14:19:18 +0300 Subject: [PATCH] Remove separate list_inode_next() --- src/client/cluster_client.h | 8 ++--- src/client/cluster_client_list.cpp | 44 +++++++------------------- src/cmd/cli_merge.cpp | 11 ++----- src/cmd/cli_rm_data.cpp | 51 +++++++++++------------------- 4 files changed, 34 insertions(+), 80 deletions(-) diff --git a/src/client/cluster_client.h b/src/client/cluster_client.h index 259c9b87..9d5ad70f 100644 --- a/src/client/cluster_client.h +++ b/src/client/cluster_client.h @@ -11,8 +11,6 @@ #define DEFAULT_CLIENT_MAX_BUFFERED_BYTES 32*1024*1024 #define DEFAULT_CLIENT_MAX_BUFFERED_OPS 1024 #define DEFAULT_CLIENT_MAX_WRITEBACK_IODEPTH 256 -#define INODE_LIST_DONE 1 -#define INODE_LIST_HAS_UNSTABLE 2 #define OSD_OP_READ_BITMAP OSD_OP_SEC_READ_BMP #define OSD_OP_READ_CHAIN_BITMAP 0x102 @@ -141,10 +139,8 @@ public: void continue_ops(int time_passed = 0); - inode_list_t *list_inode_start(inode_t inode, int max_parallel_pgs, std::function&& objects, pg_num_t pg_num, std::vector && inactive_osds, int errcode, int status)> callback); - void list_inode_next(inode_list_t *lst); - int list_pg_count(inode_list_t *lst); + void list_inode(inode_t inode, int max_parallel_pgs, std::function&& objects, std::vector && inactive_osds)> pg_callback); //inline uint32_t get_bs_bitmap_granularity() { return st_cli.global_bitmap_granularity; } //inline uint64_t get_bs_block_size() { return st_cli.global_block_size; } diff --git a/src/client/cluster_client_list.cpp b/src/client/cluster_client_list.cpp index df374077..4de136b4 100644 --- a/src/client/cluster_client_list.cpp +++ b/src/client/cluster_client_list.cpp @@ -52,43 +52,28 @@ struct inode_list_t int onstack = 0; std::vector pgs; pg_num_t real_pg_count = 0; - std::function&& objects, pg_num_t pg_num, std::vector && inactive_osds, int errcode, int status)> callback; + std::function&& objects, std::vector && inactive_osds)> callback; }; -inode_list_t* cluster_client_t::list_inode_start(inode_t inode, int max_parallel_pgs, std::function&& objects, pg_num_t pg_num, std::vector && inactive_osds, int errcode, int status)> callback) +void cluster_client_t::list_inode(inode_t inode, int max_parallel_pgs, std::function&& objects, std::vector && inactive_osds)> pg_callback) { init_msgr(); pool_id_t pool_id = INODE_POOL(inode); if (!pool_id || st_cli.pool_config.find(pool_id) == st_cli.pool_config.end()) { if (log_level > 0) - { fprintf(stderr, "Pool %u does not exist\n", pool_id); - } - return NULL; + pg_callback(-EINVAL, 0, 0, std::set(), std::vector()); + return; } inode_list_t *lst = new inode_list_t(); lst->cli = this; lst->pool_id = pool_id; lst->inode = inode; - lst->callback = callback; + lst->callback = pg_callback; lst->max_parallel_pgs = max_parallel_pgs <= 0 ? 16 : max_parallel_pgs; lists.push_back(lst); - if (!continue_listing(lst)) - { - return NULL; - } - return lst; -} - -int cluster_client_t::list_pg_count(inode_list_t *lst) -{ - return lst->pgs.size() - lst->done_pgs; -} - -void cluster_client_t::list_inode_next(inode_list_t *lst) -{ continue_listing(lst); } @@ -146,13 +131,13 @@ bool cluster_client_t::restart_listing(inode_list_t* lst) if (pool_it == st_cli.pool_config.end()) { // Unknown pool - lst->callback(lst, std::set(), 0, std::vector(), -EINVAL, INODE_LIST_DONE); + lst->callback(-EINVAL, 0, 0, std::set(), std::vector()); return false; } else if (lst->done_pgs) { // PG count changed during listing, it should fail - lst->callback(lst, std::set(), 0, std::vector(), -EAGAIN, INODE_LIST_DONE); + lst->callback(-EAGAIN, 0, 0, std::set(), std::vector()); return false; } else @@ -420,16 +405,9 @@ void cluster_client_t::finish_list_pg(inode_list_pg_t *pg, bool retry_epipe) } lst->done_pgs++; pg->state = LIST_PG_DONE; - int status = 0; - if (lst->done_pgs >= lst->pgs.size()) - { - status |= INODE_LIST_DONE; - } - if (pg->has_unstable) - { - status |= INODE_LIST_HAS_UNSTABLE; - } - lst->callback(lst, std::move(pg->objects), pg->pg_num, std::move(pg->inactive_osds), pg->errcode, status); + lst->callback(pg->errcode, lst->pgs.size()-lst->done_pgs, pg->pg_num, std::move(pg->objects), std::move(pg->inactive_osds)); + pg->objects.clear(); + pg->inactive_osds.clear(); } } diff --git a/src/cmd/cli_merge.cpp b/src/cmd/cli_merge.cpp index 60f6d97c..e6713c26 100644 --- a/src/cmd/cli_merge.cpp +++ b/src/cmd/cli_merge.cpp @@ -389,8 +389,8 @@ struct snap_merger_t if (lower ? (sp.second < target_rank) : (sp.second > target_rank)) { lists_todo++; - inode_list_t* lst = parent->cli->list_inode_start(src, parent->parallel_osds, [this, src]( - inode_list_t *lst, std::set&& objects, pg_num_t pg_num, std::vector && inactive_osds, int errcode, int status) + parent->cli->list_inode(src, parent->parallel_osds, [this, src]( + int errcode, int pgs_left, pg_num_t pg_num, std::set&& objects, std::vector && inactive_osds) { if (errcode) { @@ -416,7 +416,7 @@ struct snap_merger_t layer_list[pos++] = obj.stripe; } } - if (status & INODE_LIST_DONE) + if (!pgs_left) { auto & name = parent->cli->st_cli.inode_config.at(src).name; if (list_errcode.find(src) != list_errcode.end()) @@ -437,12 +437,7 @@ struct snap_merger_t lists_todo--; continue_merge_reent(); } - else - { - parent->cli->list_inode_next(lst); - } }); - parent->cli->list_inode_next(lst); } } } diff --git a/src/cmd/cli_rm_data.cpp b/src/cmd/cli_rm_data.cpp index 66f8c2b0..90b01b66 100644 --- a/src/cmd/cli_rm_data.cpp +++ b/src/cmd/cli_rm_data.cpp @@ -43,8 +43,16 @@ struct rm_inode_t void start_delete() { - lister = parent->cli->list_inode_start(inode, parent->parallel_osds, [this](inode_list_t *lst, - std::set&& objects, pg_num_t pg_num, std::vector && inactive_osds, int errcode, int status) + auto pool_it = parent->cli->st_cli.pool_config.find(pool_id); + if (pool_it == parent->cli->st_cli.pool_config.end()) + { + result = (cli_result_t){ .err = EINVAL, .text = "Pool does not exist" }; + state = 100; + return; + } + pgs_to_list = pool_it->second.real_pg_count; + parent->cli->list_inode(inode, parent->parallel_osds, [this]( + int errcode, int pgs_left, pg_num_t pg_num, std::set&& objects, std::vector && inactive_osds) { osd_num_t rm_osd_num = 0; auto pool_it = parent->cli->st_cli.pool_config.find(pool_id); @@ -93,34 +101,10 @@ struct rm_inode_t rm->obj_pos = rm->objects.begin(); lists.push_back(rm); } - if (parent->list_first && !(status & INODE_LIST_DONE)) - { - // The listing object is dead when DONE => don't call next() - parent->cli->list_inode_next(lister); - } - if (status & INODE_LIST_DONE) - { - lists_done = true; - pgs_to_list = 0; - } - else - { - pgs_to_list = parent->cli->list_pg_count(lister); - } + pgs_to_list = pgs_left; + lists_done = !pgs_to_list; continue_delete(); }); - if (!lister) - { - result = (cli_result_t){ - .err = EIO, - .text = "Failed to list objects of inode "+std::to_string(INODE_NO_POOL(inode))+ - " from pool "+std::to_string(INODE_POOL(inode)), - }; - state = 100; - return; - } - pgs_to_list = parent->cli->list_pg_count(lister); - parent->cli->list_inode_next(lister); } void send_ops(rm_pg_t *cur_list) @@ -220,10 +204,6 @@ struct rm_inode_t delete lists[i]; lists.erase(lists.begin()+i, lists.begin()+i+1); i--; - if (!lists_done) - { - parent->cli->list_inode_next(lister); - } } else { @@ -263,6 +243,10 @@ struct rm_inode_t } fprintf(stderr, "\n"); } + if (error_count > 0) + { + fprintf(stderr, "Failed to delete %u objects from active OSD(s).\n", error_count); + } json11::Json::array inactive_pgs_json; for (auto pg_num: inactive_pgs) { @@ -271,6 +255,7 @@ struct rm_inode_t json11::Json data = json11::Json::object { { "removed_objects", total_done }, { "total_objects", total_count }, + { "error_count", error_count }, { "inactive_osds", json11::Json::array(inactive_osds.begin(), inactive_osds.end()) }, { "inactive_pgs", inactive_pgs_json }, }; @@ -281,7 +266,7 @@ struct rm_inode_t // Error result = (cli_result_t){ .err = EIO, - .text = "Some blocks were not removed", + .text = "Failed: some blocks were not removed", .data = data, }; }