store data and index occupy in bitvec (#30899)
This commit is contained in:
parent
4787b22bd6
commit
6285aaee89
|
@ -5031,6 +5031,7 @@ dependencies = [
|
|||
name = "solana-bucket-map"
|
||||
version = "1.16.0"
|
||||
dependencies = [
|
||||
"bv",
|
||||
"fs_extra",
|
||||
"log",
|
||||
"memmap2",
|
||||
|
|
|
@ -11,6 +11,7 @@ license = { workspace = true }
|
|||
edition = { workspace = true }
|
||||
|
||||
[dependencies]
|
||||
bv = { workspace = true, features = ["serde"] }
|
||||
log = { workspace = true }
|
||||
memmap2 = { workspace = true }
|
||||
modular-bitfield = { workspace = true }
|
||||
|
|
|
@ -205,12 +205,6 @@ impl<O: BucketOccupied> BucketStorage<O> {
|
|||
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 {
|
||||
let start = self.get_start_offset_no_header(ix);
|
||||
let item_slice = &mut self.mmap[start..];
|
||||
|
|
|
@ -6,6 +6,7 @@ use {
|
|||
bucket_storage::{BucketOccupied, BucketStorage},
|
||||
RefCount,
|
||||
},
|
||||
bv::BitVec,
|
||||
modular_bitfield::prelude::*,
|
||||
solana_sdk::{clock::Slot, pubkey::Pubkey},
|
||||
std::fmt::Debug,
|
||||
|
@ -25,38 +26,35 @@ struct OccupiedHeader {
|
|||
}
|
||||
|
||||
/// allocated in `contents` in a BucketStorage
|
||||
pub struct BucketWithHeader {}
|
||||
pub struct BucketWithBitVec {
|
||||
pub occupied: BitVec,
|
||||
}
|
||||
|
||||
impl BucketOccupied for BucketWithHeader {
|
||||
fn occupy(&mut self, element: &mut [u8], _ix: usize) {
|
||||
let entry: &mut OccupiedHeader =
|
||||
BucketStorage::<BucketWithHeader>::get_mut_from_parts(element);
|
||||
assert_eq!(entry.occupied, OCCUPIED_FREE);
|
||||
entry.occupied = OCCUPIED_OCCUPIED;
|
||||
impl BucketOccupied for BucketWithBitVec {
|
||||
fn occupy(&mut self, element: &mut [u8], ix: usize) {
|
||||
assert!(self.is_free(element, ix));
|
||||
self.occupied.set(ix as u64, true);
|
||||
}
|
||||
fn free(&mut self, element: &mut [u8], _ix: usize) {
|
||||
let entry: &mut OccupiedHeader =
|
||||
BucketStorage::<BucketWithHeader>::get_mut_from_parts(element);
|
||||
assert_eq!(entry.occupied, OCCUPIED_OCCUPIED);
|
||||
entry.occupied = OCCUPIED_FREE;
|
||||
fn free(&mut self, element: &mut [u8], ix: usize) {
|
||||
assert!(!self.is_free(element, ix));
|
||||
self.occupied.set(ix as u64, false);
|
||||
}
|
||||
fn is_free(&self, element: &[u8], _ix: usize) -> bool {
|
||||
let entry: &OccupiedHeader = BucketStorage::<BucketWithHeader>::get_from_parts(element);
|
||||
let free = entry.occupied == OCCUPIED_FREE;
|
||||
assert!(free || entry.occupied == OCCUPIED_OCCUPIED);
|
||||
free
|
||||
fn is_free(&self, _element: &[u8], ix: usize) -> bool {
|
||||
!self.occupied.get(ix as u64)
|
||||
}
|
||||
fn offset_to_first_data() -> usize {
|
||||
std::mem::size_of::<OccupiedHeader>()
|
||||
// no header, nothing stored in data stream
|
||||
0
|
||||
}
|
||||
fn new(num_elements: usize) -> Self {
|
||||
Self {
|
||||
occupied: BitVec::new_fill(false, num_elements as u64),
|
||||
}
|
||||
/// initialize this struct
|
||||
fn new(_num_elements: usize) -> Self {
|
||||
Self {}
|
||||
}
|
||||
}
|
||||
|
||||
pub type DataBucket = BucketWithHeader;
|
||||
pub type IndexBucket = BucketWithHeader;
|
||||
pub type DataBucket = BucketWithBitVec;
|
||||
pub type IndexBucket = BucketWithBitVec;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||
|
|
|
@ -4466,6 +4466,7 @@ dependencies = [
|
|||
name = "solana-bucket-map"
|
||||
version = "1.16.0"
|
||||
dependencies = [
|
||||
"bv",
|
||||
"log",
|
||||
"memmap2",
|
||||
"modular-bitfield",
|
||||
|
|
Loading…
Reference in New Issue