Skip to content

Commit 2ed596b

Browse files
committed
Add keys() and remove() methods to SharedData
Signed-off-by: James Mulcahy <[email protected]>
1 parent f383473 commit 2ed596b

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

src/shared_data.cc

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,42 @@ WasmResult SharedData::get(std::string_view vm_id, const std::string_view key,
5656
return WasmResult::NotFound;
5757
}
5858

59+
WasmResult SharedData::keys(std::string_view vm_id, const std::string_view key_prefix, std::vector<std::string> *result) {
60+
std::lock_guard<std::mutex> lock(mutex_);
61+
auto map = data_.find(std::string(vm_id));
62+
if (map == data_.end()) {
63+
return WasmResult::NotFound;
64+
}
65+
66+
for (auto kv : map->second) {
67+
if (kv.first.rfind(key_prefix, 0) == 0) {
68+
result->push_back(kv.first);
69+
}
70+
}
71+
72+
return WasmResult::Ok;
73+
}
74+
75+
WasmResult SharedData::remove(std::string_view vm_id, std::string_view key, uint32_t cas) {
76+
std::lock_guard<std::mutex> lock(mutex_);
77+
std::unordered_map<std::string, std::pair<std::string, uint32_t>> *map;
78+
auto map_it = data_.find(std::string(vm_id));
79+
if (map_it == data_.end()) {
80+
return WasmResult::Ok;
81+
} else {
82+
map = &map_it->second;
83+
}
84+
85+
auto it = map->find(std::string(key));
86+
if (it != map->end()) {
87+
if (cas && cas != it->second.second) {
88+
return WasmResult::CasMismatch;
89+
}
90+
map->erase(it);
91+
}
92+
return WasmResult::Ok;
93+
}
94+
5995
WasmResult SharedData::set(std::string_view vm_id, std::string_view key, std::string_view value,
6096
uint32_t cas) {
6197
std::lock_guard<std::mutex> lock(mutex_);

src/shared_data.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ class SharedData {
2525
SharedData(bool register_vm_id_callback = true);
2626
WasmResult get(std::string_view vm_id, const std::string_view key,
2727
std::pair<std::string, uint32_t> *result);
28+
WasmResult keys(std::string_view vm_id, const std::string_view key_prefix, std::vector<std::string> *result);
29+
WasmResult remove(std::string_view vm_id, const std::string_view key, uint32_t cas);
2830
WasmResult set(std::string_view vm_id, std::string_view key, std::string_view value,
2931
uint32_t cas);
3032
void deleteByVmId(std::string_view vm_id);

test/shared_data_test.cc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,25 @@ TEST(SharedData, SingleThread) {
4444
EXPECT_EQ(WasmResult::Ok, shared_data.get(vm_id, key, &result));
4545
EXPECT_EQ(value, result.first);
4646
EXPECT_EQ(result.second, 3);
47+
48+
std::vector<std::string> keys;
49+
EXPECT_EQ(WasmResult::Ok, shared_data.keys(vm_id, "unmatched-prefix", &keys));
50+
EXPECT_EQ(0, keys.size());
51+
52+
EXPECT_EQ(WasmResult::Ok, shared_data.keys(vm_id, "keyyyyy", &keys));
53+
EXPECT_EQ(0, keys.size());
54+
55+
EXPECT_EQ(WasmResult::Ok, shared_data.keys(vm_id, "ke", &keys));
56+
EXPECT_EQ(1, keys.size());
57+
EXPECT_EQ(key, keys[0]);
58+
59+
keys.clear();
60+
EXPECT_EQ(WasmResult::CasMismatch, shared_data.remove(vm_id, key, 911));
61+
EXPECT_EQ(WasmResult::Ok, shared_data.keys(vm_id, "ke", &keys));
62+
EXPECT_EQ(1, keys.size());
63+
64+
EXPECT_EQ(WasmResult::Ok, shared_data.remove(vm_id, key, 0));
65+
EXPECT_EQ(WasmResult::NotFound, shared_data.get(vm_id, key, &result));
4766
}
4867

4968
void incrementData(SharedData *shared_data, std::string_view vm_id, std::string_view key) {

0 commit comments

Comments
 (0)