LCOV - code coverage report
Current view: top level - safekeeper/tests/walproposer_sim - block_storage.rs (source / functions) Coverage Total Hit
Test: d3dc80ba303d573d9d44a7f3290f1b1b48b7e1a0.info Lines: 92.3 % 39 36
Test Date: 2024-06-25 11:53:14 Functions: 75.0 % 12 9

            Line data    Source code
       1              : use std::collections::HashMap;
       2              : 
       3              : const BLOCK_SIZE: usize = 8192;
       4              : 
       5              : /// A simple in-memory implementation of a block storage. Can be used to implement external
       6              : /// storage in tests.
       7              : pub struct BlockStorage {
       8              :     blocks: HashMap<u64, [u8; BLOCK_SIZE]>,
       9              : }
      10              : 
      11              : impl Default for BlockStorage {
      12            0 :     fn default() -> Self {
      13            0 :         Self::new()
      14            0 :     }
      15              : }
      16              : 
      17              : impl BlockStorage {
      18        85237 :     pub fn new() -> Self {
      19        85237 :         BlockStorage {
      20        85237 :             blocks: HashMap::new(),
      21        85237 :         }
      22        85237 :     }
      23              : 
      24        28433 :     pub fn read(&self, pos: u64, buf: &mut [u8]) {
      25        28433 :         let mut buf_offset = 0;
      26        28433 :         let mut storage_pos = pos;
      27        42770 :         while buf_offset < buf.len() {
      28        14337 :             let block_id = storage_pos / BLOCK_SIZE as u64;
      29        14337 :             let block = self.blocks.get(&block_id).unwrap_or(&[0; BLOCK_SIZE]);
      30        14337 :             let block_offset = storage_pos % BLOCK_SIZE as u64;
      31        14337 :             let block_len = BLOCK_SIZE as u64 - block_offset;
      32        14337 :             let buf_len = buf.len() - buf_offset;
      33        14337 :             let copy_len = std::cmp::min(block_len as usize, buf_len);
      34        14337 :             buf[buf_offset..buf_offset + copy_len]
      35        14337 :                 .copy_from_slice(&block[block_offset as usize..block_offset as usize + copy_len]);
      36        14337 :             buf_offset += copy_len;
      37        14337 :             storage_pos += copy_len as u64;
      38        14337 :         }
      39        28433 :     }
      40              : 
      41       131039 :     pub fn write(&mut self, pos: u64, buf: &[u8]) {
      42       131039 :         let mut buf_offset = 0;
      43       131039 :         let mut storage_pos = pos;
      44       262468 :         while buf_offset < buf.len() {
      45       131429 :             let block_id = storage_pos / BLOCK_SIZE as u64;
      46       131429 :             let block = self.blocks.entry(block_id).or_insert([0; BLOCK_SIZE]);
      47       131429 :             let block_offset = storage_pos % BLOCK_SIZE as u64;
      48       131429 :             let block_len = BLOCK_SIZE as u64 - block_offset;
      49       131429 :             let buf_len = buf.len() - buf_offset;
      50       131429 :             let copy_len = std::cmp::min(block_len as usize, buf_len);
      51       131429 :             block[block_offset as usize..block_offset as usize + copy_len]
      52       131429 :                 .copy_from_slice(&buf[buf_offset..buf_offset + copy_len]);
      53       131429 :             buf_offset += copy_len;
      54       131429 :             storage_pos += copy_len as u64
      55              :         }
      56       131039 :     }
      57              : }
        

Generated by: LCOV version 2.1-beta