[space_map (rust)] Fix space map building

- Fix out-of-bounds index
- Automatically flush queued writes before function return
- Track allocated blocks in write_batcher (might be space consuming)
This commit is contained in:
Ming-Hung Tsai 2021-05-26 01:41:37 +08:00
parent 13d6c72ad9
commit c142cd0d48
4 changed files with 4 additions and 1 deletions

View File

@ -209,7 +209,7 @@ pub fn write_common(w: &mut WriteBatcher, sm: &dyn SpaceMap) -> Result<(Vec<Inde
let mut nr_free: u32 = 0; let mut nr_free: u32 = 0;
for i in 0..ENTRIES_PER_BITMAP { for i in 0..ENTRIES_PER_BITMAP {
let b: u64 = ((bm * ENTRIES_PER_BITMAP) as u64) + i as u64; let b: u64 = ((bm * ENTRIES_PER_BITMAP) as u64) + i as u64;
if b > sm.get_nr_blocks()? { if b >= sm.get_nr_blocks()? {
break; break;
} }
let rc = sm.get(b)?; let rc = sm.get(b)?;

View File

@ -16,6 +16,7 @@ pub fn write_disk_sm(w: &mut WriteBatcher, sm: &dyn SpaceMap) -> Result<SMRoot>
} }
let bitmap_root = index_builder.complete(w)?; let bitmap_root = index_builder.complete(w)?;
w.flush()?;
Ok(SMRoot { Ok(SMRoot {
nr_blocks: sm.get_nr_blocks()?, nr_blocks: sm.get_nr_blocks()?,

View File

@ -126,6 +126,7 @@ pub fn write_metadata_sm(w: &mut WriteBatcher, sm: &dyn SpaceMap) -> Result<SMRo
metadata_index.pack(&mut cur)?; metadata_index.pack(&mut cur)?;
let loc = bitmap_root.loc; let loc = bitmap_root.loc;
w.write(bitmap_root, checksum::BT::INDEX)?; w.write(bitmap_root, checksum::BT::INDEX)?;
w.flush()?;
Ok(SMRoot { Ok(SMRoot {
nr_blocks: sm.get_nr_blocks()?, nr_blocks: sm.get_nr_blocks()?,

View File

@ -43,6 +43,7 @@ impl WriteBatcher {
return Err(anyhow!("out of metadata space")); return Err(anyhow!("out of metadata space"));
} }
self.allocations.insert(b.unwrap());
Ok(Block::new(b.unwrap())) Ok(Block::new(b.unwrap()))
} }