Skip to content

Commit

Permalink
streamline the LPush and RPush (OpenAtomFoundation#57)
Browse files Browse the repository at this point in the history
  • Loading branch information
Axlgrep committed May 4, 2018
1 parent 2ab1692 commit 66ea4fe
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 54 deletions.
6 changes: 4 additions & 2 deletions src/lists_meta_value_format.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ class ParsedListsMetaValue : public ParsedInternalValue {
// Use this constructor after rocksdb::DB::Get();
explicit ParsedListsMetaValue(std::string* internal_value_str) :
ParsedInternalValue(internal_value_str) {
assert(internal_value_str->size() >= kListsMetaValueSuffixLength);
if (internal_value_str->size() >= kListsMetaValueSuffixLength) {
user_value_ = Slice(internal_value_str->data(),
internal_value_str->size() - kListsMetaValueSuffixLength);
Expand All @@ -117,6 +118,7 @@ class ParsedListsMetaValue : public ParsedInternalValue {
// Use this constructor in rocksdb::CompactionFilter::Filter();
explicit ParsedListsMetaValue(const Slice& internal_value_slice) :
ParsedInternalValue(internal_value_slice) {
assert(internal_value_slice.size() >= kListsMetaValueSuffixLength);
if (internal_value_slice.size() >= kListsMetaValueSuffixLength) {
user_value_ = Slice(internal_value_slice.data(),
internal_value_slice.size() - kListsMetaValueSuffixLength);
Expand Down Expand Up @@ -256,8 +258,8 @@ class ParsedListsMetaValue : public ParsedInternalValue {

private:
uint64_t count_;
uint64_t left_index_ = 9223372036854775807;
uint64_t right_index_ = 9223372036854775808U;
uint64_t left_index_;
uint64_t right_index_;
};

} // namespace blackwidow
Expand Down
83 changes: 31 additions & 52 deletions src/redis_lists.cc
Original file line number Diff line number Diff line change
Expand Up @@ -73,48 +73,37 @@ Status RedisLists::LPush(const Slice& key,
ScopeRecordLock l(lock_mgr_, key);
Status s = db_->Get(default_read_options_, handles_[0], key, &meta_value);
if (s.ok()) {
ParsedListsMetaValue parsed_meta_value(&meta_value);
if (parsed_meta_value.IsStale()) {
version = parsed_meta_value.InitialMetaValue();
for (auto value : values) {
index = parsed_meta_value.left_index();
parsed_meta_value.ModifyLeftIndex(1);
parsed_meta_value.ModifyCount(1);
ListsDataKey data_key(key, version, index);
batch.Put(handles_[1], data_key.Encode(), value);
}
batch.Put(handles_[0], key, meta_value);
*ret = parsed_meta_value.count();
ParsedListsMetaValue parsed_lists_meta_value(&meta_value);
if (parsed_lists_meta_value.IsStale()) {
version = parsed_lists_meta_value.InitialMetaValue();
} else {
version = parsed_meta_value.version();
for (auto value : values) {
index = parsed_meta_value.left_index();
parsed_meta_value.ModifyLeftIndex(1);
parsed_meta_value.ModifyCount(1);
ListsDataKey data_key(key, version, index);
batch.Put(handles_[1], data_key.Encode(), value);
}
batch.Put(handles_[0], key, meta_value);
*ret = parsed_meta_value.count();
version = parsed_lists_meta_value.version();
}
for (const auto& value : values) {
index = parsed_lists_meta_value.left_index();
parsed_lists_meta_value.ModifyLeftIndex(1);
parsed_lists_meta_value.ModifyCount(1);
ListsDataKey lists_data_key(key, version, index);
batch.Put(handles_[1], lists_data_key.Encode(), value);
}
batch.Put(handles_[0], key, meta_value);
*ret = parsed_lists_meta_value.count();
} else if (s.IsNotFound()) {
char str[8];
EncodeFixed64(str, values.size());
ListsMetaValue lists_meta_value(std::string(str, sizeof(uint64_t)));
version = lists_meta_value.UpdateVersion();
lists_meta_value.set_timestamp(0);
for (auto value : values) {
for (const auto& value : values) {
index = lists_meta_value.left_index();
lists_meta_value.ModifyLeftIndex(1);
ListsDataKey data_key(key, version, index);
batch.Put(handles_[1], data_key.Encode(), value);
ListsDataKey lists_data_key(key, version, index);
batch.Put(handles_[1], lists_data_key.Encode(), value);
}
batch.Put(handles_[0], key, lists_meta_value.Encode());
*ret = lists_meta_value.right_index() - lists_meta_value.left_index() - 1;
} else {
return s;
}

return db_->Write(default_write_options_, &batch);
}

Expand All @@ -129,30 +118,21 @@ Status RedisLists::RPush(const Slice& key,
ScopeRecordLock l(lock_mgr_, key);
Status s = db_->Get(default_read_options_, handles_[0], key, &meta_value);
if (s.ok()) {
ParsedListsMetaValue parsed_meta_value(&meta_value);
if (parsed_meta_value.IsStale()) {
version = parsed_meta_value.InitialMetaValue();
for (auto value : values) {
index = parsed_meta_value.right_index();
parsed_meta_value.ModifyRightIndex(1);
parsed_meta_value.ModifyCount(1);
ListsDataKey data_key(key, version, index);
batch.Put(handles_[1], data_key.Encode(), value);
}
batch.Put(handles_[0], key, meta_value);
*ret = parsed_meta_value.count();
ParsedListsMetaValue parsed_lists_meta_value(&meta_value);
if (parsed_lists_meta_value.IsStale()) {
version = parsed_lists_meta_value.InitialMetaValue();
} else {
version = parsed_meta_value.version();
for (auto value : values) {
index = parsed_meta_value.right_index();
parsed_meta_value.ModifyRightIndex(1);
parsed_meta_value.ModifyCount(1);
ListsDataKey data_key(key, version, index);
batch.Put(handles_[1], data_key.Encode(), value);
}
batch.Put(handles_[0], key, meta_value);
*ret = parsed_meta_value.count();
version = parsed_lists_meta_value.version();
}
for (const auto& value : values) {
index = parsed_lists_meta_value.right_index();
parsed_lists_meta_value.ModifyRightIndex(1);
parsed_lists_meta_value.ModifyCount(1);
ListsDataKey lists_data_key(key, version, index);
batch.Put(handles_[1], lists_data_key.Encode(), value);
}
batch.Put(handles_[0], key, meta_value);
*ret = parsed_lists_meta_value.count();
} else if (s.IsNotFound()) {
char str[8];
EncodeFixed64(str, values.size());
Expand All @@ -162,15 +142,14 @@ Status RedisLists::RPush(const Slice& key,
for (auto value : values) {
index = lists_meta_value.right_index();
lists_meta_value.ModifyRightIndex(1);
ListsDataKey data_key(key, version, index);
batch.Put(handles_[1], data_key.Encode(), value);
ListsDataKey lists_data_key(key, version, index);
batch.Put(handles_[1], lists_data_key.Encode(), value);
}
batch.Put(handles_[0], key, lists_meta_value.Encode());
*ret = lists_meta_value.right_index() - lists_meta_value.left_index() - 1;
} else {
return s;
}

return db_->Write(default_write_options_, &batch);
}

Expand Down
4 changes: 4 additions & 0 deletions tests/gtest_lists.cc
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ class ListsTest : public ::testing::Test {
}
options.create_if_missing = true;
s = db.Open(options, path);
if (!s.ok()) {
printf("Open db failed, exit...\n");
exit(1);
}
}
virtual ~ListsTest() { }

Expand Down

0 comments on commit 66ea4fe

Please sign in to comment.