Skip to content
This repository was archived by the owner on Mar 24, 2026. It is now read-only.

Commit 9bcb07d

Browse files
authored
Merge pull request #2 from structured-world/fix/fjall-rs#265-ingest-invisible-after-reopen
test: add regression test for ingested data invisible after reopen
2 parents f0ca23a + ae2f0c9 commit 9bcb07d

1 file changed

Lines changed: 98 additions & 0 deletions

File tree

tests/ingest_tx_reopen.rs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
use fjall::Readable;
2+
3+
/// Regression test for fjall#265:
4+
/// Data written via start_ingestion(), persisted with SyncAll,
5+
/// must be visible in read_tx() after reopening as SingleWriterTxDatabase.
6+
///
7+
/// Ingestion uses the public Database API (not the #[doc(hidden)] inner() escape hatch),
8+
/// then reopens as SingleWriterTxDatabase to verify read_tx() visibility.
9+
#[test_log::test]
10+
fn ingested_data_visible_in_tx_after_reopen() -> fjall::Result<()> {
11+
use fjall::{Database, KeyspaceCreateOptions, PersistMode, SingleWriterTxDatabase};
12+
13+
let folder = tempfile::tempdir()?;
14+
15+
{
16+
let db = Database::builder(&folder).open()?;
17+
let items = db.keyspace("my_items", KeyspaceCreateOptions::default)?;
18+
19+
let mut ingestion = items.start_ingestion()?;
20+
ingestion.write("key1", "value1")?;
21+
ingestion.write("key2", "value2")?;
22+
ingestion.write("key3", "value3")?;
23+
ingestion.finish()?;
24+
25+
db.persist(PersistMode::SyncAll)?;
26+
27+
assert_eq!(b"value1", &*items.get("key1")?.unwrap());
28+
}
29+
30+
{
31+
let db = SingleWriterTxDatabase::builder(&folder).open()?;
32+
let items = db.keyspace("my_items", KeyspaceCreateOptions::default)?;
33+
34+
assert_eq!(
35+
b"value1",
36+
&*items.get("key1")?.unwrap(),
37+
"ingested data should be visible via direct get after reopen"
38+
);
39+
40+
let snapshot = db.read_tx();
41+
for (key, expected) in [("key1", "value1"), ("key2", "value2"), ("key3", "value3")] {
42+
assert_eq!(
43+
expected.as_bytes(),
44+
&*snapshot.get(&items, key)?.unwrap(),
45+
"ingested data should be visible in read_tx after reopen"
46+
);
47+
}
48+
}
49+
50+
Ok(())
51+
}
52+
53+
/// Same test but with regular Database + snapshot()
54+
#[test_log::test]
55+
fn ingested_data_visible_in_snapshot_after_reopen() -> fjall::Result<()> {
56+
use fjall::{Database, KeyspaceCreateOptions, PersistMode};
57+
58+
let folder = tempfile::tempdir()?;
59+
60+
{
61+
let db = Database::builder(&folder).open()?;
62+
let items = db.keyspace("my_items", KeyspaceCreateOptions::default)?;
63+
64+
let mut ingestion = items.start_ingestion()?;
65+
ingestion.write("key1", "value1")?;
66+
ingestion.write("key2", "value2")?;
67+
ingestion.finish()?;
68+
69+
db.persist(PersistMode::SyncAll)?;
70+
71+
let snapshot = db.snapshot();
72+
assert_eq!(
73+
b"value1",
74+
&*snapshot.get(&items, "key1")?.unwrap(),
75+
"ingested data should be visible in snapshot before close"
76+
);
77+
}
78+
79+
{
80+
let db = Database::builder(&folder).open()?;
81+
let items = db.keyspace("my_items", KeyspaceCreateOptions::default)?;
82+
83+
for (key, expected) in [("key1", "value1"), ("key2", "value2")] {
84+
assert_eq!(expected.as_bytes(), &*items.get(key)?.unwrap());
85+
}
86+
87+
let snapshot = db.snapshot();
88+
for (key, expected) in [("key1", "value1"), ("key2", "value2")] {
89+
assert_eq!(
90+
expected.as_bytes(),
91+
&*snapshot.get(&items, key)?.unwrap(),
92+
"ingested data should be visible in snapshot after reopen"
93+
);
94+
}
95+
}
96+
97+
Ok(())
98+
}

0 commit comments

Comments
 (0)