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/
76 lines
2.2 KiB
Lua
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
|