From 20fbc4a74547b8bcd94c01bb8ba6d2d28419504c Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sun, 7 Apr 2024 12:39:46 +0300 Subject: [PATCH] Add --pg parameter to vitastor-cli describe, print objects with 0x in human-readable format too --- docs/usage/cli.en.md | 8 ++++---- docs/usage/cli.ru.md | 8 ++++---- src/cli.cpp | 6 ++++-- src/cli_describe.cpp | 10 +++++++--- src/osd_ops.h | 3 +++ src/osd_primary_describe.cpp | 14 +++++++++++++- 6 files changed, 35 insertions(+), 14 deletions(-) diff --git a/docs/usage/cli.en.md b/docs/usage/cli.en.md index a53b1f72..a08899bc 100644 --- a/docs/usage/cli.en.md +++ b/docs/usage/cli.en.md @@ -186,11 +186,9 @@ Merge layer data without changing metadata. Merge ``..`` to `` ## describe -`vitastor-cli describe [--osds ] [--object-state ] [--pool ] - [--inode ] [--min-inode ] [--max-inode ] - [--min-offset ] [--max-offset ]` +`vitastor-cli describe [OPTIONS]` -Describe unclean object locations in the cluster. +Describe unclean object locations in the cluster. Options: ``` --osds @@ -200,6 +198,8 @@ Describe unclean object locations in the cluster. degraded, misplaced, incomplete, corrupted, inconsistent. --pool Only list objects in the given pool. +--pg + Only list objects in the given PG of the pool. --inode, --min-inode, --max-inode Restrict listing to specific inode numbers. --min-offset, --max-offset diff --git a/docs/usage/cli.ru.md b/docs/usage/cli.ru.md index 73b34bbb..55b758ff 100644 --- a/docs/usage/cli.ru.md +++ b/docs/usage/cli.ru.md @@ -194,12 +194,10 @@ vitastor-cli snap-create [-p|--pool ] @ ## describe -`vitastor-cli describe [--osds ] [--object-state <состояния>] [--pool <пул>] - [--inode <номер>] [--min-inode <номер>] [--max-inode <номер>] - [--min-offset <смещение>] [--max-offset <смещение>]` +`vitastor-cli describe [ОПЦИИ]` Описать состояние "грязных" объектов в кластере, то есть таких объектов, копии -или части которых хранятся на наборе OSD, не равном целевому. +или части которых хранятся на наборе OSD, не равном целевому. Опции: ``` --osds @@ -214,6 +212,8 @@ vitastor-cli snap-create [-p|--pool ] @ - inconsistent - неконсистентный, с неоднозначным расхождением копий/частей --pool <имя или ID пула> Перечислять только объекты из заданного пула. +--pg <номер PG> + Перечислять только объекты из заданной PG пула. --inode, --min-inode, --max-inode Перечислять только объекты из указанных номеров инодов (образов). --min-offset, --max-offset diff --git a/src/cli.cpp b/src/cli.cpp index 087d3d81..dc58e0ac 100644 --- a/src/cli.cpp +++ b/src/cli.cpp @@ -76,8 +76,8 @@ static const char* help_text = " must be a child of and may be one of the layers between\n" " and , including and .\n" "\n" - "vitastor-cli describe [--osds ] [--object-state ] [--pool ] [--inode ] [--min-inode ] [--max-inode ] [--min-offset ] [--max-offset ]\n" - " Describe unclean object locations in the cluster.\n" + "vitastor-cli describe [OPTIONS]\n" + " Describe unclean object locations in the cluster. Options:\n" " --osds \n" " Only list objects from primary OSD(s) .\n" " --object-state \n" @@ -85,6 +85,8 @@ static const char* help_text = " degraded, misplaced, incomplete, corrupted, inconsistent.\n" " --pool \n" " Only list objects in the given pool.\n" + " --pg \n" + " Only list objects in the given PG of the pool.\n" " --inode, --min-inode, --max-inode\n" " Restrict listing to specific inode numbers.\n" " --min-offset, --max-offset\n" diff --git a/src/cli_describe.cpp b/src/cli_describe.cpp index 71bd9db1..a15c94fb 100644 --- a/src/cli_describe.cpp +++ b/src/cli_describe.cpp @@ -37,6 +37,7 @@ struct cli_describe_t { uint64_t object_state = 0; pool_id_t only_pool = 0; + pg_num_t only_pg = 0; std::vector only_osds; uint64_t min_inode = 0, max_inode = 0; uint64_t min_offset = 0, max_offset = 0; @@ -68,6 +69,7 @@ struct cli_describe_t } } } + only_pg = cfg["pg"].uint64_value(); min_inode = cfg["inode"].uint64_value(); if (min_inode) { @@ -142,8 +144,8 @@ struct cli_describe_t { osd_op_t *op = new osd_op_t; op->req = (osd_any_op_t){ - .describe = { - .header = { + .describe = (osd_op_describe_t){ + .header = (osd_op_header_t){ .magic = SECONDARY_OSD_OP_MAGIC, .id = parent->cli->next_op_id(), .opcode = OSD_OP_DESCRIBE, @@ -153,6 +155,8 @@ struct cli_describe_t .min_offset = min_offset, .max_inode = max_inode, .max_offset = max_offset, + .pool_id = only_pool, + .pg_num = only_pg, }, }; op->callback = [this, osd_num = only_osds[i]](osd_op_t *op) @@ -182,7 +186,7 @@ struct cli_describe_t printf( (parent->json_output ? (count > 0 ? ",\n " FMT : " " FMT) - : "%jx:%jx part %u on OSD %ju%s%s%s\n"), + : "0x%jx:0x%jx part %u on OSD %ju%s%s%s\n"), #undef FMT items[i].inode, items[i].stripe, items[i].role, items[i].osd_num, diff --git a/src/osd_ops.h b/src/osd_ops.h index 6cadead0..9fd7be9a 100644 --- a/src/osd_ops.h +++ b/src/osd_ops.h @@ -258,6 +258,9 @@ struct __attribute__((__packed__)) osd_op_describe_t uint64_t max_inode, max_offset; // limit uint64_t limit; + // pool and PG + uint32_t pool_id; + uint32_t pg_num; }; struct __attribute__((__packed__)) osd_reply_describe_t diff --git a/src/osd_primary_describe.cpp b/src/osd_primary_describe.cpp index b259975b..1fce43ab 100644 --- a/src/osd_primary_describe.cpp +++ b/src/osd_primary_describe.cpp @@ -95,7 +95,19 @@ void osd_t::continue_primary_describe(osd_op_t *cur_op) if (!desc.object_state) desc.object_state = ~desc.object_state; std::vector lists; - for (auto pg_it = pgs.begin(); pg_it != pgs.end(); pg_it++) + auto pg_first = pgs.begin(); + auto pg_last = pgs.end(); + if (desc.pool_id && desc.pg_num) + { + pg_first = pgs.find((pool_pg_num_t){ .pool_id = desc.pool_id, .pg_num = desc.pg_num }); + pg_last = pg_first != pgs.end() ? std::next(pg_first) : pgs.end(); + } + else if (desc.pool_id) + { + pg_first = pgs.lower_bound((pool_pg_num_t){ .pool_id = desc.pool_id }); + pg_last = pgs.lower_bound((pool_pg_num_t){ .pool_id = desc.pool_id+1 }); + } + for (auto pg_it = pg_first; pg_it != pg_last; pg_it++) { auto & pg = pg_it->second; if (desc.object_state & OBJ_INCONSISTENT)