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"
|
name = "solana-bucket-map"
|
||||||
version = "1.16.0"
|
version = "1.16.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"bv",
|
||||||
"fs_extra",
|
"fs_extra",
|
||||||
"log",
|
"log",
|
||||||
"memmap2",
|
"memmap2",
|
||||||
|
|
|
@ -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 }
|
||||||
|
|
|
@ -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..];
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
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 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)]
|
||||||
|
|
|
@ -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",
|
||||||
|
|
Loading…
Reference in New Issue