158 lines
4.5 KiB
Diff
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
|
|
|