|
| 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