diff options
author | mregrock <mregrock@ydb.tech> | 2025-06-04 11:40:29 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-04 11:40:29 +0300 |
commit | 7a1292073ea15b84131ec5554fb51dc81ffc9c5e (patch) | |
tree | f60aa0c4958fa666fcb4212528adc413cba8021b | |
parent | a23c183d91dba4c864fa6bc700228c9b429fa63b (diff) | |
download | ydb-7a1292073ea15b84131ec5554fb51dc81ffc9c5e.tar.gz |
Add dstool command for compaction (#19022)
-rw-r--r-- | ydb/apps/dstool/lib/commands.py | 6 | ||||
-rw-r--r-- | ydb/apps/dstool/lib/dstool_cmd_vdisk_compact.py | 72 | ||||
-rw-r--r-- | ydb/apps/dstool/lib/ya.make | 1 |
3 files changed, 76 insertions, 3 deletions
diff --git a/ydb/apps/dstool/lib/commands.py b/ydb/apps/dstool/lib/commands.py index e403b5c613a..cd4baf60728 100644 --- a/ydb/apps/dstool/lib/commands.py +++ b/ydb/apps/dstool/lib/commands.py @@ -13,6 +13,7 @@ import ydb.apps.dstool.lib.dstool_cmd_vdisk_list as vdisk_list import ydb.apps.dstool.lib.dstool_cmd_vdisk_set_read_only as vdisk_set_read_only import ydb.apps.dstool.lib.dstool_cmd_vdisk_remove_donor as vdisk_remove_donor import ydb.apps.dstool.lib.dstool_cmd_vdisk_wipe as vdisk_wipe +import ydb.apps.dstool.lib.dstool_cmd_vdisk_compact as vdisk_compact import ydb.apps.dstool.lib.dstool_cmd_group_add as group_add import ydb.apps.dstool.lib.dstool_cmd_group_check as group_check @@ -52,14 +53,13 @@ modules = [ group_check, group_decommit, group_show_blob_info, group_show_storage_efficiency, group_show_usage_by_tablets, group_state, group_take_snapshot, group_add, group_list, group_virtual_create, group_virtual_cancel, pdisk_add_by_serial, pdisk_remove_by_serial, pdisk_set, pdisk_list, pdisk_stop, pdisk_restart, pdisk_readonly, - vdisk_evict, vdisk_list, vdisk_set_read_only, vdisk_remove_donor, vdisk_wipe, - device_list, + vdisk_evict, vdisk_list, vdisk_set_read_only, vdisk_remove_donor, vdisk_wipe, vdisk_compact, device_list, ] default_structure = [ ('device', ['list']), ('pdisk', ['add-by-serial', 'remove-by-serial', 'set', 'list', 'stop', 'restart', 'readonly']), - ('vdisk', ['evict', 'list', 'set-read-only', 'remove-donor', 'wipe']), + ('vdisk', ['evict', 'list', 'set-read-only', 'remove-donor', 'wipe', 'compact']), ('group', ['add', 'check', 'decommit', ('show', ['blob-info', 'storage-efficiency', 'usage-by-tablets']), 'state', 'take-snapshot', 'list', ('virtual', ['create', 'cancel'])]), ('pool', ['list', ('create', ['virtual'])]), ('box', ['list']), diff --git a/ydb/apps/dstool/lib/dstool_cmd_vdisk_compact.py b/ydb/apps/dstool/lib/dstool_cmd_vdisk_compact.py new file mode 100644 index 00000000000..85acd9480ca --- /dev/null +++ b/ydb/apps/dstool/lib/dstool_cmd_vdisk_compact.py @@ -0,0 +1,72 @@ +import ydb.apps.dstool.lib.common as common +import sys + +description = 'Run compaction on vdisks' + + +def add_options(p): + common.add_vdisk_ids_option(p, required=True) + p.add_argument('--full', action='store_true', default=False, + help='Run full compaction') + p.add_argument('--compact-logoblobs', action='store_true', default=False, + help='Compact LogoBlobs') + p.add_argument('--compact-blocks', action='store_true', default=False, + help='Compact Blocks') + p.add_argument('--compact-barriers', action='store_true', default=False, + help='Compact Barriers') + common.add_basic_format_options(p) + + +def do(args): + base_config = common.fetch_base_config() + vslots = common.get_vslots_by_vdisk_ids(base_config, args.vdisk_ids) + + success_count = 0 + error_count = 0 + + for vslot in vslots: + vdisk_id = '[%08x:%u:%u:%u:%u]' % (vslot.GroupId, vslot.GroupGeneration, vslot.FailRealmIdx, vslot.FailDomainIdx, vslot.VDiskIdx) + node_id = vslot.VSlotId.NodeId + pdisk_id = vslot.VSlotId.PDiskId + vslot_id = vslot.VSlotId.VSlotId + + if args.full: + dbnames = ['LogoBlobs', 'Blocks', 'Barriers'] + else: + dbnames = [] + if args.compact_logoblobs: + dbnames.append('LogoBlobs') + if args.compact_blocks: + dbnames.append('Blocks') + if args.compact_barriers: + dbnames.append('Barriers') + if not dbnames: + dbnames = ['LogoBlobs'] + + vdisk_success = True + for dbname in dbnames: + path = f'node/{node_id}/actors/vdisks/vdisk{pdisk_id:09d}_{vslot_id:09d}' + params = { + 'type': 'dbmainpage', + 'dbname': dbname, + 'action': 'compact' + } + try: + common.fetch(path, params, fmt='raw') + except Exception as e: + common.print_if_not_quiet(args, f"Failed to send compaction request to VDisk {vdisk_id} for {dbname}: {e}") + vdisk_success = False + + if vdisk_success: + success_count += 1 + else: + error_count += 1 + + if success_count > 0 and error_count == 0: + common.print_status(args, success=True, error_reason=f"Successfully processed {success_count} VDisk(s)") + elif success_count == 0 and error_count > 0: + common.print_status(args, success=False, error_reason=f"Failed to process {error_count} VDisk(s)") + sys.exit(1) + else: + common.print_status(args, success=False, error_reason=f"Processed {success_count} VDisk(s) successfully, failed to process {error_count} VDisk(s)") + sys.exit(1) diff --git a/ydb/apps/dstool/lib/ya.make b/ydb/apps/dstool/lib/ya.make index 0a4c190ab24..b684d4fb6b6 100644 --- a/ydb/apps/dstool/lib/ya.make +++ b/ydb/apps/dstool/lib/ya.make @@ -24,6 +24,7 @@ PY_SRCS( dstool_cmd_vdisk_set_read_only.py dstool_cmd_vdisk_remove_donor.py dstool_cmd_vdisk_wipe.py + dstool_cmd_vdisk_compact.py dstool_cmd_group_add.py dstool_cmd_group_check.py |