Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion crates/ember-core/src/dropper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,6 @@ mod tests {
expires_at_ms: 0,
cached_value_size: 0,
last_access_secs: 0,
version: 0,
},
);
}
Expand Down
10 changes: 4 additions & 6 deletions crates/ember-core/src/keyspace/hash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ impl Keyspace {
return Ok(vec![]);
}

let ver = self.next_ver();
let Some(entry) = self.entries.get_mut(key) else {
return Ok(vec![]);
};
Expand All @@ -113,7 +112,7 @@ impl Keyspace {
false
};
if !removed.is_empty() {
entry.version = ver;
self.bump_version(key);
}

self.cleanup_after_remove(key, old_entry_size, is_empty, removed_bytes);
Expand Down Expand Up @@ -178,9 +177,9 @@ impl Keyspace {
if is_new {
let value = Value::Hash(Box::default());
self.memory.add(key, &value);
let mut entry = Entry::new(value, None);
entry.version = self.next_ver();
let entry = Entry::new(value, None);
self.entries.insert(CompactString::from(key), entry);
self.bump_version(key);
}

// safe: key was either just inserted above or verified to exist
Expand All @@ -202,13 +201,12 @@ impl Keyspace {
let new_val = current_val.checked_add(delta).ok_or(IncrError::Overflow)?;
hash.insert(field.into(), Bytes::from(new_val.to_string()));
entry.touch();
self.next_version += 1;
entry.version = self.next_version;

let new_value_size = memory::value_size(&entry.value);
entry.cached_value_size = new_value_size;
let new_entry_size = key.len() + new_value_size + memory::ENTRY_OVERHEAD;
self.memory.adjust(old_entry_size, new_entry_size);
self.bump_version(key);

Ok(new_val)
}
Expand Down
85 changes: 44 additions & 41 deletions crates/ember-core/src/keyspace/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,18 +141,17 @@ impl Keyspace {
(old_len, new_len)
};

let ver = self.next_ver();
let delta = new_len as isize - old_len as isize;
{
let entry = self.entries.get_mut(key).expect("key confirmed to exist");
entry.touch();
entry.version = ver;
if delta > 0 {
entry.cached_value_size += delta as usize;
} else if delta < 0 {
entry.cached_value_size = entry.cached_value_size.saturating_sub((-delta) as usize);
}
}
self.bump_version(key);
if delta > 0 {
self.memory.grow_by(delta as usize);
} else if delta < 0 {
Expand Down Expand Up @@ -182,7 +181,6 @@ impl Keyspace {
let (s, e) = normalize_range(start, stop, len as i64);

let (is_empty, new_value_size) = {
let ver = self.next_ver();
let entry = self.entries.get_mut(key).expect("verified above");
{
let Value::List(ref mut deque) = entry.value else {
Expand All @@ -200,7 +198,6 @@ impl Keyspace {

let empty = matches!(&entry.value, Value::List(d) if d.is_empty());
entry.touch();
entry.version = ver;
let nvs = if !empty {
let size = memory::value_size(&entry.value);
entry.cached_value_size = size;
Expand All @@ -212,6 +209,8 @@ impl Keyspace {
(empty, nvs)
};

self.bump_version(key);

if is_empty {
if let Some(removed) = self.entries.remove(key) {
self.decrement_expiry_if_set(&removed);
Expand Down Expand Up @@ -265,7 +264,6 @@ impl Keyspace {
return Err(WriteError::OutOfMemory);
}

let ver = self.next_ver();
let new_len = {
let entry = match self.entries.get_mut(key) {
Some(e) => e,
Expand All @@ -283,11 +281,11 @@ impl Keyspace {
deque.insert(insert_pos, value);
let len = deque.len() as i64;
entry.touch();
entry.version = ver;
entry.cached_value_size += element_cost;
len
};

self.bump_version(key);
self.memory.grow_by(element_cost);
Ok(new_len)
}
Expand All @@ -311,7 +309,6 @@ impl Keyspace {
}

let old_entry_size = self.entries.get(key).expect("exists").entry_size(key);
let ver = self.next_ver();

let (removed_count, removed_bytes, is_empty) = {
let entry = self.entries.get_mut(key).expect("exists");
Expand Down Expand Up @@ -363,7 +360,6 @@ impl Keyspace {

let empty = deque.is_empty();
entry.touch();
entry.version = ver;

if !empty {
entry.cached_value_size = entry.cached_value_size.saturating_sub(bytes);
Expand All @@ -372,6 +368,8 @@ impl Keyspace {
(n, bytes, empty)
};

self.bump_version(key);

if is_empty {
if let Some(removed) = self.entries.remove(key) {
self.decrement_expiry_if_set(&removed);
Expand Down Expand Up @@ -478,23 +476,25 @@ impl Keyspace {
}

// safe: key was just inserted or confirmed to exist
let ver = self.next_ver();
let entry = self.entries.get_mut(key).unwrap();
let Value::List(ref mut deque) = entry.value else {
unreachable!("type verified by ensure_collection_type");
};
for val in values {
if left {
deque.push_front(val.clone());
} else {
deque.push_back(val.clone());
let len = {
let entry = self.entries.get_mut(key).unwrap();
let Value::List(ref mut deque) = entry.value else {
unreachable!("type verified by ensure_collection_type");
};
for val in values {
if left {
deque.push_front(val.clone());
} else {
deque.push_back(val.clone());
}
}
}
let len = deque.len();
entry.touch();
entry.version = ver;
entry.cached_value_size += element_increase;
let len = deque.len();
entry.touch();
entry.cached_value_size += element_increase;
len
};

self.bump_version(key);
// apply the known delta — no need to rescan the entire list
self.memory.grow_by(element_increase);

Expand All @@ -507,27 +507,30 @@ impl Keyspace {
return Ok(None);
}

let ver = self.next_ver();
let Some(entry) = self.entries.get_mut(key) else {
return Ok(None);
};
if !matches!(entry.value, Value::List(_)) {
return Err(WrongType);
}
let (popped, is_empty) = {
let Some(entry) = self.entries.get_mut(key) else {
return Ok(None);
};
if !matches!(entry.value, Value::List(_)) {
return Err(WrongType);
}

let Value::List(ref mut deque) = entry.value else {
// checked above
return Err(WrongType);
};
let popped = if left {
deque.pop_front()
} else {
deque.pop_back()
let Value::List(ref mut deque) = entry.value else {
// checked above
return Err(WrongType);
};
let popped = if left {
deque.pop_front()
} else {
deque.pop_back()
};
entry.touch();

let is_empty = matches!(&entry.value, Value::List(d) if d.is_empty());
(popped, is_empty)
};
entry.touch();
entry.version = ver;

let is_empty = matches!(&entry.value, Value::List(d) if d.is_empty());
self.bump_version(key);
if let Some(ref elem) = popped {
let element_size = elem.len() + memory::VECDEQUE_ELEMENT_OVERHEAD;
let old_size = if is_empty {
Expand Down
Loading