Merge 'scylla-gdb.py: introduce scylla tablet-metadata command' from Botond Dénes
Dumps the content of the tablet metadata. Very useful for debugging tablet related problems. Example output: ``` (gdb) scylla tablet-metadata --table usertable_no_lwt This node: host_id: b90662a9-98b1-4452-bc45-44d460ecab62, shard: 0 table alternator_usertable_no_lwt.usertable_no_lwt: id: 68316fa0-78ec-11ef-af10-98d4ab71aac4, tablets: 32, resize decision: merge#1, transitions: 0 tablet#0: last token: -8646911284551352321, replicas: [b5ddcd7e-45ed-4f20-8841-353bd82cc04c#0, 84d0cb45-1c6c-4870-b727-03db3130641f#0, b933959e-8134-4ba0-8c44-33dbd51170e9#0] tablet#1: last token: -8070450532247928833, replicas: [fb0167dc-7a7d-476d-b4a5-4a55a52dadff#0, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#0, ac2fdd20-2f54-4960-9856-27fd07ed38ef#0] tablet#2: last token: -7493989779944505345, replicas: [fb0167dc-7a7d-476d-b4a5-4a55a52dadff#1, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#1, b5ddcd7e-45ed-4f20-8841-353bd82cc04c#1] tablet#3: last token: -6917529027641081857, replicas: [ac2fdd20-2f54-4960-9856-27fd07ed38ef#1, b933959e-8134-4ba0-8c44-33dbd51170e9#1, 84d0cb45-1c6c-4870-b727-03db3130641f#1] tablet#4: last token: -6341068275337658369, replicas: [ac2fdd20-2f54-4960-9856-27fd07ed38ef#2, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#2, b5ddcd7e-45ed-4f20-8841-353bd82cc04c#2] tablet#5: last token: -5764607523034234881, replicas: [4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#2, b933959e-8134-4ba0-8c44-33dbd51170e9#2, 84d0cb45-1c6c-4870-b727-03db3130641f#2] tablet#6: last token: -5188146770730811393, replicas: [84d0cb45-1c6c-4870-b727-03db3130641f#3, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#3, ac2fdd20-2f54-4960-9856-27fd07ed38ef#3] tablet#7: last token: -4611686018427387905, replicas: [b5ddcd7e-45ed-4f20-8841-353bd82cc04c#3, b933959e-8134-4ba0-8c44-33dbd51170e9#3, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#3] tablet#8: last token: -4035225266123964417, replicas: [b933959e-8134-4ba0-8c44-33dbd51170e9#4, b5ddcd7e-45ed-4f20-8841-353bd82cc04c#4, ac2fdd20-2f54-4960-9856-27fd07ed38ef#4] tablet#9: last token: -3458764513820540929, replicas: [4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#4, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#4, 84d0cb45-1c6c-4870-b727-03db3130641f#4] tablet#10: last token: -2882303761517117441, replicas: [84d0cb45-1c6c-4870-b727-03db3130641f#5, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#5, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#5] tablet#11: last token: -2305843009213693953, replicas: [ac2fdd20-2f54-4960-9856-27fd07ed38ef#5, b5ddcd7e-45ed-4f20-8841-353bd82cc04c#5, b933959e-8134-4ba0-8c44-33dbd51170e9#5] tablet#12: last token: -1729382256910270465, replicas: [b933959e-8134-4ba0-8c44-33dbd51170e9#6, b5ddcd7e-45ed-4f20-8841-353bd82cc04c#6, 84d0cb45-1c6c-4870-b727-03db3130641f#6] tablet#13: last token: -1152921504606846977, replicas: [4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#6, ac2fdd20-2f54-4960-9856-27fd07ed38ef#6, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#6] tablet#14: last token: -576460752303423489, replicas: [b5ddcd7e-45ed-4f20-8841-353bd82cc04c#7, 84d0cb45-1c6c-4870-b727-03db3130641f#7, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#7] tablet#15: last token: -1, replicas: [b933959e-8134-4ba0-8c44-33dbd51170e9#7, ac2fdd20-2f54-4960-9856-27fd07ed38ef#7, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#7] tablet#16: last token: 576460752303423487, replicas: [ac2fdd20-2f54-4960-9856-27fd07ed38ef#8, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#8, 84d0cb45-1c6c-4870-b727-03db3130641f#8] tablet#17: last token: 1152921504606846975, replicas: [b933959e-8134-4ba0-8c44-33dbd51170e9#8, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#8, b5ddcd7e-45ed-4f20-8841-353bd82cc04c#8] tablet#18: last token: 1729382256910270463, replicas: [b5ddcd7e-45ed-4f20-8841-353bd82cc04c#9, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#9, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#9] tablet#19: last token: 2305843009213693951, replicas: [84d0cb45-1c6c-4870-b727-03db3130641f#9, ac2fdd20-2f54-4960-9856-27fd07ed38ef#9, b933959e-8134-4ba0-8c44-33dbd51170e9#9] tablet#20: last token: 2882303761517117439, replicas: [ac2fdd20-2f54-4960-9856-27fd07ed38ef#10, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#10, b933959e-8134-4ba0-8c44-33dbd51170e9#10] tablet#21: last token: 3458764513820540927, replicas: [84d0cb45-1c6c-4870-b727-03db3130641f#10, b5ddcd7e-45ed-4f20-8841-353bd82cc04c#10, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#10] tablet#22: last token: 4035225266123964415, replicas: [4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#11, 84d0cb45-1c6c-4870-b727-03db3130641f#11, b933959e-8134-4ba0-8c44-33dbd51170e9#11] tablet#23: last token: 4611686018427387903, replicas: [b5ddcd7e-45ed-4f20-8841-353bd82cc04c#11, ac2fdd20-2f54-4960-9856-27fd07ed38ef#11, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#11] tablet#24: last token: 5188146770730811391, replicas: [b5ddcd7e-45ed-4f20-8841-353bd82cc04c#12, 84d0cb45-1c6c-4870-b727-03db3130641f#12, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#12] tablet#25: last token: 5764607523034234879, replicas: [ac2fdd20-2f54-4960-9856-27fd07ed38ef#12, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#12, b933959e-8134-4ba0-8c44-33dbd51170e9#12] tablet#26: last token: 6341068275337658367, replicas: [b5ddcd7e-45ed-4f20-8841-353bd82cc04c#13, b933959e-8134-4ba0-8c44-33dbd51170e9#13, 84d0cb45-1c6c-4870-b727-03db3130641f#13] tablet#27: last token: 6917529027641081855, replicas: [ac2fdd20-2f54-4960-9856-27fd07ed38ef#13, fb0167dc-7a7d-476d-b4a5-4a55a52dadff#13, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#13] tablet#28: last token: 7493989779944505343, replicas: [b5ddcd7e-45ed-4f20-8841-353bd82cc04c#0, b933959e-8134-4ba0-8c44-33dbd51170e9#0, ac2fdd20-2f54-4960-9856-27fd07ed38ef#0] tablet#29: last token: 8070450532247928831, replicas: [fb0167dc-7a7d-476d-b4a5-4a55a52dadff#0, 84d0cb45-1c6c-4870-b727-03db3130641f#0, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#0] tablet#30: last token: 8646911284551352319, replicas: [fb0167dc-7a7d-476d-b4a5-4a55a52dadff#1, ac2fdd20-2f54-4960-9856-27fd07ed38ef#1, b5ddcd7e-45ed-4f20-8841-353bd82cc04c#1] tablet#31: last token: 9223372036854775807, replicas: [b933959e-8134-4ba0-8c44-33dbd51170e9#1, 4b1e8a42-e8b3-432e-bf7c-b0f7a10eb3cd#1, 84d0cb45-1c6c-4870-b727-03db3130641f#1] ``` The PR includes two marginally related small fixes too. Improvement, no backport needed. Closes scylladb/scylladb#20940 * github.com:scylladb/scylladb: scylla-gdb.py: add scylla tablet-metadata command scylla-gdb.py: register the scylla table command scylla-gdb.py: unordered_map: improve flat_hash_map matching
This commit is contained in:
@@ -651,7 +651,7 @@ class absl_container:
|
||||
|
||||
|
||||
def unordered_map(ref):
|
||||
if ref.type.name.startswith('flat_hash_map'):
|
||||
if ref.type.strip_typedefs().name.startswith('flat_hash_map'):
|
||||
try:
|
||||
return flat_hash_map(ref)
|
||||
except gdb.error:
|
||||
@@ -6109,6 +6109,94 @@ class scylla_repairs(gdb.Command):
|
||||
for rm in intrusive_list(gdb.parse_and_eval('debug::repair_meta_for_followers._repair_metas'), link='_tracker_link'):
|
||||
self.process("follower", rm)
|
||||
|
||||
|
||||
class scylla_tablet_metadata(gdb.Command):
|
||||
"""Dump tablet-metadata
|
||||
|
||||
By default, tablet-metadata is dumped for all tables.
|
||||
Tables can be filtered by --keyspace and --table.
|
||||
For more information about usage, see:
|
||||
scylla tablet-metadata --help
|
||||
"""
|
||||
_token_bias = 9223372036854775808
|
||||
_max_uint64 = 18446744073709551615
|
||||
|
||||
def _bias(self, n):
|
||||
return n - self._token_bias
|
||||
|
||||
def _last_token_of_compaction_group(self, most_significant_bits, group):
|
||||
if group == ((1 << most_significant_bits) - 1):
|
||||
return self._bias(self._max_uint64)
|
||||
else:
|
||||
return self._bias(((group + 1) << (64 - most_significant_bits)) - 1);
|
||||
|
||||
def __init__(self):
|
||||
gdb.Command.__init__(self, 'scylla tablet-metadata', gdb.COMMAND_USER, gdb.COMPLETE_NONE, True)
|
||||
|
||||
def invoke(self, arg, for_tty):
|
||||
parser = argparse.ArgumentParser(description="scylla tablet-metadata")
|
||||
parser.add_argument("-k", "--keyspace", action="store", type=str,
|
||||
help="Print tablet metadata for tables belonging to the given keyspace")
|
||||
parser.add_argument("-t", "--table", action="store", type=str,
|
||||
help="Print tablet metadata for the given table only (match by name, use together with --keyspace for an exact match)")
|
||||
|
||||
try:
|
||||
args = parser.parse_args(arg.split())
|
||||
except SystemExit:
|
||||
return
|
||||
|
||||
db = find_db()
|
||||
token_metadata = seastar_lw_shared_ptr(db['_shared_token_metadata']['_shared']).get()
|
||||
tablet_metadata = std_unique_ptr(token_metadata['_impl']).get()['_tablets']
|
||||
topology = std_unique_ptr(token_metadata['_impl']).get()['_topology']
|
||||
this_node = topology['_this_node'].dereference()
|
||||
|
||||
gdb.write(f'This node: host_id: {this_node["_host_id"]["id"]}, shard: {current_shard()}\n\n')
|
||||
|
||||
def format_replica_set(replica_set):
|
||||
return ", ".join([f'{replica["host"]["id"]}#{replica["shard"]}' for replica in small_vector(replica_set)])
|
||||
|
||||
tables = {}
|
||||
for table in for_each_table(db):
|
||||
schema = seastar_lw_shared_ptr(table['_schema']).get().dereference()
|
||||
r = schema['_raw']
|
||||
tables[str(r['_id']['id'])] = (str(r['_ks_name'])[1:-1], str(r['_cf_name'])[1:-1])
|
||||
|
||||
for table_id, tablet_map in unordered_map(tablet_metadata['_tablets']):
|
||||
table_id = str(table_id['id'])
|
||||
keyspace_name, table_name = tables[table_id]
|
||||
|
||||
if args.keyspace and keyspace_name != args.keyspace:
|
||||
continue
|
||||
|
||||
if args.table and table_name != args.table:
|
||||
continue
|
||||
|
||||
tablet_map = seastar_lw_shared_ptr(tablet_map['_value']).get()
|
||||
log2_tablets = int(tablet_map['_log2_tablets'])
|
||||
tablet_count = 2 ** log2_tablets
|
||||
resize_decision = std_variant(tablet_map['_resize_decision']['way']).get().type.name.replace('locator::resize_decision::', '')
|
||||
resize_decision_seq_num = int(tablet_map['_resize_decision']['sequence_number'])
|
||||
|
||||
tablet_transitions = {int(tablet_id['id']): transition_info
|
||||
for tablet_id, transition_info in unordered_map(tablet_map['_transitions'])}
|
||||
|
||||
gdb.write(f'table {keyspace_name}.{table_name}: id: {table_id}, tablets: {tablet_count}, resize decision: {resize_decision}#{resize_decision_seq_num}, transitions: {len(tablet_transitions)}\n')
|
||||
|
||||
for tablet_id, tablet_info in enumerate(chunked_vector(tablet_map['_tablets'])):
|
||||
last_token = self._last_token_of_compaction_group(log2_tablets, tablet_id)
|
||||
replicas = format_replica_set(tablet_info['replicas'])
|
||||
gdb.write(f' tablet#{tablet_id}: last token: {last_token}, replicas: [{replicas}]\n')
|
||||
if tablet_id in tablet_transitions:
|
||||
t = tablet_transitions[tablet_id]
|
||||
gdb.write(' transition: stage: {}, kind: {}, next: {}, pending_replica: {}, session_id: {}\n'.format(
|
||||
t['stage'],
|
||||
t['transition'],
|
||||
format_replica_set(t['next']),
|
||||
t['pending_replica'],
|
||||
t['session_id']))
|
||||
|
||||
|
||||
class scylla_gdb_func_collection_element(gdb.Function):
|
||||
"""Return the element at the specified index/key from the container.
|
||||
|
||||
@@ -6270,6 +6358,7 @@ scylla_databases()
|
||||
scylla_commitlog()
|
||||
scylla_keyspaces()
|
||||
scylla_tables()
|
||||
scylla_table()
|
||||
scylla_memory()
|
||||
scylla_ptr()
|
||||
scylla_mem_ranges()
|
||||
@@ -6314,6 +6403,7 @@ scylla_get_config_value()
|
||||
scylla_range_tombstones()
|
||||
scylla_sstable_promoted_index()
|
||||
scylla_sstable_dump_cached_index()
|
||||
scylla_tablet_metadata()
|
||||
|
||||
|
||||
# Convenience functions
|
||||
|
||||
@@ -36,6 +36,9 @@ def test_tables(gdb):
|
||||
def test_table(gdb):
|
||||
scylla(gdb, 'table system.local')
|
||||
|
||||
def test_tablet_metadata(gdb):
|
||||
scylla(gdb, 'tablet-metadata')
|
||||
|
||||
def test_keyspaces(gdb):
|
||||
scylla(gdb, 'keyspaces')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user