From 21795f23fa1532edffb636de90789749bf7dae04 Mon Sep 17 00:00:00 2001 From: Kemeng Shi Date: Tue, 11 May 2021 16:35:55 +0800 Subject: [PATCH 30/50] notify rpc success with finish tag Signed-off-by: Kemeng Shi --- src/etmem_src/etmem_rpc.c | 39 +++++++++++++++++++++---------------- src/etmemd_src/etmemd_rpc.c | 25 ++++++++++++++++-------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/etmem_src/etmem_rpc.c b/src/etmem_src/etmem_rpc.c index 48a4a96..2c70cf8 100644 --- a/src/etmem_src/etmem_rpc.c +++ b/src/etmem_src/etmem_rpc.c @@ -31,6 +31,9 @@ #define ETMEM_RPC_SEND_BUF_LEN 512 #define ETMEM_RPC_CONN_TIMEOUT 10 +#define SUCCESS_CHAR (0xff) +#define FAIL_CHAR (0xfe) + static int etmem_client_conn(const struct mem_proj *proj, int sockfd) { struct sockaddr_un svr_addr; @@ -144,14 +147,6 @@ EXIT: return ret; } -static bool etmem_recv_find_fail_keyword(const char *recv_msg) -{ - if (strstr(recv_msg, "error") != NULL) { - return true; - } - return false; -} - static int etmem_client_recv(int sockfd) { ssize_t recv_size; @@ -159,6 +154,7 @@ static int etmem_client_recv(int sockfd) char *recv_msg = NULL; uint8_t *recv_buf = NULL; size_t recv_len = ETMEM_RPC_RECV_BUF_LEN; + bool done = false; recv_buf = (uint8_t *)calloc(recv_len, sizeof(uint8_t)); if (recv_buf == NULL) { @@ -166,27 +162,36 @@ static int etmem_client_recv(int sockfd) return -1; } - while (true) { + while (!done) { recv_size = recv(sockfd, recv_buf, recv_len - 1, 0); if (recv_size < 0) { perror("recv failed:"); goto EXIT; } if (recv_size == 0) { - if (errno == EAGAIN || errno == EWOULDBLOCK) { - printf("recv timeout:\n"); - } - ret = 0; + printf("connection closed by peer\n"); goto EXIT; } recv_msg = (char *)recv_buf; recv_msg[recv_size] = '\0'; - printf("%s\n", recv_msg); - if (etmem_recv_find_fail_keyword(recv_msg)) { - printf("error occurs when getting response from etmemd server\n"); - goto EXIT; + + // check and erease finish flag + switch (recv_msg[recv_size - 1]) { + case (char)SUCCESS_CHAR: + ret = 0; + done = true; + recv_msg[recv_size - 1] = '\0'; + break; + case (char)FAIL_CHAR: + done = true; + recv_msg[recv_size - 1] = '\n'; + break; + default: + break; } + + printf("%s", recv_msg); } EXIT: diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c index ba5971c..208f6b5 100644 --- a/src/etmemd_src/etmemd_rpc.c +++ b/src/etmemd_src/etmemd_rpc.c @@ -35,6 +35,9 @@ #define RPC_CLIENT_MAX 1 #define RPC_BUFF_LEN_MAX 512 +#define SUCCESS_CHAR (0xff) +#define FAIL_CHAR (0Xfe) + static bool g_exit = true; static char *g_sock_name = NULL; static int g_sock_fd; @@ -58,7 +61,6 @@ struct server_rpc_parser g_rpc_parser[] = { }; struct rpc_resp_msg g_resp_msg_arr[] = { - {OPT_SUCCESS, "success"}, {OPT_INVAL, "error: invalid parameters"}, {OPT_PRO_EXISTED, "error: project has been existed"}, {OPT_PRO_NOEXIST, "error: project is not exist"}, @@ -533,10 +535,7 @@ static void etmemd_rpc_send_response_msg(int sock_fd, enum opt_result result) { int i = 0; ssize_t ret = -1; - - if (result == OPT_SUCCESS) { - return; - } + char finish_tag; while (g_resp_msg_arr[i].msg != NULL) { if (result != g_resp_msg_arr[i].result) { @@ -545,12 +544,22 @@ static void etmemd_rpc_send_response_msg(int sock_fd, enum opt_result result) } ret = send(sock_fd, g_resp_msg_arr[i].msg, strlen(g_resp_msg_arr[i].msg), 0); + if (ret < 0) { + etmemd_log(ETMEMD_LOG_ERR, "send response to client fail, error(%s)\n", + strerror(errno)); + } break; } - if (ret < 0) { - etmemd_log(ETMEMD_LOG_ERR, "send response to client fail, error(%s)\n", - strerror(errno)); + // notify result with finish tag + if (result == OPT_SUCCESS) { + finish_tag = SUCCESS_CHAR; + } else { + finish_tag = FAIL_CHAR; + } + ret = send(sock_fd, &finish_tag, 1, 0); + if (ret <= 0) { + etmemd_log(ETMEMD_LOG_ERR, "send finish tag fail\n"); } return; } -- 2.27.0