Remove separate list_inode_next()

This commit is contained in:
Vitaliy Filippov
2025-01-01 14:19:18 +03:00
parent c8decb32e8
commit 80dda3ca94
4 changed files with 34 additions and 80 deletions
+2 -6
View File
@@ -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<void(
inode_list_t* lst, std::set<object_id>&& objects, pg_num_t pg_num, std::vector<osd_num_t> && 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<void(
int status, int pgs_left, pg_num_t pg_num, std::set<object_id>&& objects, std::vector<osd_num_t> && 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; }
+11 -33
View File
@@ -52,43 +52,28 @@ struct inode_list_t
int onstack = 0;
std::vector<inode_list_pg_t*> pgs;
pg_num_t real_pg_count = 0;
std::function<void(inode_list_t* lst, std::set<object_id>&& objects, pg_num_t pg_num, std::vector<osd_num_t> && inactive_osds, int errcode, int status)> callback;
std::function<void(int status, int pgs_left, pg_num_t pg_num, std::set<object_id>&& objects, std::vector<osd_num_t> && inactive_osds)> callback;
};
inode_list_t* cluster_client_t::list_inode_start(inode_t inode, int max_parallel_pgs, std::function<void(
inode_list_t* lst, std::set<object_id>&& objects, pg_num_t pg_num, std::vector<osd_num_t> && inactive_osds, int errcode, int status)> callback)
void cluster_client_t::list_inode(inode_t inode, int max_parallel_pgs, std::function<void(
int status, int pgs_left, pg_num_t pg_num, std::set<object_id>&& objects, std::vector<osd_num_t> && 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<object_id>(), std::vector<osd_num_t>());
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<object_id>(), 0, std::vector<osd_num_t>(), -EINVAL, INODE_LIST_DONE);
lst->callback(-EINVAL, 0, 0, std::set<object_id>(), std::vector<osd_num_t>());
return false;
}
else if (lst->done_pgs)
{
// PG count changed during listing, it should fail
lst->callback(lst, std::set<object_id>(), 0, std::vector<osd_num_t>(), -EAGAIN, INODE_LIST_DONE);
lst->callback(-EAGAIN, 0, 0, std::set<object_id>(), std::vector<osd_num_t>());
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();
}
}
+3 -8
View File
@@ -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<object_id>&& objects, pg_num_t pg_num, std::vector<osd_num_t> && 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<object_id>&& objects, std::vector<osd_num_t> && 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);
}
}
}
+18 -33
View File
@@ -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<object_id>&& objects, pg_num_t pg_num, std::vector<osd_num_t> && 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<object_id>&& objects, std::vector<osd_num_t> && 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,
};
}