ebpf的主从同步实现,QPS测试与内存池QPS测试。
This commit is contained in:
@@ -14,6 +14,8 @@ extern kvs_rbtree_t global_rbtree;
|
||||
extern kvs_hash_t global_hash;
|
||||
#endif
|
||||
|
||||
extern unsigned long long global_seq;
|
||||
|
||||
static int need(const uint8_t *p, const uint8_t *end, size_t n) {
|
||||
return (p + n <= end) ? 0 : -1;
|
||||
}
|
||||
@@ -543,10 +545,12 @@ int resp_dispatch(const resp_cmd_t *cmd, resp_value_t *out_value) {
|
||||
return 0;
|
||||
}
|
||||
case KVS_CMD_SSYNC:
|
||||
__ssync(cmd->argv[1].ptr, cmd->argv[1].len, atoi(cmd->argv[2].ptr), global_seq);
|
||||
kvs_create_snapshot_async(cmd->argv[1].ptr, atoi(cmd->argv[2].ptr));
|
||||
*out_value = resp_simple("OK");
|
||||
return 0;
|
||||
case KVS_CMD_SREADY:
|
||||
__sready();
|
||||
*out_value = resp_simple("OK");
|
||||
return 0;
|
||||
default:
|
||||
@@ -555,4 +559,19 @@ int resp_dispatch(const resp_cmd_t *cmd, resp_value_t *out_value) {
|
||||
|
||||
*out_value = resp_error("ERR unknown command");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __ssync(const uint8_t *ip, uint32_t ip_len, int port, unsigned long long seq){
|
||||
// hook 在这里,必须等待 ebpf实时同步进程 状态切换为 PREPARING 才允许返回
|
||||
// 不这样做的话:快照立刻被创建,执行下一条命令(CmdX),如果此刻 ebpf 还没有被置为 PREPARING,即没有开始记录需要转发的命令
|
||||
// 会导致:快照里没有(CmdX),ebpf实时同步进程里也没有(CmdX)
|
||||
// 要怎么做?
|
||||
// master 在内部维护seq,ebpf 从启动就一直记录数据。ebpf探测 __ssync 的seq来确定从哪里开始发送。
|
||||
// ebpf: __ssync SSYNC ip port seq, 知道往哪里发,从哪里开始发
|
||||
// ebpf: __sready SREADY, 可以开始发了,发往(ip,port)
|
||||
// ebpf: __complete_cmd cmd,len,seq, 记录命令
|
||||
}
|
||||
|
||||
void __sready(){
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user