From 68d23225a38a35f1325eb39fa4ed5a005d5de473 Mon Sep 17 00:00:00 2001
From: fujuntang <fujuntang@aiot.com>
Date: 星期三, 11 八月 2021 09:50:20 +0800
Subject: [PATCH] fix from 3.1 first commit

---
 src/net/net_mod_socket.cpp |   87 +++++++++++++++++++++++--------------------
 1 files changed, 47 insertions(+), 40 deletions(-)

diff --git a/src/net/net_mod_socket.cpp b/src/net/net_mod_socket.cpp
index e689cea..2932d8c 100644
--- a/src/net/net_mod_socket.cpp
+++ b/src/net/net_mod_socket.cpp
@@ -15,37 +15,14 @@
 
 NetModSocket::NetModSocket() 
 {
-  int s;
   if (Signal(SIGPIPE, SIG_IGN) == SIG_ERR)
     logger->error(errno, "NetModSocket::NetModSocket signal");
-
-  // gpool = new NetConnPool();
-
-  // pthread_mutexattr_t mtxAttr;
-  // s = pthread_mutexattr_init(&mtxAttr);
-  // if (s != 0)
-  //   err_exit(s, "pthread_mutexattr_init");
-  // s = pthread_mutexattr_settype(&mtxAttr, PTHREAD_MUTEX_ERRORCHECK);
-  // if (s != 0)
-  //   err_exit(s, "pthread_mutexattr_settype");
-  // s = pthread_mutex_init(&sendMutex, &mtxAttr);
-  // if (s != 0)
-  //   err_exit(s, "pthread_mutex_init");
-
-  // s = pthread_mutexattr_destroy(&mtxAttr);
-  // if (s != 0)
-  //   err_exit(s, "pthread_mutexattr_destroy");
 
 }
 
 
 NetModSocket::~NetModSocket() {
-  // int s;
-  // delete gpool;
-  // s =  pthread_mutex_destroy(&sendMutex);
-  // if(s != 0) {
-  //   err_exit(s, "shm_socket_close");
-  // }
+ 
 }
 
 
@@ -150,17 +127,18 @@
 int NetModSocket::_sendandrecv_(net_node_t *node_arr, int arrlen, void *send_buf, int send_size, 
   net_mod_recv_msg_t ** recv_arr, int *recv_arr_size, int  msec ) {
 
-  int i, n, recv_size, connfd;
+  int i,  recv_size, connfd;
   net_node_t *node;
   void *recv_buf = NULL;
   struct timespec timeout;
   int ret;
-  int n_req = 0, n_recv_suc = 0, n_resp =0;
+  int n_req = 0, n_recv_suc = 0, n_recv_err = 0, n_resp =0;
   
   net_mod_request_head_t request_head = {};
    
   net_mod_recv_msg_t *ret_arr = (net_mod_recv_msg_t *)calloc(arrlen, sizeof(net_mod_recv_msg_t));
 
+  net_mod_recv_err_t err_arr[arrlen];
  
   NetConnPool *mpool = _get_pool();
 
@@ -179,6 +157,7 @@
       } else {
         ret = shmModSocket.sendandrecv(send_buf, send_size, node->key, &recv_buf, &recv_size);
       }
+
       if( ret == 0) {
         strcpy( ret_arr[n_recv_suc].host, "");
         ret_arr[n_recv_suc].port = 0;
@@ -187,13 +166,11 @@
         ret_arr[n_recv_suc].content_length = recv_size;
         n_recv_suc++;
       } else {
-        if(ret > EBUS_BASE) {
-          // bus_errno = EBUS_TIMEOUT;
-          logger->debug("NetModSocket:: %d _sendandrecv_ to key %d failed, %s", get_key(), node->key, bus_strerror(ret));
-           
-        } else {
-          logger->error(ret, "NetModSocket:: %d _sendandrecv_ to key %d failed", get_key(),  node->key);
-        }
+        err_arr[n_recv_err].port = 0;
+        err_arr[n_recv_err].key = node->key;
+        err_arr[n_recv_err].code = ret;
+        n_recv_err++;
+        logger->error("NetModSocket::  _sendandrecv_ to key %d failed. %s",  node->key, bus_strerror(ret));
       }
 
      
@@ -201,6 +178,11 @@
     }
 
     if( (connfd = mpool->getConn(node->host, node->port)) < 0 ) {
+      memcpy(err_arr[n_recv_err].host, node->host, sizeof(err_arr[n_recv_err].host));
+      err_arr[n_recv_err].port =  node->port;
+      err_arr[n_recv_err].key = node->key;
+      err_arr[n_recv_err].code = EBUS_NET;
+      n_recv_err++;
       continue;
     }
 
@@ -215,6 +197,11 @@
  // printf("write_request %s:%d\n", request_head.host, request_head.port);
     if(write_request(connfd, request_head, send_buf, send_size, NULL, 0) != 0) {
       LoggerFactory::getLogger()->error("write_request failture %s:%d\n", node->host, node->port);
+      memcpy(err_arr[n_recv_err].host, node->host, sizeof(err_arr[n_recv_err].host));
+      err_arr[n_recv_err].port =  node->port;
+      err_arr[n_recv_err].key = node->key;
+      err_arr[n_recv_err].code = EBUS_NET;
+      n_recv_err++;
       mpool->closeConn( connfd);
     } else {
       n_req++;
@@ -240,19 +227,25 @@
         {
           mpool->nready--;
 // printf("POLLIN %d\n", connfd);
-          if( (n = read_response(connfd, ret_arr+n_recv_suc)) == 0) {
+          if( (ret = read_response(connfd, ret_arr+n_recv_suc, err_arr + n_recv_err)) == 0) {
             n_recv_suc++;
             // 鎴愬姛鏀跺埌杩斿洖娑堟伅锛屾竻绌鸿鍏ヤ綅
             mpool->conns[i].fd = -1;
             
           }
-          else if(n == EBUS_NET)  {
+          else if(ret == EBUS_NET)  {
             // 缃戠粶閿欒
+
+            logger->error("NetModSocket::_sendandrecv_ read_response key = %d , %s", get_key(),  bus_strerror(ret));
             mpool->closeConn( connfd);
+            n_recv_err++;
             // mpool->conns[i].fd = -1;
           } else {
             // 浠g悊鏈嶅姟娌℃湁杞彂鎴愬姛
-             mpool->conns[i].fd = -1;
+             
+            logger->error("NetModSocket::_sendandrecv_ read_response key = %d , %s", get_key(),  bus_strerror(ret));
+            mpool->conns[i].fd = -1;
+            n_recv_err++;
           }
 
           n_resp++;
@@ -337,6 +330,8 @@
   int ret;
   NetConnPool *mpool = _get_pool();
 
+  net_mod_recv_err_t err_msg;
+
   // 鏈湴鍙戦��
   if(node_arr == NULL || arrlen == 0) {
     if(msec == 0) {
@@ -410,7 +405,7 @@
         {
           mpool->nready--;
 // printf("POLLIN %d\n", connfd);
-          if( (ret = read_response(connfd, &recv_msg)) == 0) {
+          if( (ret = read_response(connfd, &recv_msg, &err_msg)) == 0) {
             
             // 鎴愬姛鏀跺埌杩斿洖娑堟伅锛屾竻绌鸿鍏ヤ綅
             mpool->conns[i].fd = -1;
@@ -641,7 +636,7 @@
  * @return 0 鎴愬姛,   EBUS_NET 缃戠粶閿欒锛� 鍏朵粬鍊� 浠g悊鏈嶅姟娌℃湁杞彂鎴愬姛銆�
  *
  */
-int NetModSocket::read_response(int connfd, net_mod_recv_msg_t *recv_msg) {
+int NetModSocket::read_response(int connfd, net_mod_recv_msg_t *recv_msg, net_mod_recv_err_t *err_arr) {
   int recv_size;
   void *recv_buf;
   char response_head_bs[NET_MODE_RESPONSE_HEAD_LENGTH];
@@ -649,14 +644,21 @@
   net_mod_response_head_t response_head;
   if ( rio_readn(connfd, response_head_bs, NET_MODE_RESPONSE_HEAD_LENGTH) !=  NET_MODE_RESPONSE_HEAD_LENGTH) {
     LoggerFactory::getLogger()->error(errno, "NetModSocket::read_response  rio_readnb response_head");
-    
-    return -1;
+    memcpy(err_arr->host, "unkown", sizeof(err_arr->host));
+    err_arr->port =  0;
+    err_arr->key = 0;
+    err_arr->code = EBUS_NET;
+    return EBUS_NET;
   }
 
   response_head =  NetModSocket::decode_response_head(response_head_bs);
 // printf(">>>> read_response %s\n", response_head.host);
   if(response_head.code != 0) {
     // 浠g悊鏈嶅姟娌¤兘鎴愬姛鍙戦�佺粰瀵瑰簲鐨刱ey
+    memcpy(err_arr->host, response_head.host, sizeof(err_arr->host));
+    err_arr->port =  response_head.port;
+    err_arr->key = response_head.key;
+    err_arr->code = response_head.code;
     return response_head.code;
   }
 
@@ -666,6 +668,11 @@
     exit(1);
   }
   if ( (recv_size = rio_readn(connfd, recv_buf, response_head.content_length) ) !=  response_head.content_length) {
+
+    memcpy(err_arr->host, response_head.host, sizeof(err_arr->host));
+    err_arr->port =  response_head.port;
+    err_arr->key = response_head.key;
+    err_arr->code = EBUS_NET;
     LoggerFactory::getLogger()->error(errno, "NetModSocket::read_response  rio_readnb recv_buf");
     //缃戠粶閿欒
     return EBUS_NET;

--
Gitblit v1.8.0