Skip to documentation
SLOP

tiny.trace.store.format.database

Reference tiny.trace store format database

Defined in store.format.

API (14)

Actions

Public operations.

Types and contracts

Public types and contracts.

Values and defaults

Public values and defaults.

No direct callersNo direct callsstore.formatdatabase
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Called byCallsNo direct callstest sourcelib.sql.src.filetest: file checkpoints stream prepare...test sourcelib.sql.src.filetest: file database checkpoint after ...test sourcelib.sql.src.filetest: file database checkpoint restar...test sourcelib.sql.src.filetest: file database checkpoint rewrit...test sourcelib.sql.src.filetest: file database owns paths needed...+22 morestore.format.databasecheckpoint
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsprivate sourcelib.trace.src.store.writer.writer.WriterflushBlockstore.format.databasecheckpointstore.format.databasecheckpointIfNeeded
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsNo direct callsTraceReaderopenTraceWriteropenstore.format.databaseevents
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsTraceReaderopenprivate; no linktools.smg.src.storage.storereadStoreprivate sourcelib.trace.src.store.format.databaseopenstore.format.databaseopenReader
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsTraceWriteropenprivate sourcelib.trace.src.store.format.databaseopenstore.format.databaseopenWriter
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.trace.src.store.format.databasetest: SQL trace capacity covers exact...TraceReaderCapacityderiveprivate sourcelib.trace.src.store.format.databasecapacitystore.format.databasereaderCapacity
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.trace.src.store.format.databasetest: SQL trace sequence keys preserv...private sourcelib.trace.src.store.reader.stream.ReaderloadBlockTraceReaderpeekTraceWriterappendprivate sourcelib.trace.src.store.writer.writer.WriterflushBlockstore.format.databasesequenceKey
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsTraceReaderpeekTraceWriterappendstore.format.databaseupdateChecksum
Static calls · unresolved targets: 1 · external targets: 0.
Called byCallsNo direct callstest sourcelib.trace.src.store.format.databasetest: SQL trace capacity covers exact...TraceReaderopenTraceWriteropenstore.format.databaseworkspaceLimits
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.trace.src.store.format.databasetest: SQL trace capacity covers exact...TraceWriterCapacityderiveprivate sourcelib.trace.src.store.format.databasecapacityprivate sourcelib.trace.src.store.format.databasedivideRoundUpstore.format.databasewriterCapacity
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/trace/src/store/format/database.zig

zig
const std = @import("std");const sql = @import("sql");pub const file_name = "events.sql";pub const wal_file_name = "events.sql.wal";pub const key_bytes: usize = 8;const root_page: u32 = 2;const identity_page: u32 = 3;const checkpoint_target_frames: usize = 256;const tree_frame_overhead: usize = 68;const heap_reserve_bytes: usize = 64 * 1024;const header = sql.wal.Header{    .sequence = 0x5452_4345,    .salt = .{ .first = 0x5452_4345, .second = 0x5351_4c31 },};pub const Capacity = struct {    wal_frames: usize,    wal_bytes: usize,    heap_bytes: usize,};pub fn writerCapacity(max_value_bytes: usize) error{CapacityOverflow}!Capacity {    const overflow_frames = divideRoundUp(max_value_bytes, sql.page.overflow_capacity);    const value_frames = std.math.add(usize, overflow_frames, tree_frame_overhead) catch        return error.CapacityOverflow;    const wal_frames = std.math.add(usize, checkpoint_target_frames, value_frames) catch        return error.CapacityOverflow;    return try capacity(wal_frames);}pub fn readerCapacity() error{CapacityOverflow}!Capacity {    return try capacity(1);}pub fn workspaceLimits(storage: Capacity) sql.FileDatabase.Workspace.Limits {    return .{        .header = header,        .max_wal_bytes = storage.wal_bytes,        .path_storage = .{            .database_bytes = file_name.len,            .wal_bytes = wal_file_name.len,        },        .read_cache_pages = 0,    };}pub fn openWriter(    allocator: std.mem.Allocator,    workspace: *sql.FileDatabase.Workspace,    root_path: []const u8,    storage: Capacity,) !sql.FileDatabase {    return try open(allocator, workspace, root_path, storage, true);}pub fn openReader(    allocator: std.mem.Allocator,    workspace: *sql.FileDatabase.Workspace,    root_path: []const u8,    storage: Capacity,) !sql.FileDatabase {    return try open(allocator, workspace, root_path, storage, false);}pub fn events(file: *sql.FileDatabase) !sql.Tree {    return try sql.Tree.open(file, .{        .root_page = root_page,        .identity_page = identity_page,        .reserved_page_max = identity_page,    });}pub fn checkpoint(file: *sql.FileDatabase) !void {    _ = try file.checkpoint(.{ .restart_header = header });}pub fn checkpointIfNeeded(file: *sql.FileDatabase) !void {    const bytes = sql.lifecycle.walSize(file);    std.debug.assert(bytes >= sql.wal.header_size);    const frames = (bytes - sql.wal.header_size) / sql.wal.frame_size;    if (frames >= checkpoint_target_frames) try checkpoint(file);}pub fn sequenceKey(buffer: *[key_bytes]u8, sequence: u64) []const u8 {    std.mem.writeInt(u64, buffer, sequence, .big);    return buffer;}pub fn updateChecksum(hasher: *std.hash.Wyhash, key: []const u8, value: []const u8) void {    std.debug.assert(key.len == key_bytes);    hasher.update(key);    hasher.update(value);}fn open(    allocator: std.mem.Allocator,    workspace: *sql.FileDatabase.Workspace,    root_path: []const u8,    storage: Capacity,    writable: bool,) !sql.FileDatabase {    var dir = try std.Io.Dir.openDirAbsolute(std.Options.debug_io, root_path, .{});    defer dir.close(std.Options.debug_io);    return try sql.FileDatabase.open(allocator, workspace, dir, .{        .paths = .{ .database = file_name, .wal = wal_file_name },        .header = header,        .max_wal_bytes = storage.wal_bytes,        .wal_capacity_bytes = storage.wal_bytes,        .read_cache_capacity = 0,        .write_capacity = if (writable)            .{ .wal_frames = storage.wal_frames, .wal_pages = storage.wal_frames }        else            .{},    });}fn capacity(wal_frames: usize) error{CapacityOverflow}!Capacity {    const wal_capacity = try sql.wal.Writer.Capacity.derive(.{        .header = header,        .frames = wal_frames,    });    const tripled = std.math.mul(usize, wal_capacity.storage_bytes, 3) catch return error.CapacityOverflow;    const heap_bytes = std.math.add(usize, tripled, heap_reserve_bytes) catch return error.CapacityOverflow;    return .{        .wal_frames = wal_frames,        .wal_bytes = wal_capacity.storage_bytes,        .heap_bytes = heap_bytes,    };}fn divideRoundUp(numerator: usize, denominator: usize) usize {    std.debug.assert(denominator != 0);    return numerator / denominator + @intFromBool(numerator % denominator != 0);}test "SQL trace capacity covers exact WAL and workspace storage" {    const max_value_bytes: usize = 4 * 1024 * 1024;    const derived = try writerCapacity(max_value_bytes);    const overflow_frames = divideRoundUp(max_value_bytes, sql.page.overflow_capacity);    const value_frames = overflow_frames + tree_frame_overhead;    try std.testing.expectEqual(checkpoint_target_frames + value_frames, derived.wal_frames);    const expected_wal_bytes = sql.wal.header_size + derived.wal_frames * sql.wal.frame_size;    try std.testing.expectEqual(expected_wal_bytes, derived.wal_bytes);    try std.testing.expectEqual(expected_wal_bytes * 3 + heap_reserve_bytes, derived.heap_bytes);    const writer_workspace = try sql.FileDatabase.Workspace.Capacity.derive(        workspaceLimits(derived),    );    try std.testing.expect(writer_workspace.requested_bytes <= derived.heap_bytes);    const reader = try readerCapacity();    const reader_limits = workspaceLimits(reader);    try std.testing.expectEqual(@as(usize, 0), reader_limits.read_cache_pages);    const reader_workspace = try sql.FileDatabase.Workspace.Capacity.derive(reader_limits);    try std.testing.expect(reader_workspace.requested_bytes <= reader.heap_bytes);}test "SQL trace sequence keys preserve order" {    var first_buffer: [key_bytes]u8 = undefined;    var second_buffer: [key_bytes]u8 = undefined;    const first = sequenceKey(&first_buffer, 255);    const second = sequenceKey(&second_buffer, 256);    try std.testing.expectEqual(std.math.Order.lt, std.mem.order(u8, first, second));}test "SQL trace header owns the trace format identity" {    try std.testing.expectEqual(@as(u32, 0x5452_4345), header.sequence);    try std.testing.expectEqual(@as(u32, 0x5452_4345), header.salt.first);    try std.testing.expectEqual(@as(u32, 0x5351_4c31), header.salt.second);}

Source: lib/trace/src/store/format/root.zig:3

zig
pub const database = @import("database.zig");

Complete caller list for store.format.database.checkpoint

27 direct callers.

Audit

Definitions15
Public names15
Members3
Version26.7.0
Revisiondaab053ee433