Skip to content

Commit

Permalink
[feat][sdk] Implement RawKv
Browse files Browse the repository at this point in the history
  • Loading branch information
wchuande authored and ketor committed Nov 22, 2023
1 parent 82d2cd8 commit 6f3185d
Show file tree
Hide file tree
Showing 9 changed files with 1,951 additions and 88 deletions.
354 changes: 344 additions & 10 deletions src/example/sdk_example.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,15 @@

#include <unistd.h>

#include <algorithm>
#include <cstdio>
#include <iterator>
#include <memory>
#include <vector>

#include "common/logging.h"
#include "coordinator/coordinator_interaction.h"
#include "fmt/core.h"
#include "glog/logging.h"
#include "sdk/client.h"
#include "sdk/meta_cache.h"
Expand Down Expand Up @@ -63,6 +68,10 @@ void MetaCacheExample() {

got = meta_cache->LookupRegionByKey("wc00000000", region);
DINGO_LOG(INFO) << got.ToString();
CHECK(got.IsOK());

got = meta_cache->LookupRegionByKey("wz00000000", region);
DINGO_LOG(INFO) << got.ToString();
CHECK(got.IsNotFound());

meta_cache->Dump();
Expand All @@ -79,16 +88,339 @@ void RawKVExample() {
CHECK(built.IsOK()) << "dingo raw_kv build fail";
CHECK_NOTNULL(raw_kv.get());

std::string key = "wb01";
std::string value = "pong";
Status put = raw_kv->Put(key, value);
DINGO_LOG(INFO) << "raw_kv put:" << put.ToString();
{
// put/get/delete
std::string key = "wb01";
std::string value = "pong";
Status put = raw_kv->Put(key, value);
DINGO_LOG(INFO) << "raw_kv put:" << put.ToString();

std::string to_get;
Status got = raw_kv->Get(key, to_get);
DINGO_LOG(INFO) << "raw_kv get:" << got.ToString() << ", value:" << to_get;
if (got.IsOK()) {
CHECK_EQ(value, to_get);
}

Status del = raw_kv->Delete(key);
DINGO_LOG(INFO) << "raw_kv delete:" << del.ToString();
if (del.IsOK()) {
std::string tmp;
got = raw_kv->Get(key, tmp);
DINGO_LOG(INFO) << "raw_kv get after delete:" << got.ToString() << ", value:" << tmp;
CHECK(tmp.empty());
}
}

std::vector<std::string> keys;
keys.push_back("wb01");
keys.push_back("wc01");
keys.push_back("wd01");
keys.push_back("wf01");

std::vector<std::string> values;
values.push_back("rwb01");
values.push_back("rwc01");
values.push_back("rwd01");
values.push_back("rwf01");

{
// batch put/batch get/batch delete
std::vector<dingodb::sdk::KVPair> kvs;
kvs.reserve(keys.size());
for (auto i = 0; i < keys.size(); i++) {
kvs.push_back({keys[i], values[i]});
}

Status result = raw_kv->BatchPut(kvs);
DINGO_LOG(INFO) << "raw_kv batch_put:" << result.ToString();

std::vector<dingodb::sdk::KVPair> batch_get_values;
result = raw_kv->BatchGet(keys, batch_get_values);
DINGO_LOG(INFO) << "raw_kv batch_get:" << result.ToString();
if (result.IsOK()) {
for (const auto& kv : batch_get_values) {
DINGO_LOG(INFO) << "raw_kv batch_get key:" << kv.key << ", value:" << kv.value;
}
}

result = raw_kv->BatchDelete(keys);
DINGO_LOG(INFO) << "raw_kv batch_delete:" << result.ToString();

std::vector<dingodb::sdk::KVPair> tmp_batch_get_values;
result = raw_kv->BatchGet(keys, tmp_batch_get_values);
DINGO_LOG(INFO) << "raw_kv batch_get after batch delete:" << result.ToString();
if (result.IsOK()) {
for (const auto& kv : tmp_batch_get_values) {
DINGO_LOG(INFO) << "raw_kv batch_get after delete, key:" << kv.key << ", value:" << kv.value;
}

CHECK_EQ(0, tmp_batch_get_values.size());
}
}

{
// put if absent
std::string key = "wb01";
std::string value = "pong";

bool state;
Status result = raw_kv->PutIfAbsent(key, value, state);
DINGO_LOG(INFO) << "raw_kv put_if_absent:" << result.ToString() << "; state:" << (state ? "true" : "false");

std::string to_get;
result = raw_kv->Get(key, to_get);
DINGO_LOG(INFO) << "raw_kv get after put_if_absent:" << result.ToString() << ", value:" << to_get;
if (result.IsOK()) {
CHECK_EQ(value, to_get);
}

bool again_state;
result = raw_kv->PutIfAbsent(key, value, again_state);
DINGO_LOG(INFO) << "raw_kv put_if_absent again:" << result.ToString()
<< "; state:" << (again_state ? "true" : "false");

result = raw_kv->Delete(key);
DINGO_LOG(INFO) << "raw_kv delete:" << result.ToString();
if (result.IsOK()) {
std::string tmp;
result = raw_kv->Get(key, tmp);
DINGO_LOG(INFO) << "raw_kv get after delete:" << result.ToString() << ", value:" << tmp;
CHECK(tmp.empty());
}
}

{
// batch put if absent
std::vector<dingodb::sdk::KVPair> kvs;
kvs.reserve(keys.size());
for (auto i = 0; i < keys.size(); i++) {
kvs.push_back({keys[i], values[i]});
}

std::vector<dingodb::sdk::KeyOpState> keys_state;
Status result = raw_kv->BatchPutIfAbsent(kvs, keys_state);
DINGO_LOG(INFO) << "raw_kv batch_put_if_absent:" << result.ToString();
if (result.IsOK()) {
for (const auto& key_state : keys_state) {
DINGO_LOG(INFO) << "raw_kv batch_put_if_absent, key:" << key_state.key
<< ", state:" << (key_state.state ? "true" : "false");
}
}

std::vector<dingodb::sdk::KVPair> batch_get_values;
result = raw_kv->BatchGet(keys, batch_get_values);
DINGO_LOG(INFO) << "raw_kv batch_get after batch_put_if_absent:" << result.ToString();
if (result.IsOK()) {
for (const auto& kv : batch_get_values) {
DINGO_LOG(INFO) << "raw_kv batch_get after batch_put_if_absent:" << kv.key << ", value:" << kv.value;
}
}

std::vector<dingodb::sdk::KeyOpState> again_keys_state;
result = raw_kv->BatchPutIfAbsent(kvs, again_keys_state);
DINGO_LOG(INFO) << "raw_kv batch_put_if_absent again:" << result.ToString();
if (result.IsOK()) {
for (const auto& key_state : again_keys_state) {
DINGO_LOG(INFO) << "raw_kv batch_put_if_absent again, key:" << key_state.key
<< ", state:" << (key_state.state ? "true" : "false");
}
}

result = raw_kv->BatchDelete(keys);
DINGO_LOG(INFO) << "raw_kv batch_delete:" << result.ToString();

std::vector<dingodb::sdk::KVPair> tmp_batch_get_values;
result = raw_kv->BatchGet(keys, tmp_batch_get_values);
DINGO_LOG(INFO) << "raw_kv batch_get after batch delete:" << result.ToString();
if (result.IsOK()) {
for (const auto& kv : tmp_batch_get_values) {
DINGO_LOG(INFO) << "raw_kv batch_get after delete, key:" << kv.key << ", value:" << kv.value;
}
CHECK_EQ(0, tmp_batch_get_values.size());
}
}

{
// delete range
std::vector<dingodb::sdk::KVPair> kvs;
kvs.reserve(keys.size());
for (auto i = 0; i < keys.size(); i++) {
kvs.push_back({keys[i], values[i]});
}

Status result = raw_kv->BatchPut(kvs);
DINGO_LOG(INFO) << "raw_kv batch_put:" << result.ToString();

std::vector<dingodb::sdk::KVPair> batch_get_values;
result = raw_kv->BatchGet(keys, batch_get_values);
DINGO_LOG(INFO) << "raw_kv batch_get:" << result.ToString();
if (result.IsOK()) {
for (const auto& kv : batch_get_values) {
DINGO_LOG(INFO) << "raw_kv batch_get key:" << kv.key << ", value:" << kv.value;
}
}

int64_t delete_count = 0;
result = raw_kv->DeleteRange("wb01", "wf01", delete_count, true, true);
DINGO_LOG(INFO) << "raw_kv delete range:" << result.ToString();

std::vector<dingodb::sdk::KVPair> tmp_batch_get_values;
result = raw_kv->BatchGet(keys, tmp_batch_get_values);
DINGO_LOG(INFO) << "raw_kv batch_get after delete_range:" << result.ToString();
if (result.IsOK()) {
for (const auto& kv : tmp_batch_get_values) {
DINGO_LOG(INFO) << "raw_kv batch_get after delete_range, key:" << kv.key << ", value:" << kv.value;
}
CHECK_EQ(0, tmp_batch_get_values.size());
}
}

{
// compare and set
std::string key = "wb01";
std::string value = "pong";

bool state;
Status result = raw_kv->CompareAndSet(key, value, "", state);
DINGO_LOG(INFO) << "raw_kv compare_and_set:" << result.ToString() << " key:" << key << " value:" << value
<< " expect:empty"
<< " state:" << (state ? "true" : "false");

std::string to_get;
result = raw_kv->Get(key, to_get);
DINGO_LOG(INFO) << "raw_kv get after compare_and_set:" << result.ToString() << ", value:" << to_get;
if (result.IsOK()) {
CHECK_EQ(value, to_get);
}

bool again_state;
result = raw_kv->CompareAndSet(key, "ping", value, again_state);
DINGO_LOG(INFO) << "raw_kv compare_and_set again:" << result.ToString() << " key:" << key << " value:ping"
<< " expect:" << value << " state:" << (again_state ? "true" : "false");

std::string again_get;
result = raw_kv->Get(key, again_get);
DINGO_LOG(INFO) << "raw_kv get after compare_and_set again:" << result.ToString() << ", value:" << again_get;
if (result.IsOK()) {
CHECK_EQ("ping", again_get);
}

result = raw_kv->Delete(key);
DINGO_LOG(INFO) << "raw_kv delete:" << result.ToString();
if (result.IsOK()) {
std::string tmp;
result = raw_kv->Get(key, tmp);
DINGO_LOG(INFO) << "raw_kv get after delete:" << result.ToString() << ", value:" << tmp;
CHECK(tmp.empty());
}
}

{
// batch compare and set
{
// first batch_compare_and_set
std::vector<dingodb::sdk::KVPair> kvs;
std::vector<std::string> expect_values;

kvs.reserve(keys.size());
for (auto i = 0; i < keys.size(); i++) {
kvs.push_back({keys[i], values[i]});
}

expect_values.resize(kvs.size(), "");

std::vector<dingodb::sdk::KeyOpState> keys_state;
Status result = raw_kv->BatchCompareAndSet(kvs, expect_values, keys_state);
DINGO_LOG(INFO) << "raw_kv batch_compare_and_set:" << result.ToString();

if (result.IsOK()) {
for (const auto& key_state : keys_state) {
DINGO_LOG(INFO) << "raw_kv batch_compare_and_set, key:" << key_state.key
<< ", state:" << (key_state.state ? "true" : "false");
CHECK(key_state.state);
}
}

std::vector<dingodb::sdk::KVPair> batch_get_values;
result = raw_kv->BatchGet(keys, batch_get_values);
DINGO_LOG(INFO) << "raw_kv batch_get after batch_compare_and_set:" << result.ToString();
if (result.IsOK()) {
for (const auto& kv : batch_get_values) {
DINGO_LOG(INFO) << "raw_kv batch_get after batch_compare_and_set key:" << kv.key << ", value:" << kv.value;
bool find = false;
for (const auto& ele : kvs) {
if (ele.key == kv.key) {
CHECK_EQ(ele.key, kv.key);
CHECK_EQ(ele.value, kv.value);
find = true;
}
}
CHECK(find);
}
}
}

{
// batch_compare_and_set again
std::vector<dingodb::sdk::KVPair> kvs;
std::vector<std::string> expect_values;

kvs.reserve(keys.size());
for (auto& key : keys) {
kvs.push_back({key, "ping"});
}

expect_values.reserve(values.size());
for (auto& value : values) {
expect_values.push_back(value);
}

CHECK_EQ(kvs.size(), expect_values.size());

std::vector<dingodb::sdk::KeyOpState> again_keys_state;
Status result = raw_kv->BatchCompareAndSet(kvs, expect_values, again_keys_state);
DINGO_LOG(INFO) << "raw_kv batch_compare_and_set again:" << result.ToString();
if (result.IsOK()) {
for (const auto& key_state : again_keys_state) {
DINGO_LOG(INFO) << "raw_kv batch_put_if_absent again, key:" << key_state.key
<< ", state:" << (key_state.state ? "true" : "false");
CHECK(key_state.state);
}
}

std::vector<dingodb::sdk::KVPair> batch_get_values;
result = raw_kv->BatchGet(keys, batch_get_values);
DINGO_LOG(INFO) << "raw_kv batch_get after batch_compare_and_set again:" << result.ToString();
if (result.IsOK()) {
for (const auto& kv : batch_get_values) {
DINGO_LOG(INFO) << "raw_kv batch_get after batch_compare_and_set again key:" << kv.key
<< ", value:" << kv.value;
bool find = false;
for (const auto& ele : kvs) {
if (ele.key == kv.key) {
CHECK_EQ(ele.key, kv.key);
CHECK_EQ(ele.value, kv.value);
find = true;
}
}
CHECK(find);
}
}
}

Status result = raw_kv->BatchDelete(keys);
DINGO_LOG(INFO) << "raw_kv batch_delete:" << result.ToString();

std::string to_get;
Status got = raw_kv->Get(key, to_get);
DINGO_LOG(INFO) << "raw_kv get:" << got.ToString() << ", value:" << to_get;
if (got.IsOK()) {
CHECK_EQ(value, to_get);
std::vector<dingodb::sdk::KVPair> tmp_batch_get_values;
result = raw_kv->BatchGet(keys, tmp_batch_get_values);
DINGO_LOG(INFO) << "raw_kv batch_get after batch delete:" << result.ToString();
if (result.IsOK()) {
for (const auto& kv : tmp_batch_get_values) {
DINGO_LOG(INFO) << "raw_kv batch_get after delete, key:" << kv.key << ", value:" << kv.value;
}
CHECK_EQ(0, tmp_batch_get_values.size());
}
}
}

Expand All @@ -114,7 +446,9 @@ int main(int argc, char* argv[]) {
return -1;
}

CreateRegion("skd_example", "wa00000000", "wc00000000", 3);
CreateRegion("skd_example01", "wa00000000", "wc00000000", 3);
CreateRegion("skd_example02", "wc00000000", "we00000000", 3);
CreateRegion("skd_example03", "we00000000", "wg00000000", 3);

// wait region ready
sleep(3);
Expand Down
Loading

0 comments on commit 6f3185d

Please sign in to comment.