-- SPDX-FileCopyrightText: © 2026 Vladimir Zorin -- SPDX-License-Identifier: OWL-1.0 or later local testimony = require("testimony") local std = require("std") local mneme = require("mneme") local core = require("mneme.core") local testify = testimony.new("== mneme: reader registry ==") local tmp_path = function() return "/tmp/mneme_readers_" .. std.nanoid() .. ".mneme" end local function teardown(db, path) db:close() std.fs.remove(path) end testify:that("same-handle read txn keeps its snapshot root after writer commit", function() local path = tmp_path() local db = mneme.open(path, { sync = "none" }) local ks = db:keyspace("t") ks:set("k", "v1") local reader = db:txn_begin(true) local snap_root = reader:meta().keyspace_root_pgno local before_pg = reader:btree_get(snap_root, "t") testimony.assert_not_nil(before_pg) local before_root = core.unpack_u32(before_pg) testimony.assert_equal("v1", reader:btree_get(before_root, "k")) ks:set("k", "v2") local still_pg = reader:btree_get(snap_root, "t") testimony.assert_not_nil(still_pg) local still_root = core.unpack_u32(still_pg) testimony.assert_equal(before_root, still_root) testimony.assert_equal("v1", reader:btree_get(still_root, "k")) reader:abort() teardown(db, path) end) testify:that("cross-handle read txn keeps its snapshot root after writer commit", function() local path = tmp_path() local db_a = mneme.open(path, { sync = "none" }) local db_b = mneme.open(path, { sync = "none" }) db_a:keyspace("t"):set("k", "one") local reader = db_a:txn_begin(true) local snap_root = reader:meta().keyspace_root_pgno local before_pg = reader:btree_get(snap_root, "t") testimony.assert_not_nil(before_pg) local before_root = core.unpack_u32(before_pg) testimony.assert_equal("one", reader:btree_get(before_root, "k")) db_b:keyspace("t"):set("k", "two") local still_pg = reader:btree_get(snap_root, "t") testimony.assert_not_nil(still_pg) local still_root = core.unpack_u32(still_pg) testimony.assert_equal(before_root, still_root) testimony.assert_equal("one", reader:btree_get(still_root, "k")) testimony.assert_equal("two", db_b:keyspace("t"):get("k")) reader:abort() db_b:close() teardown(db_a, path) end) testify:conclude()