aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormregrock <mregrock@ydb.tech>2025-06-04 11:40:29 +0300
committerGitHub <noreply@github.com>2025-06-04 11:40:29 +0300
commit7a1292073ea15b84131ec5554fb51dc81ffc9c5e (patch)
treef60aa0c4958fa666fcb4212528adc413cba8021b
parenta23c183d91dba4c864fa6bc700228c9b429fa63b (diff)
downloadydb-7a1292073ea15b84131ec5554fb51dc81ffc9c5e.tar.gz
Add dstool command for compaction (#19022)
-rw-r--r--ydb/apps/dstool/lib/commands.py6
-rw-r--r--ydb/apps/dstool/lib/dstool_cmd_vdisk_compact.py72
-rw-r--r--ydb/apps/dstool/lib/ya.make1
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