database_overlay_state.rs 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777
  1. /* This file is part of DarkFi (https://dark.fi)
  2. *
  3. * Copyright (C) 2026-2026 Dyne.org foundation
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU Affero General Public License as
  7. * published by the Free Software Foundation, either version 3 of the
  8. * License, or (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU Affero General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Affero General Public License
  16. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. //! Simulate the creation of a [`DatabaseOverlay`] on top of an entire
  19. //! [`Database`] instance, and perform diffs and writes to verify
  20. //! overlay's cache diff functionality.
  21. use kvdb_overlay::{Database, DatabaseOverlay, Result};
  22. const TREE_1: &str = "_tree1";
  23. const TREE_2: &str = "_tree2";
  24. const TREE_3: &str = "_tree3";
  25. const TREE_4: &str = "_tree4";
  26. const TREE_5: &str = "_tree5";
  27. const TREE_6: &str = "_tree6";
  28. #[test]
  29. fn database_overlay_state() -> Result<()> {
  30. // Initialize database
  31. let (db, _folder) = Database::open_temp()?;
  32. // Initialize trees with some values
  33. let tree_1 = db.open_tree_default(TREE_1)?;
  34. tree_1.insert(b"key_a", b"val_a")?;
  35. let tree_4 = db.open_tree_default(TREE_4)?;
  36. tree_4.insert(b"key_g", b"val_g")?;
  37. tree_4.insert(b"key_j", b"val_j")?;
  38. // Initialize overlay
  39. let mut overlay = DatabaseOverlay::new(&db, vec![])?;
  40. // Open trees in the overlay
  41. overlay.open_tree_default(TREE_1, false)?;
  42. overlay.open_tree_default(TREE_3, false)?;
  43. overlay.open_tree_default(TREE_4, false)?;
  44. overlay.open_tree_default(TREE_6, false)?;
  45. // Make a vector to keep track of changes
  46. let mut sequence = vec![];
  47. // Perform some changes and grab their differences
  48. overlay.insert(TREE_1, b"key_b", b"val_b")?;
  49. overlay.insert(TREE_3, b"key_i", b"val_i")?;
  50. overlay.insert(TREE_4, b"key_k", b"val_k")?;
  51. overlay.remove(TREE_4, b"key_g")?;
  52. sequence.push(overlay.diff(&sequence)?);
  53. overlay.insert(TREE_1, b"key_b", b"val_bb")?;
  54. overlay.remove(TREE_1, b"key_a")?;
  55. overlay.open_tree_default(TREE_2, false)?;
  56. overlay.insert(TREE_2, b"key_d", b"val_d")?;
  57. overlay.insert(TREE_2, b"key_e", b"val_e")?;
  58. overlay.drop_tree(TREE_3)?;
  59. overlay.insert(TREE_4, b"key_k", b"val_kk")?;
  60. overlay.open_tree_default(TREE_5, false)?;
  61. overlay.insert(TREE_5, b"key_h", b"val_h")?;
  62. sequence.push(overlay.diff(&sequence)?);
  63. overlay.insert(TREE_1, b"key_a", b"val_a")?;
  64. overlay.remove(TREE_1, b"key_b")?;
  65. overlay.insert(TREE_1, b"key_c", b"val_c")?;
  66. overlay.remove(TREE_2, b"key_e")?;
  67. overlay.insert(TREE_2, b"key_f", b"val_f")?;
  68. overlay.insert(TREE_4, b"key_l", b"val_l")?;
  69. overlay.drop_tree(TREE_4)?;
  70. sequence.push(overlay.diff(&sequence)?);
  71. // Verify overlay has the correct state
  72. assert_eq!(overlay.state.initial_tree_names.len(), 2);
  73. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  74. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  75. assert_eq!(overlay.state.new_tree_names, [TREE_6, TREE_2, TREE_5]);
  76. assert_eq!(overlay.state.caches.len(), 4);
  77. let tree_1_cache = overlay.state.caches.get(TREE_1).unwrap();
  78. assert_eq!(tree_1_cache.state.cache.len(), 2);
  79. assert_eq!(
  80. tree_1_cache.state.cache.get(b"key_a".as_slice()),
  81. Some(&b"val_a".to_vec())
  82. );
  83. assert_eq!(
  84. tree_1_cache.state.cache.get(b"key_c".as_slice()),
  85. Some(&b"val_c".to_vec())
  86. );
  87. assert_eq!(tree_1_cache.state.removed.len(), 1);
  88. assert_eq!(
  89. tree_1_cache.state.removed.get(b"key_b".as_slice()),
  90. Some(&b"key_b".into())
  91. );
  92. let tree_6_cache = overlay.state.caches.get(TREE_6).unwrap();
  93. assert!(tree_6_cache.state.cache.is_empty());
  94. assert!(tree_6_cache.state.removed.is_empty());
  95. let tree_2_cache = overlay.state.caches.get(TREE_2).unwrap();
  96. assert_eq!(tree_2_cache.state.cache.len(), 2);
  97. assert_eq!(
  98. tree_2_cache.state.cache.get(b"key_d".as_slice()),
  99. Some(&b"val_d".to_vec())
  100. );
  101. assert_eq!(
  102. tree_2_cache.state.cache.get(b"key_f".as_slice()),
  103. Some(&b"val_f".to_vec())
  104. );
  105. assert_eq!(tree_2_cache.state.removed.len(), 1);
  106. assert_eq!(
  107. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  108. Some(&b"key_e".into())
  109. );
  110. let tree_5_cache = overlay.state.caches.get(TREE_5).unwrap();
  111. assert_eq!(tree_5_cache.state.cache.len(), 1);
  112. assert_eq!(
  113. tree_5_cache.state.cache.get(b"key_h".as_slice()),
  114. Some(&b"val_h".to_vec())
  115. );
  116. assert!(tree_5_cache.state.removed.is_empty());
  117. assert_eq!(overlay.state.dropped_trees.len(), 2);
  118. let dropped_tree_3_cache = overlay.state.dropped_trees.get(TREE_3).unwrap();
  119. assert!(dropped_tree_3_cache.cache.is_empty());
  120. assert!(dropped_tree_3_cache.removed.is_empty());
  121. let dropped_tree_4_cache = overlay.state.dropped_trees.get(TREE_4).unwrap();
  122. assert_eq!(dropped_tree_4_cache.cache.len(), 2);
  123. assert_eq!(
  124. dropped_tree_4_cache.cache.get(b"key_g".as_slice()),
  125. Some(&(None, b"val_g".into()))
  126. );
  127. assert_eq!(
  128. dropped_tree_4_cache.cache.get(b"key_j".as_slice()),
  129. Some(&(None, b"val_j".into()))
  130. );
  131. assert!(dropped_tree_4_cache.removed.is_empty());
  132. // Verify diffs sequence is correct
  133. assert_eq!(sequence.len(), 3);
  134. assert_eq!(sequence[0].initial_tree_names.len(), 2);
  135. assert!(sequence[0].initial_tree_names.contains(&TREE_1.into()));
  136. assert!(sequence[0].initial_tree_names.contains(&TREE_4.into()));
  137. assert_eq!(sequence[0].caches.len(), 4);
  138. let (tree_1_cache, drop) = sequence[0].caches.get(TREE_1).unwrap();
  139. assert_eq!(tree_1_cache.cache.len(), 1);
  140. assert_eq!(
  141. tree_1_cache.cache.get(b"key_b".as_slice()),
  142. Some(&(None, b"val_b".to_vec()))
  143. );
  144. assert!(tree_1_cache.removed.is_empty());
  145. assert!(!drop);
  146. let (tree_3_cache, drop) = sequence[0].caches.get(TREE_3).unwrap();
  147. assert_eq!(tree_3_cache.cache.len(), 1);
  148. assert_eq!(
  149. tree_3_cache.cache.get(b"key_i".as_slice()),
  150. Some(&(None, b"val_i".to_vec()))
  151. );
  152. assert!(tree_3_cache.removed.is_empty());
  153. assert!(!drop);
  154. let (tree_4_cache, drop) = sequence[0].caches.get(TREE_4).unwrap();
  155. assert_eq!(tree_4_cache.cache.len(), 1);
  156. assert_eq!(
  157. tree_4_cache.cache.get(b"key_k".as_slice()),
  158. Some(&(None, b"val_k".to_vec()))
  159. );
  160. assert_eq!(tree_4_cache.removed.len(), 1);
  161. assert_eq!(
  162. tree_4_cache.removed.get(b"key_g".as_slice()),
  163. Some(&b"val_g".into())
  164. );
  165. assert!(!drop);
  166. let (tree_6_cache, drop) = sequence[0].caches.get(TREE_6).unwrap();
  167. assert!(tree_6_cache.cache.is_empty());
  168. assert!(tree_6_cache.removed.is_empty());
  169. assert!(!drop);
  170. assert!(sequence[0].dropped_trees.is_empty());
  171. assert_eq!(sequence[0], sequence[0].inverse().inverse());
  172. assert_eq!(sequence[1].initial_tree_names.len(), 4);
  173. assert!(sequence[1].initial_tree_names.contains(&TREE_1.into()));
  174. assert!(sequence[1].initial_tree_names.contains(&TREE_4.into()));
  175. assert!(sequence[1].initial_tree_names.contains(&TREE_6.into()));
  176. assert!(sequence[1].initial_tree_names.contains(&TREE_3.into()));
  177. assert_eq!(sequence[1].caches.len(), 4);
  178. let (tree_1_cache, drop) = sequence[1].caches.get(TREE_1).unwrap();
  179. assert_eq!(tree_1_cache.cache.len(), 1);
  180. assert_eq!(
  181. tree_1_cache.cache.get(b"key_b".as_slice()),
  182. Some(&(Some(b"val_b".into()), b"val_bb".into()))
  183. );
  184. assert_eq!(tree_1_cache.removed.len(), 1);
  185. assert_eq!(
  186. tree_1_cache.removed.get(b"key_a".as_slice()),
  187. Some(&b"val_a".into())
  188. );
  189. assert!(!drop);
  190. let (tree_2_cache, drop) = sequence[1].caches.get(TREE_2).unwrap();
  191. assert_eq!(tree_2_cache.cache.len(), 2);
  192. assert_eq!(
  193. tree_2_cache.cache.get(b"key_d".as_slice()),
  194. Some(&(None, b"val_d".into()))
  195. );
  196. assert_eq!(
  197. tree_2_cache.cache.get(b"key_e".as_slice()),
  198. Some(&(None, b"val_e".into()))
  199. );
  200. assert!(tree_2_cache.removed.is_empty());
  201. assert!(!drop);
  202. let (tree_4_cache, drop) = sequence[1].caches.get(TREE_4).unwrap();
  203. assert_eq!(tree_4_cache.cache.len(), 1);
  204. assert_eq!(
  205. tree_4_cache.cache.get(b"key_k".as_slice()),
  206. Some(&(Some(b"val_k".into()), b"val_kk".into()))
  207. );
  208. assert!(tree_4_cache.removed.is_empty());
  209. assert!(!drop);
  210. let (tree_5_cache, drop) = sequence[1].caches.get(TREE_5).unwrap();
  211. assert_eq!(tree_5_cache.cache.len(), 1);
  212. assert_eq!(
  213. tree_5_cache.cache.get(b"key_h".as_slice()),
  214. Some(&(None, b"val_h".into()))
  215. );
  216. assert!(tree_5_cache.removed.is_empty());
  217. assert!(!drop);
  218. assert_eq!(sequence[1].dropped_trees.len(), 1);
  219. let (dropped_tree_3_cache, restored) = sequence[1].dropped_trees.get(TREE_3).unwrap();
  220. assert_eq!(dropped_tree_3_cache.cache.len(), 1);
  221. assert_eq!(
  222. dropped_tree_3_cache.cache.get(b"key_i".as_slice()),
  223. Some(&(None, b"val_i".into()))
  224. );
  225. assert!(dropped_tree_3_cache.removed.is_empty());
  226. assert!(!restored);
  227. assert_eq!(sequence[1], sequence[1].inverse().inverse());
  228. assert_eq!(sequence[2].initial_tree_names.len(), 5);
  229. assert!(sequence[2].initial_tree_names.contains(&TREE_1.into()));
  230. assert!(sequence[2].initial_tree_names.contains(&TREE_4.into()));
  231. assert!(sequence[2].initial_tree_names.contains(&TREE_6.into()));
  232. assert!(sequence[2].initial_tree_names.contains(&TREE_2.into()));
  233. assert!(sequence[2].initial_tree_names.contains(&TREE_5.into()));
  234. assert_eq!(sequence[2].caches.len(), 2);
  235. let (tree_1_cache, drop) = sequence[2].caches.get(TREE_1).unwrap();
  236. assert_eq!(tree_1_cache.cache.len(), 2);
  237. assert_eq!(
  238. tree_1_cache.cache.get(b"key_a".as_slice()),
  239. Some(&(None, b"val_a".into()))
  240. );
  241. assert_eq!(
  242. tree_1_cache.cache.get(b"key_c".as_slice()),
  243. Some(&(None, b"val_c".into()))
  244. );
  245. assert_eq!(tree_1_cache.removed.len(), 1);
  246. assert_eq!(
  247. tree_1_cache.removed.get(b"key_b".as_slice()),
  248. Some(&b"val_bb".into())
  249. );
  250. assert!(!drop);
  251. let (tree_2_cache, drop) = sequence[2].caches.get(TREE_2).unwrap();
  252. assert_eq!(tree_2_cache.cache.len(), 1);
  253. assert_eq!(
  254. tree_2_cache.cache.get(b"key_f".as_slice()),
  255. Some(&(None, b"val_f".into()))
  256. );
  257. assert_eq!(tree_2_cache.removed.len(), 1);
  258. assert_eq!(
  259. tree_2_cache.removed.get(b"key_e".as_slice()),
  260. Some(&b"val_e".into())
  261. );
  262. assert!(!drop);
  263. assert_eq!(sequence[2].dropped_trees.len(), 1);
  264. let (dropped_tree_4_cache, restored) = sequence[2].dropped_trees.get(TREE_4).unwrap();
  265. assert_eq!(dropped_tree_4_cache.cache.len(), 2);
  266. assert_eq!(
  267. dropped_tree_4_cache.cache.get(b"key_j".as_slice()),
  268. Some(&(None, b"val_j".into()))
  269. );
  270. assert_eq!(
  271. dropped_tree_4_cache.cache.get(b"key_k".as_slice()),
  272. Some(&(Some(b"val_k".into()), b"val_kk".into()))
  273. );
  274. assert!(dropped_tree_4_cache.removed.is_empty());
  275. assert!(!restored);
  276. assert_eq!(sequence[2], sequence[2].inverse().inverse());
  277. // Now we are going to apply each diff and check that the database
  278. // and the overlay have been mutated accordingly.
  279. // Don't forget to flush.
  280. overlay.apply_diff(&sequence[0])?;
  281. db.flush_default_mode()?;
  282. // All trees should be present in the database
  283. let db_tree_names = db.tree_names()?;
  284. assert_eq!(db_tree_names.len(), 6);
  285. assert!(db_tree_names.contains(&TREE_1.into()));
  286. assert!(db_tree_names.contains(&TREE_2.into()));
  287. assert!(db_tree_names.contains(&TREE_3.into()));
  288. assert!(db_tree_names.contains(&TREE_4.into()));
  289. assert!(db_tree_names.contains(&TREE_5.into()));
  290. assert!(db_tree_names.contains(&TREE_6.into()));
  291. let tree_1 = db.open_tree_default(TREE_1)?;
  292. assert_eq!(tree_1.len()?, 2);
  293. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  294. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_b".into()));
  295. let tree_2 = db.open_tree_default(TREE_2)?;
  296. assert!(tree_2.is_empty()?);
  297. let tree_3 = db.open_tree_default(TREE_3)?;
  298. assert_eq!(tree_3.len()?, 1);
  299. assert_eq!(tree_3.get(b"key_i")?, Some(b"val_i".into()));
  300. let tree_4 = db.open_tree_default(TREE_4)?;
  301. assert_eq!(tree_4.len()?, 2);
  302. assert_eq!(tree_4.get(b"key_j")?, Some(b"val_j".into()));
  303. assert_eq!(tree_4.get(b"key_k")?, Some(b"val_k".into()));
  304. let tree_5 = db.open_tree_default(TREE_5)?;
  305. assert!(tree_5.is_empty()?);
  306. let tree_6 = db.open_tree_default(TREE_6)?;
  307. assert!(tree_6.is_empty()?);
  308. assert_eq!(overlay.state.initial_tree_names.len(), 4);
  309. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  310. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  311. assert!(overlay.state.initial_tree_names.contains(&TREE_3.into()));
  312. assert!(overlay.state.initial_tree_names.contains(&TREE_6.into()));
  313. assert_eq!(overlay.state.new_tree_names, [TREE_2, TREE_5]);
  314. // Tree 6 was stale so it should have been closed
  315. assert_eq!(overlay.state.caches.len(), 3);
  316. let tree_1_cache = overlay.state.caches.get(TREE_1).unwrap();
  317. assert_eq!(tree_1_cache.state.cache.len(), 2);
  318. assert_eq!(
  319. tree_1_cache.state.cache.get(b"key_a".as_slice()),
  320. Some(&b"val_a".into())
  321. );
  322. assert_eq!(
  323. tree_1_cache.state.cache.get(b"key_c".as_slice()),
  324. Some(&b"val_c".into())
  325. );
  326. assert_eq!(tree_1_cache.state.removed.len(), 1);
  327. assert_eq!(
  328. tree_1_cache.state.removed.get(b"key_b".as_slice()),
  329. Some(&b"key_b".into())
  330. );
  331. let tree_2_cache = overlay.state.caches.get(TREE_2).unwrap();
  332. assert_eq!(tree_2_cache.state.cache.len(), 2);
  333. assert_eq!(
  334. tree_2_cache.state.cache.get(b"key_d".as_slice()),
  335. Some(&b"val_d".into())
  336. );
  337. assert_eq!(
  338. tree_2_cache.state.cache.get(b"key_f".as_slice()),
  339. Some(&b"val_f".into())
  340. );
  341. assert_eq!(tree_2_cache.state.removed.len(), 1);
  342. assert_eq!(
  343. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  344. Some(&b"key_e".into())
  345. );
  346. let tree_5_cache = overlay.state.caches.get(TREE_5).unwrap();
  347. assert_eq!(tree_5_cache.state.cache.len(), 1);
  348. assert_eq!(
  349. tree_5_cache.state.cache.get(b"key_h".as_slice()),
  350. Some(&b"val_h".into())
  351. );
  352. assert!(tree_5_cache.state.removed.is_empty());
  353. assert_eq!(overlay.state.dropped_trees.len(), 2);
  354. let dropped_tree_3_cache = overlay.state.dropped_trees.get(TREE_3).unwrap();
  355. assert_eq!(dropped_tree_3_cache.cache.len(), 1);
  356. assert_eq!(
  357. dropped_tree_3_cache.cache.get(b"key_i".as_slice()),
  358. Some(&(None, b"val_i".into()))
  359. );
  360. assert!(dropped_tree_3_cache.removed.is_empty());
  361. let dropped_tree_4_cache = overlay.state.dropped_trees.get(TREE_4).unwrap();
  362. assert_eq!(dropped_tree_4_cache.cache.len(), 2);
  363. assert_eq!(
  364. dropped_tree_4_cache.cache.get(b"key_j".as_slice()),
  365. Some(&(None, b"val_j".into()))
  366. );
  367. assert_eq!(
  368. dropped_tree_4_cache.cache.get(b"key_k".as_slice()),
  369. Some(&(None, b"val_k".into()))
  370. );
  371. assert!(dropped_tree_4_cache.removed.is_empty());
  372. overlay.apply_diff(&sequence[1])?;
  373. db.flush_default_mode()?;
  374. // All trees should be present in the database
  375. let db_tree_names = db.tree_names()?;
  376. assert_eq!(db_tree_names.len(), 5);
  377. assert!(db_tree_names.contains(&TREE_1.into()));
  378. assert!(db_tree_names.contains(&TREE_2.into()));
  379. assert!(db_tree_names.contains(&TREE_4.into()));
  380. assert!(db_tree_names.contains(&TREE_5.into()));
  381. assert!(db_tree_names.contains(&TREE_6.into()));
  382. let tree_1 = db.open_tree_default(TREE_1)?;
  383. assert_eq!(tree_1.len()?, 1);
  384. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_bb".into()));
  385. let tree_2 = db.open_tree_default(TREE_2)?;
  386. assert_eq!(tree_2.len()?, 2);
  387. assert_eq!(tree_2.get(b"key_d")?, Some(b"val_d".into()));
  388. assert_eq!(tree_2.get(b"key_e")?, Some(b"val_e".into()));
  389. let tree_4 = db.open_tree_default(TREE_4)?;
  390. assert_eq!(tree_4.len()?, 2);
  391. assert_eq!(tree_4.get(b"key_j")?, Some(b"val_j".into()));
  392. assert_eq!(tree_4.get(b"key_k")?, Some(b"val_kk".into()));
  393. let tree_5 = db.open_tree_default(TREE_5)?;
  394. assert_eq!(tree_5.len()?, 1);
  395. assert_eq!(tree_5.get(b"key_h")?, Some(b"val_h".into()));
  396. let tree_6 = db.open_tree_default(TREE_6)?;
  397. assert!(tree_6.is_empty()?);
  398. assert_eq!(overlay.state.initial_tree_names.len(), 5);
  399. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  400. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  401. assert!(overlay.state.initial_tree_names.contains(&TREE_2.into()));
  402. assert!(overlay.state.initial_tree_names.contains(&TREE_5.into()));
  403. assert!(overlay.state.initial_tree_names.contains(&TREE_6.into()));
  404. assert!(overlay.state.new_tree_names.is_empty());
  405. // Tree 5 was stale so it should have been closed
  406. assert_eq!(overlay.state.caches.len(), 2);
  407. let tree_1_cache = overlay.state.caches.get(TREE_1).unwrap();
  408. assert_eq!(tree_1_cache.state.cache.len(), 2);
  409. assert_eq!(
  410. tree_1_cache.state.cache.get(b"key_a".as_slice()),
  411. Some(&b"val_a".into())
  412. );
  413. assert_eq!(
  414. tree_1_cache.state.cache.get(b"key_c".as_slice()),
  415. Some(&b"val_c".into())
  416. );
  417. assert_eq!(tree_1_cache.state.removed.len(), 1);
  418. assert_eq!(
  419. tree_1_cache.state.removed.get(b"key_b".as_slice()),
  420. Some(&b"key_b".into())
  421. );
  422. let tree_2_cache = overlay.state.caches.get(TREE_2).unwrap();
  423. assert_eq!(tree_2_cache.state.cache.len(), 1);
  424. assert_eq!(
  425. tree_2_cache.state.cache.get(b"key_f".as_slice()),
  426. Some(&b"val_f".into())
  427. );
  428. assert_eq!(tree_2_cache.state.removed.len(), 1);
  429. assert_eq!(
  430. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  431. Some(&b"key_e".into())
  432. );
  433. assert_eq!(overlay.state.dropped_trees.len(), 1);
  434. let dropped_tree_4_cache = overlay.state.dropped_trees.get(TREE_4).unwrap();
  435. assert_eq!(dropped_tree_4_cache.cache.len(), 2);
  436. assert_eq!(
  437. dropped_tree_4_cache.cache.get(b"key_j".as_slice()),
  438. Some(&(None, b"val_j".into()))
  439. );
  440. assert_eq!(
  441. dropped_tree_4_cache.cache.get(b"key_k".as_slice()),
  442. Some(&(Some(b"val_k".into()), b"val_kk".into()))
  443. );
  444. assert!(dropped_tree_4_cache.removed.is_empty());
  445. overlay.apply_diff(&sequence[2])?;
  446. db.flush_default_mode()?;
  447. // All trees should be present in the database
  448. let db_tree_names = db.tree_names()?;
  449. assert_eq!(db_tree_names.len(), 4);
  450. assert!(db_tree_names.contains(&TREE_1.into()));
  451. assert!(db_tree_names.contains(&TREE_2.into()));
  452. assert!(db_tree_names.contains(&TREE_5.into()));
  453. assert!(db_tree_names.contains(&TREE_6.into()));
  454. let tree_1 = db.open_tree_default(TREE_1)?;
  455. assert_eq!(tree_1.len()?, 2);
  456. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  457. assert_eq!(tree_1.get(b"key_c")?, Some(b"val_c".into()));
  458. let tree_2 = db.open_tree_default(TREE_2)?;
  459. assert_eq!(tree_2.len()?, 2);
  460. assert_eq!(tree_2.get(b"key_d")?, Some(b"val_d".into()));
  461. assert_eq!(tree_2.get(b"key_f")?, Some(b"val_f".into()));
  462. let tree_5 = db.open_tree_default(TREE_5)?;
  463. assert_eq!(tree_5.len()?, 1);
  464. assert_eq!(tree_5.get(b"key_h")?, Some(b"val_h".into()));
  465. let tree_6 = db.open_tree_default(TREE_6)?;
  466. assert!(tree_6.is_empty()?);
  467. // Since we removed everything, current overlay must not have
  468. // diffs over the tree, therefore its safe to keep using it
  469. assert_eq!(overlay.state.initial_tree_names.len(), 4);
  470. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  471. assert!(overlay.state.initial_tree_names.contains(&TREE_2.into()));
  472. assert!(overlay.state.initial_tree_names.contains(&TREE_5.into()));
  473. assert!(overlay.state.initial_tree_names.contains(&TREE_6.into()));
  474. assert!(overlay.state.new_tree_names.is_empty());
  475. assert!(overlay.state.caches.is_empty());
  476. assert!(overlay.state.dropped_trees.is_empty());
  477. let diff = overlay.diff(&[])?;
  478. assert!(diff.caches.is_empty());
  479. assert!(diff.dropped_trees.is_empty());
  480. // We are going to make some changes that we want to revert
  481. // using the corresponding inverse diff
  482. overlay.open_tree_default(TREE_1, false)?;
  483. overlay.insert(TREE_1, b"key_a", b"val_aa")?;
  484. overlay.insert(TREE_1, b"key_b", b"val_b")?;
  485. overlay.remove(TREE_1, b"key_c")?;
  486. overlay.open_tree_default(TREE_2, false)?;
  487. overlay.remove(TREE_2, b"key_d")?;
  488. overlay.insert(TREE_2, b"key_f", b"val_ff")?;
  489. overlay.drop_tree(TREE_5)?;
  490. // Grab the diff, apply it and verify the database state
  491. let diff = overlay.diff(&[])?;
  492. overlay.apply_diff(&diff)?;
  493. db.flush_default_mode()?;
  494. let db_tree_names = db.tree_names()?;
  495. assert_eq!(db_tree_names.len(), 3);
  496. assert!(db_tree_names.contains(&TREE_1.into()));
  497. assert!(db_tree_names.contains(&TREE_2.into()));
  498. assert!(db_tree_names.contains(&TREE_6.into()));
  499. let tree_1 = db.open_tree_default(TREE_1)?;
  500. assert_eq!(tree_1.len()?, 2);
  501. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_aa".into()));
  502. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_b".into()));
  503. let tree_2 = db.open_tree_default(TREE_2)?;
  504. assert_eq!(tree_2.len()?, 1);
  505. assert_eq!(tree_2.get(b"key_f")?, Some(b"val_ff".into()));
  506. let tree_6 = db.open_tree_default(TREE_6)?;
  507. assert!(tree_6.is_empty()?);
  508. // Now we grab the diff inverse, apply it and verity the database
  509. // state.
  510. overlay.apply_diff(&diff.inverse())?;
  511. db.flush_default_mode()?;
  512. let db_tree_names = db.tree_names()?;
  513. assert_eq!(db_tree_names.len(), 4);
  514. assert!(db_tree_names.contains(&TREE_1.into()));
  515. assert!(db_tree_names.contains(&TREE_2.into()));
  516. assert!(db_tree_names.contains(&TREE_6.into()));
  517. assert!(db_tree_names.contains(&TREE_5.into()));
  518. let tree_1 = db.open_tree_default(TREE_1)?;
  519. assert_eq!(tree_1.len()?, 2);
  520. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  521. assert_eq!(tree_1.get(b"key_c")?, Some(b"val_c".into()));
  522. let tree_2 = db.open_tree_default(TREE_2)?;
  523. assert_eq!(tree_2.len()?, 2);
  524. assert_eq!(tree_2.get(b"key_d")?, Some(b"val_d".into()));
  525. assert_eq!(tree_2.get(b"key_f")?, Some(b"val_f".into()));
  526. let tree_6 = db.open_tree_default(TREE_6)?;
  527. assert!(tree_6.is_empty()?);
  528. let tree_5 = db.open_tree_default(TREE_5)?;
  529. assert_eq!(tree_5.len()?, 1);
  530. assert_eq!(tree_5.get(b"key_h")?, Some(b"val_h".into()));
  531. // Now we are going to revert the diffs sequence going backwards
  532. // and verify the database state mutates accordingly
  533. overlay.apply_diff(&sequence[2].inverse())?;
  534. db.flush_default_mode()?;
  535. let db_tree_names = db.tree_names()?;
  536. assert_eq!(db_tree_names.len(), 5);
  537. assert!(db_tree_names.contains(&TREE_1.into()));
  538. assert!(db_tree_names.contains(&TREE_2.into()));
  539. assert!(db_tree_names.contains(&TREE_6.into()));
  540. assert!(db_tree_names.contains(&TREE_4.into()));
  541. assert!(db_tree_names.contains(&TREE_5.into()));
  542. let tree_1 = db.open_tree_default(TREE_1)?;
  543. assert_eq!(tree_1.len()?, 1);
  544. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_bb".into()));
  545. let tree_2 = db.open_tree_default(TREE_2)?;
  546. assert_eq!(tree_2.len()?, 2);
  547. assert_eq!(tree_2.get(b"key_d")?, Some(b"val_d".into()));
  548. assert_eq!(tree_2.get(b"key_e")?, Some(b"val_e".into()));
  549. let tree_6 = db.open_tree_default(TREE_6)?;
  550. assert!(tree_6.is_empty()?);
  551. let tree_4 = db.open_tree_default(TREE_4)?;
  552. assert_eq!(tree_4.len()?, 2);
  553. assert_eq!(tree_4.get(b"key_j")?, Some(b"val_j".into()));
  554. assert_eq!(tree_4.get(b"key_k")?, Some(b"val_kk".into()));
  555. let tree_5 = db.open_tree_default(TREE_5)?;
  556. assert_eq!(tree_5.len()?, 1);
  557. assert_eq!(tree_5.get(b"key_h")?, Some(b"val_h".into()));
  558. overlay.apply_diff(&sequence[1].inverse())?;
  559. db.flush_default_mode()?;
  560. let db_tree_names = db.tree_names()?;
  561. assert_eq!(db_tree_names.len(), 4);
  562. assert!(db_tree_names.contains(&TREE_1.into()));
  563. assert!(db_tree_names.contains(&TREE_6.into()));
  564. assert!(db_tree_names.contains(&TREE_3.into()));
  565. assert!(db_tree_names.contains(&TREE_4.into()));
  566. let tree_1 = db.open_tree_default(TREE_1)?;
  567. assert_eq!(tree_1.len()?, 2);
  568. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  569. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_b".into()));
  570. let tree_6 = db.open_tree_default(TREE_6)?;
  571. assert!(tree_6.is_empty()?);
  572. let tree_3 = db.open_tree_default(TREE_3)?;
  573. assert_eq!(tree_3.len()?, 1);
  574. assert_eq!(tree_3.get(b"key_i")?, Some(b"val_i".into()));
  575. let tree_4 = db.open_tree_default(TREE_4)?;
  576. assert_eq!(tree_4.len()?, 2);
  577. assert_eq!(tree_4.get(b"key_j")?, Some(b"val_j".into()));
  578. assert_eq!(tree_4.get(b"key_k")?, Some(b"val_k".into()));
  579. overlay.apply_diff(&sequence[0].inverse())?;
  580. db.flush_default_mode()?;
  581. // Since we removed everything, current overlay must not have
  582. // diffs over the tree, therefore its safe to keep using it
  583. assert_eq!(overlay.state.initial_tree_names.len(), 2);
  584. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  585. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  586. assert!(overlay.state.new_tree_names.is_empty());
  587. assert!(overlay.state.caches.is_empty());
  588. assert!(overlay.state.dropped_trees.is_empty());
  589. let diff = overlay.diff(&[])?;
  590. assert!(diff.caches.is_empty());
  591. assert!(diff.dropped_trees.is_empty());
  592. // The database has now reverted to its original state
  593. let db_tree_names = db.tree_names()?;
  594. assert_eq!(db_tree_names.len(), 2);
  595. assert!(db_tree_names.contains(&TREE_1.into()));
  596. assert!(db_tree_names.contains(&TREE_4.into()));
  597. let tree_1 = db.open_tree_default(TREE_1)?;
  598. assert_eq!(tree_1.len()?, 1);
  599. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  600. let tree_4 = db.open_tree_default(TREE_4)?;
  601. assert_eq!(tree_4.len()?, 2);
  602. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  603. assert_eq!(tree_4.get(b"key_j")?, Some(b"val_j".into()));
  604. Ok(())
  605. }
  606. #[test]
  607. fn database_overlay_rebuild_state() -> Result<()> {
  608. // Initialize database
  609. let (db, _folder) = Database::open_temp()?;
  610. // Initialize trees with some values
  611. let tree_1 = db.open_tree_default(TREE_1)?;
  612. tree_1.insert(b"key_a", b"val_a")?;
  613. let tree_4 = db.open_tree_default(TREE_4)?;
  614. tree_4.insert(b"key_g", b"val_g")?;
  615. // Initialize overlay
  616. let mut overlay = DatabaseOverlay::new(&db, vec![])?;
  617. // Open trees in the overlay
  618. overlay.open_tree_default(TREE_1, false)?;
  619. overlay.open_tree_default(TREE_3, false)?;
  620. // Make a vector to keep track of changes
  621. let mut sequence = vec![];
  622. // Perform some changes and grab their differences
  623. overlay.insert(TREE_1, b"key_b", b"val_b")?;
  624. overlay.insert(TREE_3, b"key_i", b"val_i")?;
  625. sequence.push(overlay.diff(&sequence)?);
  626. overlay.insert(TREE_1, b"key_b", b"val_bb")?;
  627. overlay.remove(TREE_1, b"key_a")?;
  628. overlay.open_tree_default(TREE_2, false)?;
  629. overlay.insert(TREE_2, b"key_d", b"val_d")?;
  630. overlay.insert(TREE_2, b"key_e", b"val_e")?;
  631. overlay.drop_tree(TREE_3)?;
  632. sequence.push(overlay.diff(&sequence)?);
  633. overlay.insert(TREE_1, b"key_a", b"val_a")?;
  634. overlay.remove(TREE_1, b"key_b")?;
  635. overlay.insert(TREE_1, b"key_c", b"val_c")?;
  636. overlay.remove(TREE_2, b"key_e")?;
  637. overlay.insert(TREE_2, b"key_f", b"val_f")?;
  638. overlay.drop_tree(TREE_4)?;
  639. overlay.open_tree_default(TREE_5, false)?;
  640. overlay.insert(TREE_5, b"key_h", b"val_h")?;
  641. sequence.push(overlay.diff(&sequence)?);
  642. // Create a different overlay to rebuild
  643. // the previous one using the changes sequence
  644. let mut overlay2 = DatabaseOverlay::new(&db, vec![])?;
  645. // All trees should be present in the database
  646. assert_eq!(overlay2.state.initial_tree_names.len(), 5);
  647. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  648. assert!(overlay2.state.initial_tree_names.contains(&TREE_2.into()));
  649. assert!(overlay2.state.initial_tree_names.contains(&TREE_3.into()));
  650. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  651. assert!(overlay2.state.initial_tree_names.contains(&TREE_5.into()));
  652. assert!(overlay2.state.new_tree_names.is_empty());
  653. assert!(overlay2.state.caches.is_empty());
  654. assert!(overlay2.state.dropped_trees.is_empty());
  655. // Add each diff from the sequence and verify
  656. // overlay has been mutated accordingly
  657. overlay2.add_diff(&sequence[0])?;
  658. assert_eq!(overlay2.state.initial_tree_names.len(), 2);
  659. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  660. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  661. assert_eq!(overlay2.state.new_tree_names, [TREE_3]);
  662. assert_eq!(overlay2.state.caches.len(), 2);
  663. let tree_1_cache = overlay2.state.caches.get(TREE_1).unwrap();
  664. assert_eq!(tree_1_cache.state.cache.len(), 1);
  665. assert_eq!(
  666. tree_1_cache.state.cache.get(b"key_b".as_slice()),
  667. Some(&b"val_b".into())
  668. );
  669. assert!(tree_1_cache.state.removed.is_empty());
  670. let tree_3_cache = overlay2.state.caches.get(TREE_3).unwrap();
  671. assert_eq!(tree_3_cache.state.cache.len(), 1);
  672. assert_eq!(
  673. tree_3_cache.state.cache.get(b"key_i".as_slice()),
  674. Some(&b"val_i".into())
  675. );
  676. assert!(tree_3_cache.state.removed.is_empty());
  677. assert!(overlay2.state.dropped_trees.is_empty());
  678. overlay2.add_diff(&sequence[1])?;
  679. assert_eq!(overlay2.state.initial_tree_names.len(), 2);
  680. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  681. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  682. assert_eq!(overlay2.state.new_tree_names, [TREE_2]);
  683. assert_eq!(overlay2.state.caches.len(), 2);
  684. let tree_1_cache = overlay2.state.caches.get(TREE_1).unwrap();
  685. assert_eq!(tree_1_cache.state.cache.len(), 1);
  686. assert_eq!(
  687. tree_1_cache.state.cache.get(b"key_b".as_slice()),
  688. Some(&b"val_bb".into())
  689. );
  690. assert_eq!(tree_1_cache.state.removed.len(), 1);
  691. assert_eq!(
  692. tree_1_cache.state.removed.get(b"key_a".as_slice()),
  693. Some(&b"key_a".into())
  694. );
  695. let tree_2_cache = overlay2.state.caches.get(TREE_2).unwrap();
  696. assert_eq!(tree_2_cache.state.cache.len(), 2);
  697. assert_eq!(
  698. tree_2_cache.state.cache.get(b"key_d".as_slice()),
  699. Some(&b"val_d".into())
  700. );
  701. assert_eq!(
  702. tree_2_cache.state.cache.get(b"key_e".as_slice()),
  703. Some(&b"val_e".into())
  704. );
  705. assert!(tree_2_cache.state.removed.is_empty());
  706. assert_eq!(overlay2.state.dropped_trees.len(), 1);
  707. let dropped_tree_3_cache = overlay2.state.dropped_trees.get(TREE_3).unwrap();
  708. assert_eq!(dropped_tree_3_cache.cache.len(), 1);
  709. assert_eq!(
  710. dropped_tree_3_cache.cache.get(b"key_i".as_slice()),
  711. Some(&(None, b"val_i".into()))
  712. );
  713. assert!(dropped_tree_3_cache.removed.is_empty());
  714. // Deviate and create some new records in the overlay
  715. overlay2.insert(TREE_1, b"key_c", b"val_cc")?;
  716. overlay2.remove(TREE_2, b"key_e")?;
  717. overlay2.open_tree_default(TREE_4, false)?;
  718. overlay2.insert(TREE_4, b"key_f", b"val_f")?;
  719. overlay2.open_tree_default(TREE_6, false)?;
  720. overlay2.insert(TREE_6, b"key_h", b"val_h")?;
  721. overlay2.drop_tree(TREE_6)?;
  722. // Verify overlay2 has the correct state
  723. assert_eq!(overlay2.state.initial_tree_names.len(), 2);
  724. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  725. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  726. assert_eq!(overlay2.state.new_tree_names, [TREE_2]);
  727. assert_eq!(overlay2.state.caches.len(), 3);
  728. let tree_1_cache = overlay2.state.caches.get(TREE_1).unwrap();
  729. assert_eq!(tree_1_cache.state.cache.len(), 2);
  730. assert_eq!(
  731. tree_1_cache.state.cache.get(b"key_b".as_slice()),
  732. Some(&b"val_bb".into())
  733. );
  734. assert_eq!(
  735. tree_1_cache.state.cache.get(b"key_c".as_slice()),
  736. Some(&b"val_cc".into())
  737. );
  738. assert_eq!(tree_1_cache.state.removed.len(), 1);
  739. assert_eq!(
  740. tree_1_cache.state.removed.get(b"key_a".as_slice()),
  741. Some(&b"key_a".into())
  742. );
  743. let tree_2_cache = overlay2.state.caches.get(TREE_2).unwrap();
  744. assert_eq!(tree_2_cache.state.cache.len(), 1);
  745. assert_eq!(
  746. tree_2_cache.state.cache.get(b"key_d".as_slice()),
  747. Some(&b"val_d".into())
  748. );
  749. assert_eq!(tree_2_cache.state.removed.len(), 1);
  750. assert_eq!(
  751. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  752. Some(&b"key_e".into())
  753. );
  754. let tree_4_cache = overlay2.state.caches.get(TREE_4).unwrap();
  755. assert_eq!(tree_4_cache.state.cache.len(), 1);
  756. assert_eq!(
  757. tree_4_cache.state.cache.get(b"key_f".as_slice()),
  758. Some(&b"val_f".into())
  759. );
  760. assert!(tree_4_cache.state.removed.is_empty());
  761. assert_eq!(overlay2.state.dropped_trees.len(), 2);
  762. let dropped_tree_3_cache = overlay2.state.dropped_trees.get(TREE_3).unwrap();
  763. assert_eq!(dropped_tree_3_cache.cache.len(), 1);
  764. assert_eq!(
  765. dropped_tree_3_cache.cache.get(b"key_i".as_slice()),
  766. Some(&(None, b"val_i".into()))
  767. );
  768. assert!(dropped_tree_3_cache.removed.is_empty());
  769. let dropped_tree_6_cache = overlay2.state.dropped_trees.get(TREE_6).unwrap();
  770. assert!(dropped_tree_6_cache.cache.is_empty());
  771. assert!(dropped_tree_6_cache.removed.is_empty());
  772. // Now we are going to apply each diff and check that the database
  773. // and the overlays have been mutated accordingly.
  774. // Don't forget to flush.
  775. overlay.apply_diff(&sequence[0])?;
  776. overlay2.remove_diff(&sequence[0]);
  777. db.flush_default_mode()?;
  778. // All trees should be present in the database
  779. let db_tree_names = db.tree_names()?;
  780. assert_eq!(db_tree_names.len(), 6);
  781. assert!(db_tree_names.contains(&TREE_1.into()));
  782. assert!(db_tree_names.contains(&TREE_2.into()));
  783. assert!(db_tree_names.contains(&TREE_3.into()));
  784. assert!(db_tree_names.contains(&TREE_4.into()));
  785. assert!(db_tree_names.contains(&TREE_5.into()));
  786. assert!(db_tree_names.contains(&TREE_6.into()));
  787. let tree_1 = db.open_tree_default(TREE_1)?;
  788. assert_eq!(tree_1.len()?, 2);
  789. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  790. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_b".into()));
  791. let tree_2 = db.open_tree_default(TREE_2)?;
  792. assert!(tree_2.is_empty()?);
  793. let tree_3 = db.open_tree_default(TREE_3)?;
  794. assert_eq!(tree_3.len()?, 1);
  795. assert_eq!(tree_3.get(b"key_i")?, Some(b"val_i".into()));
  796. let tree_4 = db.open_tree_default(TREE_4)?;
  797. assert_eq!(tree_4.len()?, 1);
  798. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  799. let tree_5 = db.open_tree_default(TREE_5)?;
  800. assert!(tree_5.is_empty()?);
  801. let tree_6 = db.open_tree_default(TREE_6)?;
  802. assert!(tree_6.is_empty()?);
  803. assert_eq!(overlay.state.initial_tree_names.len(), 3);
  804. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  805. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  806. assert!(overlay.state.initial_tree_names.contains(&TREE_3.into()));
  807. assert_eq!(overlay.state.new_tree_names, [TREE_2, TREE_5]);
  808. assert_eq!(overlay.state.caches.len(), 3);
  809. let tree_1_cache = overlay.state.caches.get(TREE_1).unwrap();
  810. assert_eq!(tree_1_cache.state.cache.len(), 2);
  811. assert_eq!(
  812. tree_1_cache.state.cache.get(b"key_a".as_slice()),
  813. Some(&b"val_a".into())
  814. );
  815. assert_eq!(
  816. tree_1_cache.state.cache.get(b"key_c".as_slice()),
  817. Some(&b"val_c".into())
  818. );
  819. assert_eq!(tree_1_cache.state.removed.len(), 1);
  820. assert_eq!(
  821. tree_1_cache.state.removed.get(b"key_b".as_slice()),
  822. Some(&b"key_b".into())
  823. );
  824. let tree_2_cache = overlay.state.caches.get(TREE_2).unwrap();
  825. assert_eq!(tree_2_cache.state.cache.len(), 2);
  826. assert_eq!(
  827. tree_2_cache.state.cache.get(b"key_d".as_slice()),
  828. Some(&b"val_d".into())
  829. );
  830. assert_eq!(
  831. tree_2_cache.state.cache.get(b"key_f".as_slice()),
  832. Some(&b"val_f".into())
  833. );
  834. assert_eq!(tree_2_cache.state.removed.len(), 1);
  835. assert_eq!(
  836. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  837. Some(&b"key_e".into())
  838. );
  839. let tree_5_cache = overlay.state.caches.get(TREE_5).unwrap();
  840. assert_eq!(tree_5_cache.state.cache.len(), 1);
  841. assert_eq!(
  842. tree_5_cache.state.cache.get(b"key_h".as_slice()),
  843. Some(&b"val_h".into())
  844. );
  845. assert!(tree_5_cache.state.removed.is_empty());
  846. assert_eq!(overlay.state.dropped_trees.len(), 2);
  847. let dropped_tree_3_cache = overlay.state.dropped_trees.get(TREE_3).unwrap();
  848. assert_eq!(dropped_tree_3_cache.cache.len(), 1);
  849. assert_eq!(
  850. dropped_tree_3_cache.cache.get(b"key_i".as_slice()),
  851. Some(&(None, b"val_i".into()))
  852. );
  853. assert!(dropped_tree_3_cache.removed.is_empty());
  854. let dropped_tree_4_cache = overlay.state.dropped_trees.get(TREE_4).unwrap();
  855. assert_eq!(dropped_tree_4_cache.cache.len(), 1);
  856. assert_eq!(
  857. dropped_tree_4_cache.cache.get(b"key_g".as_slice()),
  858. Some(&(None, b"val_g".into()))
  859. );
  860. assert!(dropped_tree_4_cache.removed.is_empty());
  861. assert_eq!(overlay2.state.initial_tree_names.len(), 3);
  862. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  863. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  864. assert!(overlay2.state.initial_tree_names.contains(&TREE_3.into()));
  865. assert_eq!(overlay2.state.new_tree_names, [TREE_2]);
  866. assert_eq!(overlay2.state.caches.len(), 3);
  867. let tree_1_cache = overlay2.state.caches.get(TREE_1).unwrap();
  868. assert_eq!(tree_1_cache.state.cache.len(), 2);
  869. assert_eq!(
  870. tree_1_cache.state.cache.get(b"key_b".as_slice()),
  871. Some(&b"val_bb".into())
  872. );
  873. assert_eq!(
  874. tree_1_cache.state.cache.get(b"key_c".as_slice()),
  875. Some(&b"val_cc".into())
  876. );
  877. assert_eq!(tree_1_cache.state.removed.len(), 1);
  878. assert_eq!(
  879. tree_1_cache.state.removed.get(b"key_a".as_slice()),
  880. Some(&b"key_a".into())
  881. );
  882. let tree_2_cache = overlay2.state.caches.get(TREE_2).unwrap();
  883. assert_eq!(tree_2_cache.state.cache.len(), 1);
  884. assert_eq!(
  885. tree_2_cache.state.cache.get(b"key_d".as_slice()),
  886. Some(&b"val_d".into())
  887. );
  888. assert_eq!(tree_2_cache.state.removed.len(), 1);
  889. assert_eq!(
  890. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  891. Some(&b"key_e".into())
  892. );
  893. let tree_4_cache = overlay2.state.caches.get(TREE_4).unwrap();
  894. assert_eq!(tree_4_cache.state.cache.len(), 1);
  895. assert_eq!(
  896. tree_4_cache.state.cache.get(b"key_f".as_slice()),
  897. Some(&b"val_f".into())
  898. );
  899. assert!(tree_4_cache.state.removed.is_empty());
  900. assert_eq!(overlay2.state.dropped_trees.len(), 2);
  901. let dropped_tree_3_cache = overlay2.state.dropped_trees.get(TREE_3).unwrap();
  902. assert_eq!(dropped_tree_3_cache.cache.len(), 1);
  903. assert_eq!(
  904. dropped_tree_3_cache.cache.get(b"key_i".as_slice()),
  905. Some(&(None, b"val_i".into()))
  906. );
  907. assert!(dropped_tree_3_cache.removed.is_empty());
  908. let dropped_tree_6_cache = overlay2.state.dropped_trees.get(TREE_6).unwrap();
  909. assert!(dropped_tree_6_cache.cache.is_empty());
  910. assert!(dropped_tree_6_cache.removed.is_empty());
  911. overlay.apply_diff(&sequence[1])?;
  912. overlay2.remove_diff(&sequence[1]);
  913. db.flush_default_mode()?;
  914. // All trees should be present in the database
  915. let db_tree_names = db.tree_names()?;
  916. assert_eq!(db_tree_names.len(), 5);
  917. assert!(db_tree_names.contains(&TREE_1.into()));
  918. assert!(db_tree_names.contains(&TREE_2.into()));
  919. assert!(db_tree_names.contains(&TREE_4.into()));
  920. assert!(db_tree_names.contains(&TREE_5.into()));
  921. assert!(db_tree_names.contains(&TREE_6.into()));
  922. let tree_1 = db.open_tree_default(TREE_1)?;
  923. assert_eq!(tree_1.len()?, 1);
  924. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_bb".into()));
  925. let tree_2 = db.open_tree_default(TREE_2)?;
  926. assert_eq!(tree_2.len()?, 2);
  927. assert_eq!(tree_2.get(b"key_d")?, Some(b"val_d".into()));
  928. assert_eq!(tree_2.get(b"key_e")?, Some(b"val_e".into()));
  929. let tree_4 = db.open_tree_default(TREE_4)?;
  930. assert_eq!(tree_4.len()?, 1);
  931. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  932. assert_eq!(overlay.state.initial_tree_names.len(), 3);
  933. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  934. assert!(overlay.state.initial_tree_names.contains(&TREE_2.into()));
  935. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  936. assert_eq!(overlay.state.new_tree_names, [TREE_5]);
  937. assert_eq!(overlay.state.caches.len(), 3);
  938. let tree_1_cache = overlay.state.caches.get(TREE_1).unwrap();
  939. assert_eq!(tree_1_cache.state.cache.len(), 2);
  940. assert_eq!(
  941. tree_1_cache.state.cache.get(b"key_a".as_slice()),
  942. Some(&b"val_a".into())
  943. );
  944. assert_eq!(
  945. tree_1_cache.state.cache.get(b"key_c".as_slice()),
  946. Some(&b"val_c".into())
  947. );
  948. assert_eq!(tree_1_cache.state.removed.len(), 1);
  949. assert_eq!(
  950. tree_1_cache.state.removed.get(b"key_b".as_slice()),
  951. Some(&b"key_b".into())
  952. );
  953. let tree_2_cache = overlay.state.caches.get(TREE_2).unwrap();
  954. assert_eq!(tree_2_cache.state.cache.len(), 1);
  955. assert_eq!(
  956. tree_2_cache.state.cache.get(b"key_f".as_slice()),
  957. Some(&b"val_f".into())
  958. );
  959. assert_eq!(tree_2_cache.state.removed.len(), 1);
  960. assert_eq!(
  961. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  962. Some(&b"key_e".into())
  963. );
  964. let tree_5_cache = overlay.state.caches.get(TREE_5).unwrap();
  965. assert_eq!(tree_5_cache.state.cache.len(), 1);
  966. assert_eq!(
  967. tree_5_cache.state.cache.get(b"key_h".as_slice()),
  968. Some(&b"val_h".into())
  969. );
  970. assert!(tree_5_cache.state.removed.is_empty());
  971. assert_eq!(overlay.state.dropped_trees.len(), 1);
  972. let dropped_tree_4_cache = overlay.state.dropped_trees.get(TREE_4).unwrap();
  973. assert_eq!(dropped_tree_4_cache.cache.len(), 1);
  974. assert_eq!(
  975. dropped_tree_4_cache.cache.get(b"key_g".as_slice()),
  976. Some(&(None, b"val_g".into()))
  977. );
  978. assert!(dropped_tree_4_cache.removed.is_empty());
  979. assert_eq!(overlay2.state.initial_tree_names.len(), 3);
  980. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  981. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  982. assert!(overlay2.state.initial_tree_names.contains(&TREE_2.into()));
  983. assert!(overlay2.state.new_tree_names.is_empty());
  984. assert_eq!(overlay2.state.caches.len(), 3);
  985. let tree_1_cache = overlay2.state.caches.get(TREE_1).unwrap();
  986. assert_eq!(tree_1_cache.state.cache.len(), 1);
  987. assert_eq!(
  988. tree_1_cache.state.cache.get(b"key_c".as_slice()),
  989. Some(&b"val_cc".into())
  990. );
  991. assert!(tree_1_cache.state.removed.is_empty());
  992. let tree_2_cache = overlay2.state.caches.get(TREE_2).unwrap();
  993. assert!(tree_2_cache.state.cache.is_empty());
  994. assert_eq!(tree_2_cache.state.removed.len(), 1);
  995. assert_eq!(
  996. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  997. Some(&b"key_e".into())
  998. );
  999. let tree_4_cache = overlay2.state.caches.get(TREE_4).unwrap();
  1000. assert_eq!(tree_4_cache.state.cache.len(), 1);
  1001. assert_eq!(
  1002. tree_4_cache.state.cache.get(b"key_f".as_slice()),
  1003. Some(&b"val_f".into())
  1004. );
  1005. assert!(tree_4_cache.state.removed.is_empty());
  1006. assert_eq!(overlay2.state.dropped_trees.len(), 1);
  1007. let dropped_tree_6_cache = overlay2.state.dropped_trees.get(TREE_6).unwrap();
  1008. assert!(dropped_tree_6_cache.cache.is_empty());
  1009. assert!(dropped_tree_6_cache.removed.is_empty());
  1010. // We chose to follow the second overlay, so we apply its diff
  1011. sequence[2] = overlay2.diff(&[])?;
  1012. overlay2.apply_diff(&sequence[2])?;
  1013. db.flush_default_mode()?;
  1014. // Since we used overlay2, we must drop the new trees from original
  1015. // overlay that are not present now, and stop using it.
  1016. db.drop_tree(TREE_5)?;
  1017. // All remaining trees should be present in the database
  1018. let db_tree_names = db.tree_names()?;
  1019. assert_eq!(db_tree_names.len(), 3);
  1020. assert!(db_tree_names.contains(&TREE_1.into()));
  1021. assert!(db_tree_names.contains(&TREE_2.into()));
  1022. assert!(db_tree_names.contains(&TREE_4.into()));
  1023. let tree_1 = db.open_tree_default(TREE_1)?;
  1024. assert_eq!(tree_1.len()?, 2);
  1025. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_bb".into()));
  1026. assert_eq!(tree_1.get(b"key_c")?, Some(b"val_cc".into()));
  1027. let tree_2 = db.open_tree_default(TREE_2)?;
  1028. assert_eq!(tree_2.len()?, 1);
  1029. assert_eq!(tree_2.get(b"key_d")?, Some(b"val_d".into()));
  1030. let tree_4 = db.open_tree_default(TREE_4)?;
  1031. assert_eq!(tree_4.len()?, 2);
  1032. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  1033. assert_eq!(tree_4.get(b"key_f")?, Some(b"val_f".into()));
  1034. // Since we removed everything, current overlay must not have
  1035. // diffs over the tree, therefore its safe to keep using it
  1036. assert_eq!(overlay2.state.initial_tree_names.len(), 3);
  1037. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  1038. assert!(overlay2.state.initial_tree_names.contains(&TREE_2.into()));
  1039. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  1040. assert!(overlay2.state.new_tree_names.is_empty());
  1041. assert!(overlay2.state.caches.is_empty());
  1042. assert!(overlay2.state.dropped_trees.is_empty());
  1043. let diff = overlay2.diff(&[])?;
  1044. assert_eq!(diff.initial_tree_names.len(), 3);
  1045. assert!(diff.initial_tree_names.contains(&TREE_1.into()));
  1046. assert!(diff.initial_tree_names.contains(&TREE_2.into()));
  1047. assert!(diff.initial_tree_names.contains(&TREE_4.into()));
  1048. assert!(diff.caches.is_empty());
  1049. assert!(diff.dropped_trees.is_empty());
  1050. // Now we are going to revert the diffs sequence going backwards
  1051. // and verify overlay state mutates accordingly
  1052. overlay2.add_diff(&sequence[2].inverse())?;
  1053. assert_eq!(overlay2.state.initial_tree_names.len(), 3);
  1054. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  1055. assert!(overlay2.state.initial_tree_names.contains(&TREE_2.into()));
  1056. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  1057. assert!(overlay2.state.new_tree_names.is_empty());
  1058. assert_eq!(overlay2.state.caches.len(), 3);
  1059. let tree_1_cache = overlay2.state.caches.get(TREE_1).unwrap();
  1060. assert!(tree_1_cache.state.cache.is_empty());
  1061. assert_eq!(tree_1_cache.state.removed.len(), 1);
  1062. assert_eq!(
  1063. tree_1_cache.state.removed.get(b"key_c".as_slice()),
  1064. Some(&b"key_c".into())
  1065. );
  1066. let tree_2_cache = overlay2.state.caches.get(TREE_2).unwrap();
  1067. assert_eq!(tree_2_cache.state.cache.len(), 1);
  1068. assert_eq!(
  1069. tree_2_cache.state.cache.get(b"key_e".as_slice()),
  1070. Some(&b"val_e".into())
  1071. );
  1072. assert!(tree_2_cache.state.removed.is_empty());
  1073. let tree_4_cache = overlay2.state.caches.get(TREE_4).unwrap();
  1074. assert!(tree_4_cache.state.cache.is_empty());
  1075. assert_eq!(tree_4_cache.state.removed.len(), 1);
  1076. assert_eq!(
  1077. tree_4_cache.state.removed.get(b"key_f".as_slice()),
  1078. Some(&b"key_f".into())
  1079. );
  1080. assert!(overlay2.state.dropped_trees.is_empty());
  1081. overlay2.add_diff(&sequence[1].inverse())?;
  1082. assert_eq!(overlay2.state.initial_tree_names.len(), 2);
  1083. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  1084. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  1085. assert_eq!(overlay2.state.new_tree_names, [TREE_3]);
  1086. assert_eq!(overlay2.state.caches.len(), 3);
  1087. let tree_1_cache = overlay2.state.caches.get(TREE_1).unwrap();
  1088. assert_eq!(tree_1_cache.state.cache.len(), 2);
  1089. assert_eq!(
  1090. tree_1_cache.state.cache.get(b"key_a".as_slice()),
  1091. Some(&b"val_a".into())
  1092. );
  1093. assert_eq!(
  1094. tree_1_cache.state.cache.get(b"key_b".as_slice()),
  1095. Some(&b"val_b".into())
  1096. );
  1097. assert_eq!(tree_1_cache.state.removed.len(), 1);
  1098. assert_eq!(
  1099. tree_1_cache.state.removed.get(b"key_c".as_slice()),
  1100. Some(&b"key_c".into())
  1101. );
  1102. let tree_4_cache = overlay2.state.caches.get(TREE_4).unwrap();
  1103. assert!(tree_4_cache.state.cache.is_empty());
  1104. assert_eq!(tree_4_cache.state.removed.len(), 1);
  1105. assert_eq!(
  1106. tree_4_cache.state.removed.get(b"key_f".as_slice()),
  1107. Some(&b"key_f".into())
  1108. );
  1109. let tree_3_cache = overlay2.state.caches.get(TREE_3).unwrap();
  1110. assert_eq!(tree_3_cache.state.cache.len(), 1);
  1111. assert_eq!(
  1112. tree_3_cache.state.cache.get(b"key_i".as_slice()),
  1113. Some(&b"val_i".into())
  1114. );
  1115. assert!(tree_3_cache.state.removed.is_empty());
  1116. assert_eq!(overlay2.state.dropped_trees.len(), 1);
  1117. let dropped_tree_2_cache = overlay2.state.dropped_trees.get(TREE_2).unwrap();
  1118. assert!(dropped_tree_2_cache.cache.is_empty());
  1119. assert_eq!(dropped_tree_2_cache.removed.len(), 2);
  1120. assert_eq!(
  1121. dropped_tree_2_cache.removed.get(b"key_d".as_slice()),
  1122. Some(&b"val_d".into())
  1123. );
  1124. assert_eq!(
  1125. dropped_tree_2_cache.removed.get(b"key_e".as_slice()),
  1126. Some(&b"val_e".into())
  1127. );
  1128. overlay2.add_diff(&sequence[0].inverse())?;
  1129. assert_eq!(overlay2.state.initial_tree_names.len(), 2);
  1130. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  1131. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  1132. assert!(overlay2.state.new_tree_names.is_empty());
  1133. assert_eq!(overlay2.state.caches.len(), 2);
  1134. let tree_1_cache = overlay2.state.caches.get(TREE_1).unwrap();
  1135. assert_eq!(tree_1_cache.state.cache.len(), 1);
  1136. assert_eq!(
  1137. tree_1_cache.state.cache.get(b"key_a".as_slice()),
  1138. Some(&b"val_a".into())
  1139. );
  1140. assert_eq!(tree_1_cache.state.removed.len(), 2);
  1141. assert_eq!(
  1142. tree_1_cache.state.removed.get(b"key_b".as_slice()),
  1143. Some(&b"key_b".into())
  1144. );
  1145. assert_eq!(
  1146. tree_1_cache.state.removed.get(b"key_c".as_slice()),
  1147. Some(&b"key_c".into())
  1148. );
  1149. let tree_4_cache = overlay2.state.caches.get(TREE_4).unwrap();
  1150. assert!(tree_4_cache.state.cache.is_empty());
  1151. assert_eq!(tree_4_cache.state.removed.len(), 1);
  1152. assert_eq!(
  1153. tree_4_cache.state.removed.get(b"key_f".as_slice()),
  1154. Some(&b"key_f".into())
  1155. );
  1156. assert_eq!(overlay2.state.dropped_trees.len(), 2);
  1157. let dropped_tree_2_cache = overlay2.state.dropped_trees.get(TREE_2).unwrap();
  1158. assert!(dropped_tree_2_cache.cache.is_empty());
  1159. assert_eq!(dropped_tree_2_cache.removed.len(), 2);
  1160. assert_eq!(
  1161. dropped_tree_2_cache.removed.get(b"key_d".as_slice()),
  1162. Some(&b"val_d".into())
  1163. );
  1164. assert_eq!(
  1165. dropped_tree_2_cache.removed.get(b"key_e".as_slice()),
  1166. Some(&b"val_e".into())
  1167. );
  1168. let dropped_tree_3_cache = overlay2.state.dropped_trees.get(TREE_3).unwrap();
  1169. assert!(dropped_tree_3_cache.cache.is_empty());
  1170. assert_eq!(dropped_tree_3_cache.removed.len(), 1);
  1171. assert_eq!(
  1172. dropped_tree_3_cache.removed.get(b"key_i".as_slice()),
  1173. Some(&b"val_i".into())
  1174. );
  1175. // We are now going to apply the overlay and remove the complete diff
  1176. let diff = overlay2.diff(&[])?;
  1177. overlay2.apply()?;
  1178. overlay2.remove_diff(&diff);
  1179. db.flush_default_mode()?;
  1180. // Since we removed everything, current overlay must not have
  1181. // diffs over the tree, therefore its safe to keep using it
  1182. assert_eq!(overlay2.state.initial_tree_names.len(), 2);
  1183. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  1184. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  1185. assert!(overlay2.state.new_tree_names.is_empty());
  1186. assert!(overlay2.state.caches.is_empty());
  1187. assert!(overlay2.state.dropped_trees.is_empty());
  1188. let diff = overlay2.diff(&[])?;
  1189. assert!(diff.caches.is_empty());
  1190. assert!(diff.dropped_trees.is_empty());
  1191. // Database has now reverted to its original state
  1192. let db_tree_names = db.tree_names()?;
  1193. assert_eq!(db_tree_names.len(), 2);
  1194. assert!(db_tree_names.contains(&TREE_1.into()));
  1195. assert!(db_tree_names.contains(&TREE_4.into()));
  1196. let tree_1 = db.open_tree_default(TREE_1)?;
  1197. assert_eq!(tree_1.len()?, 1);
  1198. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  1199. let tree_4 = db.open_tree_default(TREE_4)?;
  1200. assert_eq!(tree_4.len()?, 1);
  1201. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  1202. Ok(())
  1203. }
  1204. #[test]
  1205. fn database_overlay_protected_trees() -> Result<()> {
  1206. // Initialize database
  1207. let (db, _folder) = Database::open_temp()?;
  1208. // Initialize trees with some values
  1209. let tree_1 = db.open_tree_default(TREE_1)?;
  1210. tree_1.insert(b"key_a", b"val_a")?;
  1211. let tree_4 = db.open_tree_default(TREE_4)?;
  1212. tree_4.insert(b"key_g", b"val_g")?;
  1213. // Initialize overlay
  1214. let mut overlay = DatabaseOverlay::new(&db, vec![TREE_1.into(), TREE_4.into()])?;
  1215. // Open trees in the overlay
  1216. overlay.open_tree_default(TREE_1, false)?;
  1217. overlay.open_tree_default(TREE_3, false)?;
  1218. // Try to remove protected trees
  1219. assert!(overlay.drop_tree(TREE_1).is_err());
  1220. assert!(overlay.drop_tree(TREE_4).is_err());
  1221. // Make a vector to keep track of changes
  1222. let mut sequence = vec![];
  1223. // Perform some changes and grab their differences
  1224. overlay.insert(TREE_1, b"key_b", b"val_b")?;
  1225. overlay.insert(TREE_3, b"key_i", b"val_i")?;
  1226. sequence.push(overlay.diff(&sequence)?);
  1227. overlay.open_tree_default(TREE_2, false)?;
  1228. overlay.insert(TREE_2, b"key_d", b"val_d")?;
  1229. overlay.insert(TREE_2, b"key_e", b"val_e")?;
  1230. overlay.open_tree_default(TREE_5, false)?;
  1231. overlay.insert(TREE_5, b"key_h", b"val_h")?;
  1232. sequence.push(overlay.diff(&sequence)?);
  1233. overlay.drop_tree(TREE_3)?;
  1234. overlay.remove(TREE_2, b"key_e")?;
  1235. overlay.insert(TREE_2, b"key_f", b"val_f")?;
  1236. sequence.push(overlay.diff(&sequence)?);
  1237. // Verify overlay has the correct state
  1238. assert_eq!(overlay.state.initial_tree_names.len(), 2);
  1239. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  1240. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  1241. assert_eq!(overlay.state.new_tree_names, [TREE_2, TREE_5]);
  1242. assert_eq!(overlay.state.caches.len(), 3);
  1243. let tree_1_cache = overlay.state.caches.get(TREE_1).unwrap();
  1244. assert_eq!(tree_1_cache.state.cache.len(), 1);
  1245. assert_eq!(
  1246. tree_1_cache.state.cache.get(b"key_b".as_slice()),
  1247. Some(&b"val_b".into())
  1248. );
  1249. assert!(tree_1_cache.state.removed.is_empty());
  1250. let tree_2_cache = overlay.state.caches.get(TREE_2).unwrap();
  1251. assert_eq!(tree_2_cache.state.cache.len(), 2);
  1252. assert_eq!(
  1253. tree_2_cache.state.cache.get(b"key_d".as_slice()),
  1254. Some(&b"val_d".into())
  1255. );
  1256. assert_eq!(
  1257. tree_2_cache.state.cache.get(b"key_f".as_slice()),
  1258. Some(&b"val_f".into())
  1259. );
  1260. assert_eq!(tree_2_cache.state.removed.len(), 1);
  1261. assert_eq!(
  1262. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  1263. Some(&b"key_e".into())
  1264. );
  1265. let tree_5_cache = overlay.state.caches.get(TREE_5).unwrap();
  1266. assert_eq!(tree_5_cache.state.cache.len(), 1);
  1267. assert_eq!(
  1268. tree_5_cache.state.cache.get(b"key_h".as_slice()),
  1269. Some(&b"val_h".into())
  1270. );
  1271. assert!(tree_5_cache.state.removed.is_empty());
  1272. assert_eq!(overlay.state.dropped_trees.len(), 1);
  1273. let dropped_tree_3_cache = overlay.state.dropped_trees.get(TREE_3).unwrap();
  1274. assert!(dropped_tree_3_cache.cache.is_empty());
  1275. assert!(dropped_tree_3_cache.removed.is_empty());
  1276. assert_eq!(overlay.state.protected_tree_names.len(), 2);
  1277. assert!(overlay.state.protected_tree_names.contains(&TREE_1.into()));
  1278. assert!(overlay.state.protected_tree_names.contains(&TREE_4.into()));
  1279. // Verify diffs sequence is correct
  1280. assert_eq!(sequence.len(), 3);
  1281. assert_eq!(sequence[0].initial_tree_names.len(), 2);
  1282. assert!(sequence[0].initial_tree_names.contains(&TREE_1.into()));
  1283. assert!(sequence[0].initial_tree_names.contains(&TREE_4.into()));
  1284. assert_eq!(sequence[0].caches.len(), 2);
  1285. let (tree_1_cache, drop) = sequence[0].caches.get(TREE_1).unwrap();
  1286. assert_eq!(tree_1_cache.cache.len(), 1);
  1287. assert_eq!(
  1288. tree_1_cache.cache.get(b"key_b".as_slice()),
  1289. Some(&(None, b"val_b".into()))
  1290. );
  1291. assert!(tree_1_cache.removed.is_empty());
  1292. assert!(!drop);
  1293. let (tree_3_cache, drop) = sequence[0].caches.get(TREE_3).unwrap();
  1294. assert_eq!(tree_3_cache.cache.len(), 1);
  1295. assert_eq!(
  1296. tree_3_cache.cache.get(b"key_i".as_slice()),
  1297. Some(&(None, b"val_i".into()))
  1298. );
  1299. assert!(tree_3_cache.removed.is_empty());
  1300. assert!(!drop);
  1301. assert!(sequence[0].dropped_trees.is_empty());
  1302. assert_eq!(sequence[0], sequence[0].inverse().inverse());
  1303. assert_eq!(sequence[1].initial_tree_names.len(), 3);
  1304. assert!(sequence[1].initial_tree_names.contains(&TREE_1.into()));
  1305. assert!(sequence[1].initial_tree_names.contains(&TREE_4.into()));
  1306. assert!(sequence[1].initial_tree_names.contains(&TREE_3.into()));
  1307. assert_eq!(sequence[1].caches.len(), 2);
  1308. let (tree_2_cache, drop) = sequence[1].caches.get(TREE_2).unwrap();
  1309. assert_eq!(tree_2_cache.cache.len(), 2);
  1310. assert_eq!(
  1311. tree_2_cache.cache.get(b"key_d".as_slice()),
  1312. Some(&(None, b"val_d".into()))
  1313. );
  1314. assert_eq!(
  1315. tree_2_cache.cache.get(b"key_e".as_slice()),
  1316. Some(&(None, b"val_e".into()))
  1317. );
  1318. assert!(tree_2_cache.removed.is_empty());
  1319. assert!(!drop);
  1320. let (tree_5_cache, drop) = sequence[1].caches.get(TREE_5).unwrap();
  1321. assert_eq!(tree_5_cache.cache.len(), 1);
  1322. assert_eq!(
  1323. tree_5_cache.cache.get(b"key_h".as_slice()),
  1324. Some(&(None, b"val_h".into()))
  1325. );
  1326. assert!(tree_5_cache.removed.is_empty());
  1327. assert!(!drop);
  1328. assert!(sequence[1].dropped_trees.is_empty());
  1329. assert_eq!(sequence[1], sequence[1].inverse().inverse());
  1330. assert_eq!(sequence[2].initial_tree_names.len(), 5);
  1331. assert!(sequence[2].initial_tree_names.contains(&TREE_1.into()));
  1332. assert!(sequence[2].initial_tree_names.contains(&TREE_4.into()));
  1333. assert!(sequence[2].initial_tree_names.contains(&TREE_3.into()));
  1334. assert!(sequence[2].initial_tree_names.contains(&TREE_2.into()));
  1335. assert!(sequence[2].initial_tree_names.contains(&TREE_5.into()));
  1336. assert_eq!(sequence[2].caches.len(), 1);
  1337. let (tree_2_cache, drop) = sequence[2].caches.get(TREE_2).unwrap();
  1338. assert_eq!(tree_2_cache.cache.len(), 1);
  1339. assert_eq!(
  1340. tree_2_cache.cache.get(b"key_f".as_slice()),
  1341. Some(&(None, b"val_f".into()))
  1342. );
  1343. assert_eq!(tree_2_cache.removed.len(), 1);
  1344. assert_eq!(
  1345. tree_2_cache.removed.get(b"key_e".as_slice()),
  1346. Some(&b"val_e".into())
  1347. );
  1348. assert!(!drop);
  1349. assert_eq!(sequence[2].dropped_trees.len(), 1);
  1350. let (dropped_tree_3_cache, restored) = sequence[2].dropped_trees.get(TREE_3).unwrap();
  1351. assert_eq!(dropped_tree_3_cache.cache.len(), 1);
  1352. assert_eq!(
  1353. dropped_tree_3_cache.cache.get(b"key_i".as_slice()),
  1354. Some(&(None, b"val_i".into()))
  1355. );
  1356. assert!(dropped_tree_3_cache.removed.is_empty());
  1357. assert!(!restored);
  1358. assert_eq!(sequence[2], sequence[2].inverse().inverse());
  1359. // Now we are going to apply each diff and check that the database
  1360. // and the overlay have been mutated accordingly.
  1361. // Don't forget to flush.
  1362. overlay.apply_diff(&sequence[0])?;
  1363. db.flush_default_mode()?;
  1364. // All trees should be present in the database
  1365. let db_tree_names = db.tree_names()?;
  1366. assert_eq!(db_tree_names.len(), 5);
  1367. assert!(db_tree_names.contains(&TREE_1.into()));
  1368. assert!(db_tree_names.contains(&TREE_2.into()));
  1369. assert!(db_tree_names.contains(&TREE_3.into()));
  1370. assert!(db_tree_names.contains(&TREE_4.into()));
  1371. assert!(db_tree_names.contains(&TREE_5.into()));
  1372. let tree_1 = db.open_tree_default(TREE_1)?;
  1373. assert_eq!(tree_1.len()?, 2);
  1374. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  1375. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_b".into()));
  1376. let tree_2 = db.open_tree_default(TREE_2)?;
  1377. assert!(tree_2.is_empty()?);
  1378. let tree_3 = db.open_tree_default(TREE_3)?;
  1379. assert_eq!(tree_3.len()?, 1);
  1380. assert_eq!(tree_3.get(b"key_i")?, Some(b"val_i".into()));
  1381. let tree_4 = db.open_tree_default(TREE_4)?;
  1382. assert_eq!(tree_4.len()?, 1);
  1383. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  1384. let tree_5 = db.open_tree_default(TREE_5)?;
  1385. assert!(tree_5.is_empty()?);
  1386. assert_eq!(overlay.state.initial_tree_names.len(), 3);
  1387. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  1388. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  1389. assert!(overlay.state.initial_tree_names.contains(&TREE_3.into()));
  1390. assert_eq!(overlay.state.new_tree_names, [TREE_2, TREE_5]);
  1391. assert_eq!(overlay.state.caches.len(), 3);
  1392. // Tree 1 here became stale, but since its protected it just got reset
  1393. let tree_1_cache = overlay.state.caches.get(TREE_1).unwrap();
  1394. assert!(tree_1_cache.state.cache.is_empty());
  1395. assert!(tree_1_cache.state.removed.is_empty());
  1396. let tree_2_cache = overlay.state.caches.get(TREE_2).unwrap();
  1397. assert_eq!(tree_2_cache.state.cache.len(), 2);
  1398. assert_eq!(
  1399. tree_2_cache.state.cache.get(b"key_d".as_slice()),
  1400. Some(&b"val_d".into())
  1401. );
  1402. assert_eq!(
  1403. tree_2_cache.state.cache.get(b"key_f".as_slice()),
  1404. Some(&b"val_f".into())
  1405. );
  1406. assert_eq!(tree_2_cache.state.removed.len(), 1);
  1407. assert_eq!(
  1408. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  1409. Some(&b"key_e".into())
  1410. );
  1411. let tree_5_cache = overlay.state.caches.get(TREE_5).unwrap();
  1412. assert_eq!(tree_5_cache.state.cache.len(), 1);
  1413. assert_eq!(
  1414. tree_5_cache.state.cache.get(b"key_h".as_slice()),
  1415. Some(&b"val_h".into())
  1416. );
  1417. assert!(tree_5_cache.state.removed.is_empty());
  1418. assert_eq!(overlay.state.dropped_trees.len(), 1);
  1419. let dropped_tree_3_cache = overlay.state.dropped_trees.get(TREE_3).unwrap();
  1420. assert_eq!(dropped_tree_3_cache.cache.len(), 1);
  1421. assert_eq!(
  1422. dropped_tree_3_cache.cache.get(b"key_i".as_slice()),
  1423. Some(&(None, b"val_i".into()))
  1424. );
  1425. assert!(dropped_tree_3_cache.removed.is_empty());
  1426. assert_eq!(overlay.state.protected_tree_names.len(), 2);
  1427. assert!(overlay.state.protected_tree_names.contains(&TREE_1.into()));
  1428. assert!(overlay.state.protected_tree_names.contains(&TREE_4.into()));
  1429. overlay.apply_diff(&sequence[1])?;
  1430. db.flush_default_mode()?;
  1431. // All trees should be present in the database
  1432. let db_tree_names = db.tree_names()?;
  1433. assert_eq!(db_tree_names.len(), 5);
  1434. assert!(db_tree_names.contains(&TREE_1.into()));
  1435. assert!(db_tree_names.contains(&TREE_2.into()));
  1436. assert!(db_tree_names.contains(&TREE_3.into()));
  1437. assert!(db_tree_names.contains(&TREE_4.into()));
  1438. assert!(db_tree_names.contains(&TREE_5.into()));
  1439. let tree_1 = db.open_tree_default(TREE_1)?;
  1440. assert_eq!(tree_1.len()?, 2);
  1441. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  1442. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_b".into()));
  1443. let tree_2 = db.open_tree_default(TREE_2)?;
  1444. assert_eq!(tree_2.len()?, 2);
  1445. assert_eq!(tree_2.get(b"key_d")?, Some(b"val_d".into()));
  1446. assert_eq!(tree_2.get(b"key_e")?, Some(b"val_e".into()));
  1447. let tree_4 = db.open_tree_default(TREE_4)?;
  1448. assert_eq!(tree_4.len()?, 1);
  1449. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  1450. let tree_5 = db.open_tree_default(TREE_5)?;
  1451. assert_eq!(tree_5.len()?, 1);
  1452. assert_eq!(tree_5.get(b"key_h")?, Some(b"val_h".into()));
  1453. assert_eq!(overlay.state.initial_tree_names.len(), 5);
  1454. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  1455. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  1456. assert!(overlay.state.initial_tree_names.contains(&TREE_3.into()));
  1457. assert!(overlay.state.initial_tree_names.contains(&TREE_2.into()));
  1458. assert!(overlay.state.initial_tree_names.contains(&TREE_5.into()));
  1459. assert!(overlay.state.new_tree_names.is_empty());
  1460. // Tree 5 was stale so it should have been closed
  1461. assert_eq!(overlay.state.caches.len(), 2);
  1462. // Tree 1 reference stays alive
  1463. let tree_1_cache = overlay.state.caches.get(TREE_1).unwrap();
  1464. assert!(tree_1_cache.state.cache.is_empty());
  1465. assert!(tree_1_cache.state.removed.is_empty());
  1466. let tree_2_cache = overlay.state.caches.get(TREE_2).unwrap();
  1467. assert_eq!(tree_2_cache.state.cache.len(), 1);
  1468. assert_eq!(
  1469. tree_2_cache.state.cache.get(b"key_f".as_slice()),
  1470. Some(&b"val_f".into())
  1471. );
  1472. assert_eq!(tree_2_cache.state.removed.len(), 1);
  1473. assert_eq!(
  1474. tree_2_cache.state.removed.get(b"key_e".as_slice()),
  1475. Some(&b"key_e".into())
  1476. );
  1477. assert_eq!(overlay.state.dropped_trees.len(), 1);
  1478. let dropped_tree_3_cache = overlay.state.dropped_trees.get(TREE_3).unwrap();
  1479. assert_eq!(dropped_tree_3_cache.cache.len(), 1);
  1480. assert_eq!(
  1481. dropped_tree_3_cache.cache.get(b"key_i".as_slice()),
  1482. Some(&(None, b"val_i".into()))
  1483. );
  1484. assert!(dropped_tree_3_cache.removed.is_empty());
  1485. assert_eq!(overlay.state.protected_tree_names.len(), 2);
  1486. assert!(overlay.state.protected_tree_names.contains(&TREE_1.into()));
  1487. assert!(overlay.state.protected_tree_names.contains(&TREE_4.into()));
  1488. overlay.apply_diff(&sequence[2])?;
  1489. db.flush_default_mode()?;
  1490. // All trees should be present in the database
  1491. let db_tree_names = db.tree_names()?;
  1492. assert_eq!(db_tree_names.len(), 4);
  1493. assert!(db_tree_names.contains(&TREE_1.into()));
  1494. assert!(db_tree_names.contains(&TREE_4.into()));
  1495. assert!(db_tree_names.contains(&TREE_2.into()));
  1496. assert!(db_tree_names.contains(&TREE_5.into()));
  1497. let tree_1 = db.open_tree_default(TREE_1)?;
  1498. assert_eq!(tree_1.len()?, 2);
  1499. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  1500. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_b".into()));
  1501. let tree_2 = db.open_tree_default(TREE_2)?;
  1502. assert_eq!(tree_2.len()?, 2);
  1503. assert_eq!(tree_2.get(b"key_d")?, Some(b"val_d".into()));
  1504. assert_eq!(tree_2.get(b"key_f")?, Some(b"val_f".into()));
  1505. let tree_4 = db.open_tree_default(TREE_4)?;
  1506. assert_eq!(tree_4.len()?, 1);
  1507. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  1508. let tree_5 = db.open_tree_default(TREE_5)?;
  1509. assert_eq!(tree_5.len()?, 1);
  1510. assert_eq!(tree_5.get(b"key_h")?, Some(b"val_h".into()));
  1511. // Since we removed everything, current overlay must not have
  1512. // diffs over the tree, just the protected opened references,
  1513. // therefore its safe to keep using it
  1514. assert_eq!(overlay.state.initial_tree_names.len(), 4);
  1515. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  1516. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  1517. assert!(overlay.state.initial_tree_names.contains(&TREE_2.into()));
  1518. assert!(overlay.state.initial_tree_names.contains(&TREE_5.into()));
  1519. assert!(overlay.state.new_tree_names.is_empty());
  1520. // Tree 1 reference stays alive
  1521. assert_eq!(overlay.state.caches.len(), 1);
  1522. let tree_1_cache = overlay.state.caches.get(TREE_1).unwrap();
  1523. assert!(tree_1_cache.state.cache.is_empty());
  1524. assert!(tree_1_cache.state.removed.is_empty());
  1525. assert!(overlay.state.dropped_trees.is_empty());
  1526. assert_eq!(overlay.state.protected_tree_names.len(), 2);
  1527. assert!(overlay.state.protected_tree_names.contains(&TREE_1.into()));
  1528. assert!(overlay.state.protected_tree_names.contains(&TREE_4.into()));
  1529. let diff = overlay.diff(&[])?;
  1530. // Even if Tree 1 reference is alive, it produces no diff over the
  1531. // tree.
  1532. assert!(diff.caches.is_empty());
  1533. assert!(diff.dropped_trees.is_empty());
  1534. // Now we are going to create an overlay where Tree 1 is not
  1535. // protected, drop it, produce its diff and try to apply it to the
  1536. // original overlay.
  1537. let mut overlay2 = DatabaseOverlay::new(&db, vec![])?;
  1538. overlay2.drop_tree(TREE_1)?;
  1539. assert_eq!(overlay2.state.initial_tree_names.len(), 4);
  1540. assert!(overlay2.state.initial_tree_names.contains(&TREE_1.into()));
  1541. assert!(overlay2.state.initial_tree_names.contains(&TREE_4.into()));
  1542. assert!(overlay2.state.initial_tree_names.contains(&TREE_2.into()));
  1543. assert!(overlay2.state.initial_tree_names.contains(&TREE_5.into()));
  1544. assert!(overlay2.state.new_tree_names.is_empty());
  1545. assert!(overlay2.state.caches.is_empty());
  1546. assert_eq!(overlay2.state.dropped_trees.len(), 1);
  1547. let dropped_tree_1_cache = overlay2.state.dropped_trees.get(TREE_1).unwrap();
  1548. assert_eq!(dropped_tree_1_cache.cache.len(), 2);
  1549. assert_eq!(
  1550. dropped_tree_1_cache.cache.get(b"key_a".as_slice()),
  1551. Some(&(None, b"val_a".into()))
  1552. );
  1553. assert_eq!(
  1554. dropped_tree_1_cache.cache.get(b"key_b".as_slice()),
  1555. Some(&(None, b"val_b".into()))
  1556. );
  1557. assert!(dropped_tree_1_cache.removed.is_empty());
  1558. assert!(overlay2.state.protected_tree_names.is_empty());
  1559. let diff = overlay2.diff(&[])?;
  1560. assert!(diff.caches.is_empty());
  1561. assert_eq!(diff.dropped_trees.len(), 1);
  1562. let (dropped_tree_1_cache, restored) = diff.dropped_trees.get(TREE_1).unwrap();
  1563. assert_eq!(dropped_tree_1_cache.cache.len(), 2);
  1564. assert_eq!(
  1565. dropped_tree_1_cache.cache.get(b"key_a".as_slice()),
  1566. Some(&(None, b"val_a".into()))
  1567. );
  1568. assert_eq!(
  1569. dropped_tree_1_cache.cache.get(b"key_b".as_slice()),
  1570. Some(&(None, b"val_b".into()))
  1571. );
  1572. assert!(dropped_tree_1_cache.removed.is_empty());
  1573. assert!(!restored);
  1574. assert_eq!(diff, diff.inverse().inverse());
  1575. assert!(overlay.apply_diff(&diff).is_err());
  1576. // Now we are going to revert the diffs sequence going backwards
  1577. // and verify the database state mutates accordingly
  1578. overlay.apply_diff(&sequence[2].inverse())?;
  1579. db.flush_default_mode()?;
  1580. let db_tree_names = db.tree_names()?;
  1581. assert_eq!(db_tree_names.len(), 5);
  1582. assert!(db_tree_names.contains(&TREE_1.into()));
  1583. assert!(db_tree_names.contains(&TREE_4.into()));
  1584. assert!(db_tree_names.contains(&TREE_2.into()));
  1585. assert!(db_tree_names.contains(&TREE_3.into()));
  1586. assert!(db_tree_names.contains(&TREE_5.into()));
  1587. let tree_1 = db.open_tree_default(TREE_1)?;
  1588. assert_eq!(tree_1.len()?, 2);
  1589. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  1590. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_b".into()));
  1591. let tree_2 = db.open_tree_default(TREE_2)?;
  1592. assert_eq!(tree_2.len()?, 2);
  1593. assert_eq!(tree_2.get(b"key_d")?, Some(b"val_d".into()));
  1594. assert_eq!(tree_2.get(b"key_e")?, Some(b"val_e".into()));
  1595. let tree_3 = db.open_tree_default(TREE_3)?;
  1596. assert_eq!(tree_3.len()?, 1);
  1597. assert_eq!(tree_3.get(b"key_i")?, Some(b"val_i".into()));
  1598. let tree_4 = db.open_tree_default(TREE_4)?;
  1599. assert_eq!(tree_4.len()?, 1);
  1600. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  1601. let tree_5 = db.open_tree_default(TREE_5)?;
  1602. assert_eq!(tree_5.len()?, 1);
  1603. assert_eq!(tree_5.get(b"key_h")?, Some(b"val_h".into()));
  1604. overlay.apply_diff(&sequence[1].inverse())?;
  1605. db.flush_default_mode()?;
  1606. let db_tree_names = db.tree_names()?;
  1607. assert_eq!(db_tree_names.len(), 3);
  1608. assert!(db_tree_names.contains(&TREE_1.into()));
  1609. assert!(db_tree_names.contains(&TREE_4.into()));
  1610. assert!(db_tree_names.contains(&TREE_3.into()));
  1611. let tree_1 = db.open_tree_default(TREE_1)?;
  1612. assert_eq!(tree_1.len()?, 2);
  1613. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  1614. assert_eq!(tree_1.get(b"key_b")?, Some(b"val_b".into()));
  1615. let tree_3 = db.open_tree_default(TREE_3)?;
  1616. assert_eq!(tree_3.len()?, 1);
  1617. assert_eq!(tree_3.get(b"key_i")?, Some(b"val_i".into()));
  1618. let tree_4 = db.open_tree_default(TREE_4)?;
  1619. assert_eq!(tree_4.len()?, 1);
  1620. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  1621. overlay.apply_diff(&sequence[0].inverse())?;
  1622. db.flush_default_mode()?;
  1623. // Since we removed everything, current overlay must not have
  1624. // diffs over the tree, therefore its safe to keep using it
  1625. assert_eq!(overlay.state.initial_tree_names.len(), 2);
  1626. assert!(overlay.state.initial_tree_names.contains(&TREE_1.into()));
  1627. assert!(overlay.state.initial_tree_names.contains(&TREE_4.into()));
  1628. assert!(overlay.state.new_tree_names.is_empty());
  1629. // Tree 1 reference stays alive
  1630. assert_eq!(overlay.state.caches.len(), 1);
  1631. let tree_1_cache = overlay.state.caches.get(TREE_1).unwrap();
  1632. assert!(tree_1_cache.state.cache.is_empty());
  1633. assert!(tree_1_cache.state.removed.is_empty());
  1634. assert!(overlay.state.dropped_trees.is_empty());
  1635. assert_eq!(overlay.state.protected_tree_names.len(), 2);
  1636. assert!(overlay.state.protected_tree_names.contains(&TREE_1.into()));
  1637. assert!(overlay.state.protected_tree_names.contains(&TREE_4.into()));
  1638. let diff = overlay.diff(&[])?;
  1639. assert!(diff.caches.is_empty());
  1640. assert!(diff.dropped_trees.is_empty());
  1641. // The database has now reverted to its original state
  1642. let db_tree_names = db.tree_names()?;
  1643. assert_eq!(db_tree_names.len(), 2);
  1644. assert!(db_tree_names.contains(&TREE_1.into()));
  1645. assert!(db_tree_names.contains(&TREE_4.into()));
  1646. let tree_1 = db.open_tree_default(TREE_1)?;
  1647. assert_eq!(tree_1.len()?, 1);
  1648. assert_eq!(tree_1.get(b"key_a")?, Some(b"val_a".into()));
  1649. let tree_4 = db.open_tree_default(TREE_4)?;
  1650. assert_eq!(tree_4.len()?, 1);
  1651. assert_eq!(tree_4.get(b"key_g")?, Some(b"val_g".into()));
  1652. Ok(())
  1653. }