Skip to content

feat: add intrusive stringset DO NOT REVIEW #4705

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 28 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3ffd07e
feat: add intrusive string set entry
BorysTheDev Mar 5, 2025
6662892
feat: add IntrusiveStringSet
BorysTheDev Mar 5, 2025
173d37a
feat: add Rehash method to IntrusiveStringSet
BorysTheDev Apr 10, 2025
58b838a
tests: copy tests from StringSetTest to IntrusiveStringSetTest
BorysTheDev Apr 16, 2025
a0c84bd
feat: add AddMany()
BorysTheDev Apr 16, 2025
e4350e0
feat: add TTL
BorysTheDev Apr 16, 2025
1b49b60
feat: add Scan
BorysTheDev Apr 17, 2025
1f478cc
feat: add Clear() and tests
BorysTheDev Apr 18, 2025
edafe6d
fix: size_ during clear
BorysTheDev Apr 22, 2025
cfcdd88
refactor: move intrusive string list in to separate file
BorysTheDev Apr 24, 2025
b2a5746
feat: add setExpiry and iterators
BorysTheDev Apr 24, 2025
edc069a
feat: add iterators
BorysTheDev Apr 25, 2025
35ebee0
test: TTL test
BorysTheDev Apr 28, 2025
83699da
feat: add hash to ISLEntry (#5109)
BorysTheDev May 12, 2025
8f8100b
feat: add SSO for intrusive_string_set (#5114)
BorysTheDev May 13, 2025
1063a79
Expiry fields during find (#5115)
mkaruza May 13, 2025
ee42e0a
Fill for IntrusiveStringSet (#5118)
mkaruza May 13, 2025
9263318
Adding object memory tracking (#5119)
mkaruza May 13, 2025
18feddb
feat: Integrate IntrusiveStringSet (#5131)
BorysTheDev May 15, 2025
5d2dfae
feat: add RDB load/save for intrusive string set (#5138)
BorysTheDev May 15, 2025
d0f7156
feat(intrusive_string_set): Key displacement (#5137)
mkaruza May 15, 2025
fa7894a
feat: add current bucket id into hash (#5141)
BorysTheDev May 16, 2025
96a123c
feat(intrusive_string_set): Fixed set TTL tests (#5142)
mkaruza May 16, 2025
71ed443
Improve rehash (#5145)
BorysTheDev May 17, 2025
c0eef55
feat: add extension point
BorysTheDev May 21, 2025
f60d7df
feat: start of migration to vector
BorysTheDev May 23, 2025
065aa59
fix: fix ttl bugs
BorysTheDev May 23, 2025
5af11e2
feat: add scan
BorysTheDev May 24, 2025
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
Prev Previous commit
Next Next commit
feat: add AddMany()
  • Loading branch information
BorysTheDev committed May 21, 2025
commit a0c84bd587d59ff046c3e3b1ce63235facf9c3bb
47 changes: 41 additions & 6 deletions src/core/intrusive_string_set.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

#pragma once

#include <absl/numeric/bits.h>
#include <absl/types/span.h>

#include <cassert>
#include <cstring>
#include <memory>
Expand Down Expand Up @@ -159,30 +162,62 @@ class IntrusiveStringSet {

// TODO add TTL processing
ISLEntry Add(std::string_view str, uint32_t ttl_sec = UINT32_MAX) {
if (size_ >= entries_.size()) {
auto prev_size = entries_.size();
++capacity_log_;
entries_.resize(Capacity());
Rehash(prev_size);
if (entries_.empty() || size_ >= entries_.size()) {
Resize(Capacity() * 2);
}
auto bucket_id = BucketId(Hash(str));
const auto bucket_id = BucketId(Hash(str));
auto& bucket = entries_[bucket_id];

if (auto existed_item = bucket.Find(str); existed_item) {
// TODO consider common implementation for key value pair
return ISLEntry();
}

return AddUnique(str, bucket, ttl_sec);
}

void Resize(size_t sz) {
sz = absl::bit_ceil(sz);
if (sz > entries_.size()) {
size_t prev_size = entries_.size();
capacity_log_ = absl::bit_width(sz) - 1;
entries_.resize(sz);
Rehash(prev_size);
}
}

ISLEntry AddUnique(std::string_view str, IntrusiveStringList& bucket,
uint32_t ttl_sec = UINT32_MAX) {
++size_;
return bucket.Emplace(str);
}

unsigned AddMany(absl::Span<std::string_view> span, uint32_t ttl_sec, bool keepttl) {
Resize(span.size());
unsigned res = 0;
for (auto& s : span) {
const auto bucket_id = BucketId(Hash(s));
auto& bucket = entries_[bucket_id];
if (auto existed_item = bucket.Find(s); existed_item) {
// TODO update TTL
} else {
++res;
AddUnique(s, bucket, ttl_sec);
}
}
return res;
}

bool Erase(std::string_view str) {
if (entries_.empty())
return false;
auto bucket_id = BucketId(Hash(str));
return entries_[bucket_id].Erase(str);
}

ISLEntry Find(std::string_view member) const {
if (entries_.empty())
return {};
auto bucket_id = BucketId(Hash(member));
return entries_[bucket_id].Find(member);
}
Expand Down
102 changes: 51 additions & 51 deletions src/core/intrusive_string_set_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -155,57 +155,57 @@ TEST_F(IntrusiveStringSetTest, StandardAddErase) {
EXPECT_TRUE(ss_->Erase("AAAAAAAAAAAAAAA@"));
}

// TEST_F(IntrusiveStringSetTest, DisplacedBug) {
// string_view vals[] = {"imY", "OVl", "NhH", "BCe", "YDL", "lpb",
// "nhF", "xod", "zYR", "PSa", "hce", "cTR"};
// ss_->AddMany(absl::MakeSpan(vals), UINT32_MAX, false);

// ss_->Add("fIc");
// ss_->Erase("YDL");
// ss_->Add("fYs");
// ss_->Erase("hce");
// ss_->Erase("nhF");
// ss_->Add("dye");
// ss_->Add("xZT");
// ss_->Add("LVK");
// ss_->Erase("zYR");
// ss_->Erase("fYs");
// ss_->Add("ueB");
// ss_->Erase("PSa");
// ss_->Erase("OVl");
// ss_->Add("cga");
// ss_->Add("too");
// ss_->Erase("ueB");
// ss_->Add("HZe");
// ss_->Add("oQn");
// ss_->Erase("too");
// ss_->Erase("HZe");
// ss_->Erase("xZT");
// ss_->Erase("cga");
// ss_->Erase("cTR");
// ss_->Erase("BCe");
// ss_->Add("eua");
// ss_->Erase("lpb");
// ss_->Add("OXK");
// ss_->Add("QmO");
// ss_->Add("SzV");
// ss_->Erase("QmO");
// ss_->Add("jbe");
// ss_->Add("BPN");
// ss_->Add("OfH");
// ss_->Add("Muf");
// ss_->Add("CwP");
// ss_->Erase("Muf");
// ss_->Erase("xod");
// ss_->Add("Cis");
// ss_->Add("Xvd");
// ss_->Erase("SzV");
// ss_->Erase("eua");
// ss_->Add("DGb");
// ss_->Add("leD");
// ss_->Add("MVX");
// ss_->Add("HPq");
// }
TEST_F(IntrusiveStringSetTest, DisplacedBug) {
string_view vals[] = {"imY", "OVl", "NhH", "BCe", "YDL", "lpb",
"nhF", "xod", "zYR", "PSa", "hce", "cTR"};
ss_->AddMany(absl::MakeSpan(vals), UINT32_MAX, false);

ss_->Add("fIc");
ss_->Erase("YDL");
ss_->Add("fYs");
ss_->Erase("hce");
ss_->Erase("nhF");
ss_->Add("dye");
ss_->Add("xZT");
ss_->Add("LVK");
ss_->Erase("zYR");
ss_->Erase("fYs");
ss_->Add("ueB");
ss_->Erase("PSa");
ss_->Erase("OVl");
ss_->Add("cga");
ss_->Add("too");
ss_->Erase("ueB");
ss_->Add("HZe");
ss_->Add("oQn");
ss_->Erase("too");
ss_->Erase("HZe");
ss_->Erase("xZT");
ss_->Erase("cga");
ss_->Erase("cTR");
ss_->Erase("BCe");
ss_->Add("eua");
ss_->Erase("lpb");
ss_->Add("OXK");
ss_->Add("QmO");
ss_->Add("SzV");
ss_->Erase("QmO");
ss_->Add("jbe");
ss_->Add("BPN");
ss_->Add("OfH");
ss_->Add("Muf");
ss_->Add("CwP");
ss_->Erase("Muf");
ss_->Erase("xod");
ss_->Add("Cis");
ss_->Add("Xvd");
ss_->Erase("SzV");
ss_->Erase("eua");
ss_->Add("DGb");
ss_->Add("leD");
ss_->Add("MVX");
ss_->Add("HPq");
}

// static string random_string(mt19937& rand, unsigned len) {
// const string_view alpanum = "1234567890abcdefghijklmnopqrstuvwxyz";
Expand Down