store data and index occupy in bitvec (#30899)

This commit is contained in:
Jeff Washington (jwash) 2023-03-28 14:17:28 -05:00 committed by GitHub
parent 4787b22bd6
commit 6285aaee89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 24 additions and 29 deletions

1
Cargo.lock generated
View File

@ -5031,6 +5031,7 @@ dependencies = [
name = "solana-bucket-map" name = "solana-bucket-map"
version = "1.16.0" version = "1.16.0"
dependencies = [ dependencies = [
"bv",
"fs_extra", "fs_extra",
"log", "log",
"memmap2", "memmap2",

View File

@ -11,6 +11,7 @@ license = { workspace = true }
edition = { workspace = true } edition = { workspace = true }
[dependencies] [dependencies]
bv = { workspace = true, features = ["serde"] }
log = { workspace = true } log = { workspace = true }
memmap2 = { workspace = true } memmap2 = { workspace = true }
modular-bitfield = { workspace = true } modular-bitfield = { workspace = true }

View File

@ -205,12 +205,6 @@ impl<O: BucketOccupied> BucketStorage<O> {
unsafe { &mut *item } unsafe { &mut *item }
} }
pub(crate) fn get_from_parts<T: Sized>(item_slice: &[u8]) -> &T {
assert!(std::mem::size_of::<T>() <= item_slice.len());
let item = item_slice.as_ptr() as *const T;
unsafe { &*item }
}
pub fn get_mut<T: Sized>(&mut self, ix: u64) -> &mut T { pub fn get_mut<T: Sized>(&mut self, ix: u64) -> &mut T {
let start = self.get_start_offset_no_header(ix); let start = self.get_start_offset_no_header(ix);
let item_slice = &mut self.mmap[start..]; let item_slice = &mut self.mmap[start..];

View File

@ -6,6 +6,7 @@ use {
bucket_storage::{BucketOccupied, BucketStorage}, bucket_storage::{BucketOccupied, BucketStorage},
RefCount, RefCount,
}, },
bv::BitVec,
modular_bitfield::prelude::*, modular_bitfield::prelude::*,
solana_sdk::{clock::Slot, pubkey::Pubkey}, solana_sdk::{clock::Slot, pubkey::Pubkey},
std::fmt::Debug, std::fmt::Debug,
@ -25,38 +26,35 @@ struct OccupiedHeader {
} }
/// allocated in `contents` in a BucketStorage /// allocated in `contents` in a BucketStorage
pub struct BucketWithHeader {} pub struct BucketWithBitVec {
pub occupied: BitVec,
}
impl BucketOccupied for BucketWithHeader { impl BucketOccupied for BucketWithBitVec {
fn occupy(&mut self, element: &mut [u8], _ix: usize) { fn occupy(&mut self, element: &mut [u8], ix: usize) {
let entry: &mut OccupiedHeader = assert!(self.is_free(element, ix));
BucketStorage::<BucketWithHeader>::get_mut_from_parts(element); self.occupied.set(ix as u64, true);
assert_eq!(entry.occupied, OCCUPIED_FREE);
entry.occupied = OCCUPIED_OCCUPIED;
} }
fn free(&mut self, element: &mut [u8], _ix: usize) { fn free(&mut self, element: &mut [u8], ix: usize) {
let entry: &mut OccupiedHeader = assert!(!self.is_free(element, ix));
BucketStorage::<BucketWithHeader>::get_mut_from_parts(element); self.occupied.set(ix as u64, false);
assert_eq!(entry.occupied, OCCUPIED_OCCUPIED);
entry.occupied = OCCUPIED_FREE;
} }
fn is_free(&self, element: &[u8], _ix: usize) -> bool { fn is_free(&self, _element: &[u8], ix: usize) -> bool {
let entry: &OccupiedHeader = BucketStorage::<BucketWithHeader>::get_from_parts(element); !self.occupied.get(ix as u64)
let free = entry.occupied == OCCUPIED_FREE;
assert!(free || entry.occupied == OCCUPIED_OCCUPIED);
free
} }
fn offset_to_first_data() -> usize { fn offset_to_first_data() -> usize {
std::mem::size_of::<OccupiedHeader>() // no header, nothing stored in data stream
0
} }
/// initialize this struct fn new(num_elements: usize) -> Self {
fn new(_num_elements: usize) -> Self { Self {
Self {} occupied: BitVec::new_fill(false, num_elements as u64),
}
} }
} }
pub type DataBucket = BucketWithHeader; pub type DataBucket = BucketWithBitVec;
pub type IndexBucket = BucketWithHeader; pub type IndexBucket = BucketWithBitVec;
#[repr(C)] #[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]

View File

@ -4466,6 +4466,7 @@ dependencies = [
name = "solana-bucket-map" name = "solana-bucket-map"
version = "1.16.0" version = "1.16.0"
dependencies = [ dependencies = [
"bv",
"log", "log",
"memmap2", "memmap2",
"modular-bitfield", "modular-bitfield",