Files
ldb/kvs_slave.c

111 lines
2.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
/* 创建并监听用于接收快照的 TCP 监听 socket成功返回 listen fd失败返回 -1 */
static int create_listen_socket(const char *ip, int port){
}
/* 主动连接 master 指定地址用于控制面通信SSYNC / SREADY返回连接 fd 或 -1 */
static int connect_master(const char *master_ip, int master_port){
}
/* 通过控制连接向 master 发送 SSYNC 请求,声明本 slave 的快照接收地址 */
static int send_ssync(int ctrl_fd, const char *listen_ip, int listen_port){
}
/* 接收并校验 master 对 SSYNC 的确认响应(如 +OK成功返回 0 */
static int recv_ssync_ok(int ctrl_fd){
}
/* 在快照监听 socket 上阻塞等待 master 的快照发送连接,返回已建立连接的 fd */
static int accept_snapshot_conn(int listen_fd){
}
/* 从快照连接中接收完整快照数据并构建内存状态,确保快照已完全应用 */
static int recv_and_apply_snapshot(int snapshot_fd){
}
/* 通过控制连接向 master 发送 SREADY 通知表示快照已应用slave 即将进入服务态 */
int send_sready(int ctrl_fd){
}
int slave_bootstrap(
const char *listen_ip,
int listen_port,
const char *master_ip,
int master_port
) {
int listen_fd = -1;
int ctrl_fd = -1;
int snap_fd = -1;
/* 1. 监听 snapshot port */
listen_fd = create_listen_socket(listen_ip, listen_port);
if (listen_fd < 0) {
goto fail;
}
/* 2. 连接 master, 发送 SSYNC */
ctrl_fd = connect_master(master_ip, master_port);
if (ctrl_fd < 0) {
goto fail;
}
if (send_ssync(ctrl_fd, listen_ip, listen_port) < 0) {
goto fail;
}
if (recv_ssync_ok(ctrl_fd) < 0) {
goto fail;
}
close(ctrl_fd);
ctrl_fd = -1;
/* 3. accept snapshot 连接 */
snap_fd = accept_snapshot_conn(listen_fd);
if (snap_fd < 0) {
goto fail;
}
/* 4. 接收 snapshot */
if (recv_and_apply_snapshot(snap_fd) < 0) {
goto fail;
}
close(snap_fd);
snap_fd = -1;
close(listen_fd);
listen_fd = -1;
/* 5. 通知 master 快照传输完毕 */
ctrl_fd = connect_master(master_ip, master_port);
if (ctrl_fd >= 0) {
send_sready(ctrl_fd);
close(ctrl_fd);
ctrl_fd = -1;
}
/* 6. bootstrap complete */
return 0;
fail:
if (snap_fd >= 0) close(snap_fd);
if (ctrl_fd >= 0) close(ctrl_fd);
if (listen_fd >= 0) close(listen_fd);
return -1;
}