Skip to content

Commit

Permalink
add del support
Browse files Browse the repository at this point in the history
  • Loading branch information
LLiuJJ committed Jul 29, 2023
1 parent ffadb01 commit d56cd79
Show file tree
Hide file tree
Showing 25 changed files with 523 additions and 229 deletions.
7 changes: 4 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -167,19 +167,20 @@ list(APPEND eraftvdb_sources src/eraftkv.pb.cc)
list(APPEND eraftvdb_sources src/info_command_handler.cc)
list(APPEND eraftvdb_sources src/set_command_handler.cc)
list(APPEND eraftvdb_sources src/get_command_handler.cc)
list(APPEND eraftvdb_sources src/del_command_handler.cc)
list(APPEND eraftvdb_sources src/shardgroup_command_handler.cc)
list(APPEND eraftvdb_sources src/unknow_command_handler.cc)
list(APPEND eraftvdb_sources src/util.cc)

add_executable(eraft-vdb ${eraftvdb_sources})
target_link_libraries(eraft-vdb
add_executable(eraft-kdb ${eraftvdb_sources})
target_link_libraries(eraft-kdb
pthread
rocksdb
gRPC::grpc++
${Protobuf_LIBRARY}
stdc++fs
)
target_include_directories(eraft-vdb PUBLIC ${eraftkv_INCLUDE_DIR})
target_include_directories(eraft-kdb PUBLIC ${eraftkv_INCLUDE_DIR})

# build eraftkv
set(eraftkv_sources)
Expand Down
12 changes: 8 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -61,17 +61,21 @@ run-demo:
docker run --name metaserver-node2 --network mytestnetwork --ip 172.18.0.3 -d --rm -v $(realpath .):/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraftmeta 1 /tmp/meta_db1 /tmp/log_db1 172.18.0.2:8088,172.18.0.3:8089,172.18.0.4:8090
docker run --name metaserver-node3 --network mytestnetwork --ip 172.18.0.4 -d --rm -v $(realpath .):/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraftmeta 2 /tmp/meta_db2 /tmp/log_db2 172.18.0.2:8088,172.18.0.3:8089,172.18.0.4:8090
sleep 16
docker run --name vdbserver-node --network mytestnetwork --ip 172.18.0.6 -it --rm -v $(realpath .):/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraft-vdb 172.18.0.6:12306 172.18.0.2:8088,172.18.0.3:8089,172.18.0.4:8090
docker run --name vdbserver-node --network mytestnetwork --ip 172.18.0.6 -it --rm -v $(realpath .):/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraft-kdb 172.18.0.6:12306 172.18.0.2:8088,172.18.0.3:8089,172.18.0.4:8090

stop-demo:
docker stop kvserver-node1 kvserver-node2 kvserver-node3 vdbserver-node metaserver-node1 metaserver-node2 metaserver-node3

run-demo-bench:
docker run --name kvserver-bench --network mytestnetwork --ip 172.18.0.5 --rm -v $(realpath .):/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraftkv-ctl 172.18.0.2:8088 bench 64 64 10

run-vdb-tests:
chmod +x utils/run-vdb-tests.sh
docker run --name vdbserver-node-tests --network mytestnetwork --ip 172.18.0.9 -it --rm -v $(realpath .):/eraft eraft/eraftkv:v0.0.6 /eraft/utils/run-vdb-tests.sh
init-kdb-meta:
chmod +x utils/init-kdb-meta.sh
docker run --name vdbserver-node-tests --network mytestnetwork --ip 172.18.0.9 -it --rm -v $(realpath .):/eraft eraft/eraftkv:v0.0.6 /eraft/utils/init-kdb-meta.sh

run-kdb-tests:
chmod +x utils/run-kdb-tests.sh
docker run --name vdbserver-node-tests --network mytestnetwork --ip 172.18.0.9 -it --rm -v $(realpath .):/eraft eraft/eraftkv:v0.0.6 /eraft/utils/run-kdb-tests.sh

run-metaserver-tests:
docker run --name metaserver-node1 --network mytestnetwork --ip 172.18.0.2 -d --rm -v $(realpath .):/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraftmeta 0 /tmp/meta_db0 /tmp/log_db0 172.18.0.2:8088,172.18.0.3:8089,172.18.0.4:8090
Expand Down
51 changes: 40 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ ERaftKDB is a distributed database that supports the Redis RESP protocol, and us

![eraft-kdb](doc/eraft-kdb.png)

## Redis Command Support Plan

| Command | Status |
| -------- | ------- |
| get | [x] |
| set | [x] |
| del | [x] |
| scan | [ ] |


## ERaftKV

ERaftKV is a persistent distributed KV storage system, uses the Raft protocol to ensure data consistency, At the same time, it supports sharding to form multi shard large-scale data storage clusters.
Expand Down Expand Up @@ -65,26 +75,43 @@ docker run --name metaserver-node2 --network mytestnetwork --ip 172.18.0.3 -d --
docker run --name metaserver-node3 --network mytestnetwork --ip 172.18.0.4 -d --rm -v /home/colin/eraft:/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraftmeta 2 /tmp/meta_db2 /tmp/log_db2 172.18.0.2:8088,172.18.0.3:8089,172.18.0.4:8090
10269f84d95e9f82f75d3c60f0d7b0dc0efe5efe643366e615b7644fb8851f04
sleep 16
docker run --name vdbserver-node --network mytestnetwork --ip 172.18.0.6 -it --rm -v /home/colin/eraft:/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraft-vdb 172.18.0.6:12306 172.18.0.2:8088,172.18.0.3:8089,172.18.0.4:8090
docker run --name vdbserver-node --network mytestnetwork --ip 172.18.0.6 -it --rm -v /home/colin/eraft:/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraft-kdb 172.18.0.6:12306 172.18.0.2:8088,172.18.0.3:8089,172.18.0.4:8090
run server success!
```

- step 3, run eraft vdb tests
- step 3, run eraft kdb tests

```
sudo make run-vdb-tests
sudo make init-kdb-meta
sudo make run-kdb-tests
```
command output
```
chmod +x utils/run-vdb-tests.sh
docker run --name vdbserver-node-tests --network mytestnetwork --ip 172.18.0.9 -it --rm -v /home/colin/eraft:/eraft eraft/eraftkv:v0.0.6 /eraft/utils/run-vdb-tests.sh
... (config change log)

```
chmod +x utils/run-kdb-tests.sh
docker run --name vdbserver-node-tests --network mytestnetwork --ip 172.18.0.9 -it --rm -v /Users/colin/Documents/eraft:/eraft eraft/eraftkv:v0.0.6 /eraft/utils/run-kdb-tests.sh
+ redis-cli -h 172.18.0.6 -p 12306 shardgroup query
1) "shardgroup"
2) "1"
3) "servers"
4) "0"
5) "172.18.0.10:8088"
6) "1"
7) "172.18.0.11:8089"
8) "2"
9) "172.18.0.12:8090"
+ redis-cli -h 172.18.0.6 -p 12306 shardgroup join 1 172.18.0.10:8088,172.18.0.11:8089,172.18.0.12:8090
OK
+ redis-cli -h 172.18.0.6 -p 12306 shardgroup move 1 0-1023
OK
+ sleep 1
+ redis-cli -h 172.18.0.6 -p 12306 info
server_id: 0,server_address: 172.18.0.10:8088,status: Running,Role: Leader
server_id: 1,server_address: 172.18.0.11:8089,status: Running,Role: Follower
server_id: 2,server_address: 172.18.0.12:8090,status: Running,Role: Follower
meta server:
server_id: 0,server_address: 172.18.0.2:8088,status: Running,Role: Leader
meta server:
server_id: 1,server_address: 172.18.0.3:8089,status: Running,Role: Follower
meta server:
server_id: 2,server_address: 172.18.0.4:8090,status: Running,Role: Follower
+ redis-cli -h 172.18.0.6 -p 12306 set a h
OK
+ redis-cli -h 172.18.0.6 -p 12306 set b e
Expand All @@ -106,6 +133,8 @@ OK
"l"
+ redis-cli -h 172.18.0.6 -p 12306 get e
"o"
+ redis-cli -h 172.18.0.6 -p 12306 get nil_test
(nil)
```

- step 4, clean all
Expand Down
2 changes: 1 addition & 1 deletion doc/eraft-kdb.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ shard_group {
[==========] 1 test from 1 test suite ran. (4028 ms total)
[ PASSED ] 1 test.
sleep 2
docker run --name vdbserver-node --network mytestnetwork --ip 172.18.0.6 -it --rm -v /home/colin/eraft:/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraft-vdb 172.18.0.6:12306 172.18.0.2:8088,172.18.0.3:8089,172.18.0.4:8090
docker run --name vdbserver-node --network mytestnetwork --ip 172.18.0.6 -it --rm -v /home/colin/eraft:/eraft eraft/eraftkv:v0.0.6 /eraft/build/eraft-kdb 172.18.0.6:12306 172.18.0.2:8088,172.18.0.3:8089,172.18.0.4:8090
run server success!
```

Expand Down
2 changes: 2 additions & 0 deletions protocol/eraftkv.proto
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@ message ClusterConfigChangeResp {
bool success = 1;
repeated ShardGroup shard_group = 2;
int64 config_version = 3;
ErrorCode error_code = 4;
int64 leader_addr = 5;
}

enum ClientOpType {
Expand Down
2 changes: 2 additions & 0 deletions src/client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ PacketLength Client::_HandlePacket(const char *start, std::size_t bytes) {
handler = new SetCommandHandler();
} else if (parser_.GetParams()[0] == "get") {
handler = new GetCommandHandler();
} else if (parser_.GetParams()[0] == "del") {
handler = new DelCommandHandler();
} else if (parser_.GetParams()[0] == "shardgroup") {
handler = new ShardGroupCommandHandler();
} else {
Expand Down
1 change: 1 addition & 0 deletions src/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class Client : public StreamSocket {
friend class InfoCommandHandler;
friend class SetCommandHandler;
friend class GetCommandHandler;
friend class DelCommandHandler;
friend class UnKnowCommandHandler;
friend class ShardGroupCommandHandler;

Expand Down
8 changes: 8 additions & 0 deletions src/command_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,14 @@ class GetCommandHandler : public CommandHandler {
~GetCommandHandler();
};

class DelCommandHandler : public CommandHandler {
public:
EStatus Execute(const std::vector<std::string>& params, Client* cli);

DelCommandHandler();
~DelCommandHandler();
};

class UnKnowCommandHandler : public CommandHandler {
public:
EStatus Execute(const std::vector<std::string>& params, Client* cli);
Expand Down
48 changes: 48 additions & 0 deletions src/del_command_handler.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/**
* @file del_command_handler.cc
* @author [email protected]
* @brief
* @version 0.1
* @date 2023-07-28
*
* @copyright Copyright (c) 2023
*
*/

#include "command_handler.h"
#include "key_encode.h"

EStatus DelCommandHandler::Execute(const std::vector<std::string>& params,
Client* cli) {
std::string leader_addr;
uint16_t slot;
leader_addr = cli->GetShardLeaderAddrAndSlot(params[1], &slot);
TraceLog("DEBUG: send del request to leader ", leader_addr);
ClientContext op_context;
eraftkv::ClientOperationReq op_req;
eraftkv::ClientOperationResp op_resp;
auto kv_pair_ = op_req.add_kvs();
std::string encode_key = EncodeStringKey(slot, params[1]);
kv_pair_->set_key(encode_key);
kv_pair_->set_op_type(eraftkv::ClientOpType::Del);
std::string reply_buf;
if (cli->kv_stubs_[leader_addr] != nullptr) {
auto status_ = cli->kv_stubs_[leader_addr]->ProcessRWOperation(
&op_context, op_req, &op_resp);
if (status_.ok()) {
reply_buf += "+OK\r\n";
} else {
reply_buf += "-ERR Server error\r\n";
}
} else {
reply_buf += "-ERR Server error\r\n";
}
cli->reply_.PushData(reply_buf.c_str(), reply_buf.size());
cli->SendPacket(cli->reply_);
cli->_Reset();
return EStatus::kOk;
}

DelCommandHandler::DelCommandHandler() {}

DelCommandHandler::~DelCommandHandler() {}
2 changes: 0 additions & 2 deletions src/eraft_vdb_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@

#include "server.h"

#define KV_SERVER_ADDRS "127.0.0.1:8088,127.0.0.1:8089,127.0.0.1:8090"

class ERaftVdbServer : public Server {
public:
ERaftVdbServer(std::string addr, std::string kv_svr_addrs);
Expand Down
Loading

0 comments on commit d56cd79

Please sign in to comment.