etmem/0030-notify-rpc-success-with-finish-tag.patch
YangXin ce6533c4bd Update etmem.
Signed-off-by: YangXin <245051644@qq.com>
2021-09-30 22:57:41 +08:00

158 lines
4.5 KiB
Diff

From 21795f23fa1532edffb636de90789749bf7dae04 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Tue, 11 May 2021 16:35:55 +0800
Subject: [PATCH 30/50] notify rpc success with finish tag
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
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