Use a constant for unlocked header uid (#20048)
Instead of just a literal `0` for UID when the header is unlocked, make a constant to give additional context.
This commit is contained in:
parent
bbe151e594
commit
c88fb6952c
|
@ -1,7 +1,7 @@
|
||||||
use crate::bucket_item::BucketItem;
|
use crate::bucket_item::BucketItem;
|
||||||
use crate::bucket_map::BucketMapError;
|
use crate::bucket_map::BucketMapError;
|
||||||
use crate::bucket_stats::BucketMapStats;
|
use crate::bucket_stats::BucketMapStats;
|
||||||
use crate::bucket_storage::BucketStorage;
|
use crate::bucket_storage::{BucketStorage, UID_UNLOCKED};
|
||||||
use crate::index_entry::IndexEntry;
|
use crate::index_entry::IndexEntry;
|
||||||
use crate::{MaxSearch, RefCount};
|
use crate::{MaxSearch, RefCount};
|
||||||
use rand::thread_rng;
|
use rand::thread_rng;
|
||||||
|
@ -59,7 +59,7 @@ impl<T: Clone + Copy> Bucket<T> {
|
||||||
pub fn keys(&self) -> Vec<Pubkey> {
|
pub fn keys(&self) -> Vec<Pubkey> {
|
||||||
let mut rv = vec![];
|
let mut rv = vec![];
|
||||||
for i in 0..self.index.num_cells() {
|
for i in 0..self.index.num_cells() {
|
||||||
if self.index.uid(i) == 0 {
|
if self.index.uid(i) == UID_UNLOCKED {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let ix: &IndexEntry = self.index.get(i);
|
let ix: &IndexEntry = self.index.get(i);
|
||||||
|
@ -75,7 +75,7 @@ impl<T: Clone + Copy> Bucket<T> {
|
||||||
let mut result = Vec::with_capacity(self.index.used.load(Ordering::Relaxed) as usize);
|
let mut result = Vec::with_capacity(self.index.used.load(Ordering::Relaxed) as usize);
|
||||||
for i in 0..self.index.num_cells() {
|
for i in 0..self.index.num_cells() {
|
||||||
let ii = i % self.index.num_cells();
|
let ii = i % self.index.num_cells();
|
||||||
if self.index.uid(ii) == 0 {
|
if self.index.uid(ii) == UID_UNLOCKED {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let ix: &IndexEntry = self.index.get(ii);
|
let ix: &IndexEntry = self.index.get(ii);
|
||||||
|
@ -108,7 +108,7 @@ impl<T: Clone + Copy> Bucket<T> {
|
||||||
let ix = Self::bucket_index_ix(index, key, random);
|
let ix = Self::bucket_index_ix(index, key, random);
|
||||||
for i in ix..ix + index.max_search() {
|
for i in ix..ix + index.max_search() {
|
||||||
let ii = i % index.num_cells();
|
let ii = i % index.num_cells();
|
||||||
if index.uid(ii) == 0 {
|
if index.uid(ii) == UID_UNLOCKED {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let elem: &mut IndexEntry = index.get_mut(ii);
|
let elem: &mut IndexEntry = index.get_mut(ii);
|
||||||
|
@ -127,7 +127,7 @@ impl<T: Clone + Copy> Bucket<T> {
|
||||||
let ix = Self::bucket_index_ix(index, key, random);
|
let ix = Self::bucket_index_ix(index, key, random);
|
||||||
for i in ix..ix + index.max_search() {
|
for i in ix..ix + index.max_search() {
|
||||||
let ii = i % index.num_cells();
|
let ii = i % index.num_cells();
|
||||||
if index.uid(ii) == 0 {
|
if index.uid(ii) == UID_UNLOCKED {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let elem: &IndexEntry = index.get(ii);
|
let elem: &IndexEntry = index.get(ii);
|
||||||
|
@ -148,7 +148,7 @@ impl<T: Clone + Copy> Bucket<T> {
|
||||||
let ix = Self::bucket_index_ix(index, key, random);
|
let ix = Self::bucket_index_ix(index, key, random);
|
||||||
for i in ix..ix + index.max_search() {
|
for i in ix..ix + index.max_search() {
|
||||||
let ii = i as u64 % index.num_cells();
|
let ii = i as u64 % index.num_cells();
|
||||||
if index.uid(ii) != 0 {
|
if index.uid(ii) != UID_UNLOCKED {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
index.allocate(ii, elem_uid).unwrap();
|
index.allocate(ii, elem_uid).unwrap();
|
||||||
|
@ -237,7 +237,7 @@ impl<T: Clone + Copy> Bucket<T> {
|
||||||
let pos = thread_rng().gen_range(0, cap);
|
let pos = thread_rng().gen_range(0, cap);
|
||||||
for i in pos..pos + self.index.max_search() {
|
for i in pos..pos + self.index.max_search() {
|
||||||
let ix = i % cap;
|
let ix = i % cap;
|
||||||
if best_bucket.uid(ix) == 0 {
|
if best_bucket.uid(ix) == UID_UNLOCKED {
|
||||||
let elem_loc = elem.data_loc(current_bucket);
|
let elem_loc = elem.data_loc(current_bucket);
|
||||||
if elem.num_slots > 0 {
|
if elem.num_slots > 0 {
|
||||||
current_bucket.free(elem_loc, elem_uid);
|
current_bucket.free(elem_loc, elem_uid);
|
||||||
|
@ -294,7 +294,7 @@ impl<T: Clone + Copy> Bucket<T> {
|
||||||
let mut valid = true;
|
let mut valid = true;
|
||||||
for ix in 0..self.index.num_cells() {
|
for ix in 0..self.index.num_cells() {
|
||||||
let uid = self.index.uid(ix);
|
let uid = self.index.uid(ix);
|
||||||
if 0 != uid {
|
if UID_UNLOCKED != uid {
|
||||||
let elem: &IndexEntry = self.index.get(ix);
|
let elem: &IndexEntry = self.index.get(ix);
|
||||||
let ref_count = 0; // ??? TODO
|
let ref_count = 0; // ??? TODO
|
||||||
let new_ix =
|
let new_ix =
|
||||||
|
|
|
@ -36,15 +36,18 @@ struct Header {
|
||||||
lock: AtomicU64,
|
lock: AtomicU64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A Header UID of 0 indicates that the header is unlocked
|
||||||
|
pub(crate) const UID_UNLOCKED: u64 = 0;
|
||||||
|
|
||||||
impl Header {
|
impl Header {
|
||||||
fn try_lock(&self, uid: u64) -> bool {
|
fn try_lock(&self, uid: u64) -> bool {
|
||||||
Ok(0)
|
Ok(UID_UNLOCKED)
|
||||||
== self
|
== self
|
||||||
.lock
|
.lock
|
||||||
.compare_exchange(0, uid, Ordering::Acquire, Ordering::Relaxed)
|
.compare_exchange(UID_UNLOCKED, uid, Ordering::Acquire, Ordering::Relaxed)
|
||||||
}
|
}
|
||||||
fn unlock(&self) -> u64 {
|
fn unlock(&self) -> u64 {
|
||||||
self.lock.swap(0, Ordering::Release)
|
self.lock.swap(UID_UNLOCKED, Ordering::Release)
|
||||||
}
|
}
|
||||||
fn uid(&self) -> u64 {
|
fn uid(&self) -> u64 {
|
||||||
self.lock.load(Ordering::Relaxed)
|
self.lock.load(Ordering::Relaxed)
|
||||||
|
@ -133,7 +136,7 @@ impl BucketStorage {
|
||||||
if ix >= self.num_cells() {
|
if ix >= self.num_cells() {
|
||||||
panic!("allocate: bad index size");
|
panic!("allocate: bad index size");
|
||||||
}
|
}
|
||||||
if 0 == uid {
|
if UID_UNLOCKED == uid {
|
||||||
panic!("allocate: bad uid");
|
panic!("allocate: bad uid");
|
||||||
}
|
}
|
||||||
let mut e = Err(BucketStorageError::AlreadyAllocated);
|
let mut e = Err(BucketStorageError::AlreadyAllocated);
|
||||||
|
@ -154,7 +157,7 @@ impl BucketStorage {
|
||||||
if ix >= self.num_cells() {
|
if ix >= self.num_cells() {
|
||||||
panic!("free: bad index size");
|
panic!("free: bad index size");
|
||||||
}
|
}
|
||||||
if 0 == uid {
|
if UID_UNLOCKED == uid {
|
||||||
panic!("free: bad uid");
|
panic!("free: bad uid");
|
||||||
}
|
}
|
||||||
let ix = (ix * self.cell_size) as usize;
|
let ix = (ix * self.cell_size) as usize;
|
||||||
|
|
Loading…
Reference in New Issue