tiny.trace.store.format.database
Defined in store.format.
API (14)
Actions
Public operations.
checkpointcheckpointIfNeededeventsopenReaderopenWriterreaderCapacitysequenceKeyupdateChecksumworkspaceLimitswriterCapacity
Types and contracts
Public types and contracts.
Values and defaults
Public values and defaults.
Source
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.
lib.sql.src.file.test_file_checkpoints_stream_prepared_WAL_pages_before_restart[function] — test source atlib/sql/src/file.zig:6869in nearest public ownertiny.sql.indexlib.sql.src.file.test_file_database_checkpoint_after_lazy_open_preserves_untouched_base_pages[function] — test source atlib/sql/src/file.zig:7265in nearest public ownertiny.sql.indexlib.sql.src.file.test_file_database_checkpoint_restart_persists_base_and_truncates_wal[function] — test source atlib/sql/src/file.zig:7178in nearest public ownertiny.sql.indexlib.sql.src.file.test_file_database_checkpoint_rewrite_carries_tail_to_later_durable_commit[function] — test source atlib/sql/src/file.zig:7322in nearest public ownertiny.sql.indexlib.sql.src.file.test_file_database_owns_paths_needed_by_later_checkpoints[function] — test source atlib/sql/src/file.zig:5895in nearest public ownertiny.sql.indexlib.sql.src.file.test_file_database_repeated_near_limit_commits_always_reopen[function] — test source atlib/sql/src/file.zig:8107in nearest public ownertiny.sql.indexlib.sql.src.file.test_file_database_wal_bound_survives_checkpoint_rotation_and_reopen[function] — test source atlib/sql/src/file.zig:8047in nearest public ownertiny.sql.indexlib.sql.src.file.test_file_publication_pinned_writer_read_survives_lazy_base_and_two_lane_reuses[function] — test source atlib/sql/src/file.zig:4800in nearest public ownertiny.sql.indexlib.sql.src.file.test_file_publication_read_lease_retains_wal_view_across_candidate_checkpoint[function] — test source atlib/sql/src/file.zig:7212in nearest public ownertiny.sql.indexlib.sql.src.file.test_file_publication_reports_an_opaque_physical_footprint[function] — test source atlib/sql/src/file.zig:4942in nearest public ownertiny.sql.indexlib.sql.src.file.test_file_read_leases_share_the_base_file_unless_lanes_can_replace_it[function] — test source atlib/sql/src/file.zig:4845in nearest public ownertiny.sql.indexlib.sql.src.profiling.bulk.executeIndividualRow[function] — private source atlib/sql/src/profiling/bulk.zig:133in nearest public ownerlib.sql.src.profiling.bulklib.sql.src.profiling.pager.fileDatabaseCleanOpen[function] — private source atlib/sql/src/profiling/pager.zig:674in nearest public ownerlib.sql.src.profiling.pagerlib.sql.src.profiling.pager.fileDurableCheckpointRotation[function] — private source atlib/sql/src/profiling/pager.zig:624in nearest public ownerlib.sql.src.profiling.pagerlib.sql.src.profiling.search.searchRebuildLoadAll[function] — private source atlib/sql/src/profiling/search.zig:163in nearest public ownerlib.sql.src.profiling.searchlib.sql.src.profiling.search.searchRebuildLoadAllLarge[function] — private source atlib/sql/src/profiling/search.zig:189in nearest public ownerlib.sql.src.profiling.searchlib.sql.src.profiling.search.searchRebuildLoadAllPhrasePairsLarge[function] — private source atlib/sql/src/profiling/search.zig:216in nearest public ownerlib.sql.src.profiling.searchlib.sql.src.profiling.search.searchRebuildPutAll[function] — private source atlib/sql/src/profiling/search.zig:132in nearest public ownerlib.sql.src.profiling.searchlib.sql.src.properties.crash.runPlan[function] — private source atlib/sql/src/properties/crash.zig:106in nearest public ownerlib.sql.src.properties.crashlib.sql.src.statement.execute.test_prepared_statements_use_composite_index_after_checkpoint_reopen[function] — test source atlib/sql/src/statement/execute.zig:3245in nearest public ownerlib.sql.src.statement.executelib.sql.src.statement.execute.test_prepared_statements_use_large_composite_index_after_checkpoint_reopen[function] — test source atlib/sql/src/statement/execute.zig:3303in nearest public ownerlib.sql.src.statement.executelib.sql.src.tree.test_tree_clear_releases_durable_pages_without_loading_base_tree[function] — test source atlib/sql/src/tree.zig:3223in nearest public ownertiny.sql.treelib.sql.src.tree.test_tree_range_after_lazy_reopen_does_not_retain_scanned_base_pages[function] — test source atlib/sql/src/tree.zig:2667in nearest public ownertiny.sql.treelib.sql.src.tree.test_tree_root_cache_serves_unchanged_views_and_recomputes_across_writes_and_checkpoints[function] — test source atlib/sql/src/tree.zig:2634in nearest public ownertiny.sql.treetiny.trace.store.format.database.checkpointIfNeeded[function] atlib/trace/src/store/format/database.zig:80lib.trace.src.store.writer.writer.Writer.finishChunk[method] — private source atlib/trace/src/store/writer/writer.zig:185in nearest public ownerlib.trace.src.store.writer.writertools.smg.src.search.loadDocumentBatches[function] — private; no exact target attools/smg/src/search.zig:580in nearest public ownertiny.smg.search
Audit
| Definitions | 15 |
|---|---|
| Public names | 15 |
| Members | 3 |
| Version | 26.7.0 |
| Revision | daab053ee433 |