Files
scylladb/tools/scylla-sstable-scripts/largest-key.lua
Avi Kivity f3eade2f62 treewide: relicense to ScyllaDB-Source-Available-1.0
Drop the AGPL license in favor of a source-available license.
See the blog post [1] for details.

[1] https://www.scylladb.com/2024/12/18/why-were-moving-to-a-source-available-license/
2024-12-18 17:45:13 +02:00

76 lines
2.2 KiB
Lua

--
-- Copyright (C) 2024-present ScyllaDB
--
-- SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
--
-- Find the largest key in an sstable
--
-- Only partition and cluster keys are considered.
-- Example output -- a run on an sstable from system_schema.columns:
--
-- Largest key is of size 52, found in partition system
-- token: 2008276574632865675
-- raw partition key: 000673797374656d
-- mutation fragment kind: clustering-row
-- key: scylla_views_builds_in_progress:generation_number
-- raw key: 001f7363796c6c615f76696577735f6275696c64735f696e5f70726f6772657373001167656e65726174696f6e5f6e756d626572
current_partition = nil
largest_key = {
size=0,
partition=nil,
fragment_kind=nil,
raw=nil,
value=nil,
}
function handle_key(obj, fragment_kind)
raw_key = obj.key:to_hex()
key_size = raw_key:len() / 2 -- to_hex() converts each byte to 2 characters
if key_size <= largest_key.size then
return
end
largest_key.size = key_size
largest_key.partition = current_partition
largest_key.fragment_kind = fragment_kind
if obj.token then
largest_key.raw = nil
largest_key.value = nil
else
largest_key.raw = raw_key
largest_key.value = tostring(obj.key)
end
end
function consume_partition_start(ps)
current_partition = {token = ps.token, raw = ps.key:to_hex(), value = tostring(ps.key)}
handle_key(ps, "partition-start")
end
function consume_clustering_row(cr)
handle_key(cr, "clustering-row")
end
function consume_range_tombstone_change(crt)
if crt.key then
handle_key(crt, "range-tombstone-change")
end
end
function consume_stream_end()
print(string.format("Largest key is of size %d, found in partition %s",
largest_key.size,
largest_key.partition.value))
print(string.format("\ttoken: %s", largest_key.partition.token))
print(string.format("\traw partition key: %s", largest_key.partition.raw))
print(string.format("\tmutation fragment kind: %s", largest_key.fragment_kind))
if largest_key.raw and largest_key.value then
print(string.format("\tkey: %s", largest_key.value))
print(string.format("\traw key: %s", largest_key.raw))
end
end