From 557392fe0672bc6b83ef2e0fec2c8ff7a6f22a54 Mon Sep 17 00:00:00 2001 From: Determinant Date: Wed, 10 Jun 2020 22:35:21 -0400 Subject: fix bugs in dealing with long WAL rings --- tests/rand_fail.rs | 65 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 15 deletions(-) (limited to 'tests/rand_fail.rs') diff --git a/tests/rand_fail.rs b/tests/rand_fail.rs index b4e30ac..0cd519c 100644 --- a/tests/rand_fail.rs +++ b/tests/rand_fail.rs @@ -1,26 +1,61 @@ #[cfg(test)] -extern crate growthring; -use growthring::wal::{WALLoader, WALWriter, WALStore, WALRingId, WALBytes}; - mod common; +use growthring::wal::{WALLoader, WALWriter, WALStore, WALRingId, WALBytes, WALPos}; +use common::{FailGen, SingleFailGen, Canvas, WALStoreEmulState, WALStoreEmul, PaintStrokes}; -fn test(records: Vec, wal: &mut WALWriter) -> Box<[WALRingId]> { - let records: Vec = records.into_iter().map(|s| s.into_bytes().into_boxed_slice()).collect(); - let ret = wal.grow(&records).unwrap(); - for ring_id in ret.iter() { - println!("got ring id: {:?}", ring_id); +fn run(n: usize, m: usize, k: usize, + canvas: &mut Canvas, wal: &mut WALWriter, trace: &mut Vec, + rng: &mut R) -> Result<(), ()> { + for i in 0..n { + let s = (0..m).map(|_| + PaintStrokes::gen_rand(1000, 10, 256, 5, rng)).collect::>(); + let recs = s.iter().map(|e| e.to_bytes()).collect::>(); + // write ahead + let rids = wal.grow(recs)?; + for rid in rids.iter() { + println!("got ring id: {:?}", rid); + } + // WAL append done + // prepare data writes + for (e, rid) in s.iter().zip(rids.iter()) { + canvas.prepaint(e, &*rid) + } + // run the scheduler for a bit + for _ in 0..k { + if let Some((fin_rid, t)) = canvas.rand_paint(rng) { + if let Some(rid) = fin_rid { + wal.peel(&[rid])? + } + trace.push(t); + } else { break } + } + } + while let Some((fin_rid, t)) = canvas.rand_paint(rng) { + if let Some(rid) = fin_rid { + wal.peel(&[rid])? + } + trace.push(t); } - ret + canvas.print(40); + Ok(()) +} + +fn check(canvas: &mut Canvas, wal: &mut WALLoader, trace: &Vec) -> bool { + true } #[test] fn test_rand_fail() { - let fgen = common::SingleFailGen::new(100); - let mut state = common::WALStoreEmulState::new(); - let mut wal = WALLoader::new(common::WALStoreEmul::new(&mut state, fgen), 9, 8, 1000).recover().unwrap(); - for _ in 0..3 { - test(["hi", "hello", "lol"].iter().map(|s| s.to_string()).collect::>(), &mut wal); - } + let fgen = SingleFailGen::new(100000); + let n = 100; + let m = 10; + let k = 100; + let mut rng = rand::thread_rng(); + let mut state = WALStoreEmulState::new(); + let mut wal = WALLoader::new(WALStoreEmul::new(&mut state, fgen), 9, 8, 1000).recover().unwrap(); + let mut trace: Vec = Vec::new(); + let mut canvas = Canvas::new(1000); + run(n, m, k, &mut canvas, &mut wal, &mut trace, &mut rng).unwrap(); WALLoader::new(common::WALStoreEmul::new(&mut state, common::ZeroFailGen), 9, 8, 1000).recover().unwrap(); } -- cgit v1.2.3-70-g09d2