wangzhengquan
2021-01-18 fb3f4f606659af9cbf10b0b6710fb80fcaec5627
Merge branch 'master' into dev
7个文件已修改
71 ■■■■■ 已修改文件
src/bus_error.cpp 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/bus_error.h 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/queue/lock_free_queue.h 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/queue/shm_queue.h 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/socket/net_mod_server_socket.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/socket/net_mod_socket.cpp 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/socket/shm_socket.cpp 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/bus_error.cpp
@@ -13,9 +13,10 @@
static char *_bus_errlist[_bus_nerr] = {
  "\0",
  "timeout",
  "Timeout",
  "The other end is not inline",
  "Key already in use"
  "Key already in use",
  "Network fault"
};
@@ -43,7 +44,7 @@
{
  int s, eindex;
  char *buf;
  eindex = err - 10000;
  eindex = err - EBUS_BASE;
  /* Make first caller allocate key for thread-specific data */
  s = pthread_once(&once, createKey);
src/bus_error.h
@@ -7,7 +7,8 @@
#define EBUS_BASE 10000
#define EBUS_TIMEOUT 10001
#define EBUS_CLOSED 10002
#define ESHM_BUS_KEY_INUSED 10003
#define EBUS_KEY_INUSED 10003
#define EBUS_NET 10004
extern int bus_errno;
src/queue/lock_free_queue.h
@@ -1,3 +1,6 @@
/**
 * encapsulate array_lock_free_queue, add semphore. populate in kernal space.
 */
#ifndef __LOCK_FREE_QUEUE_H__
#define __LOCK_FREE_QUEUE_H__
src/queue/shm_queue.h
@@ -1,3 +1,7 @@
/**
 * encapsulate lock_free_queue, populate in userspace
 */
#ifndef __SHM_QUEUE_H__
#define __SHM_QUEUE_H__
@@ -7,8 +11,7 @@
#include "sem_util.h"
#include "shm_allocator.h"
#include "usg_common.h"
// default Queue size
// #define LOCK_FREE_Q_DEFAULT_SIZE 16
template <typename ELEM_T> class SHMQueue {
src/socket/net_mod_server_socket.cpp
@@ -181,7 +181,7 @@
    }
    if( ret != 0) {
      // 没有对应的key
      // 转发失败
      response_head.code = ret;
      response_head.content_length = 0;
      if( rio_writen(connfd, NetModSocket::encode_response_head(response_head), NET_MODE_RESPONSE_HEAD_LENGTH) != NET_MODE_RESPONSE_HEAD_LENGTH )
src/socket/net_mod_socket.cpp
@@ -240,12 +240,12 @@
            mpool->conns[i].fd = -1;
            
          }
          else if(n == -1)  {
          else if(n == EBUS_NET)  {
            // 网络错误
            mpool->closeConn( connfd);
            // mpool->conns[i].fd = -1;
          } else {
            // 对方key是关闭的
            // 代理服务没有转发成功
             mpool->conns[i].fd = -1;
          }
@@ -263,7 +263,6 @@
// printf("poll POLLERR %d\n", connfd);
          mpool->nready--;
          mpool->closeConn( connfd);
          // mpool->conns[i].fd = -1;
        }
      }
    }
@@ -274,7 +273,6 @@
    if ( (connfd = mpool->conns[i].fd) > 0 ) {
      // 关闭并清除写入或读取失败的连接
      mpool->closeConn( connfd);
      // mpool->conns[i].fd = -1;
    }
  }
@@ -411,11 +409,11 @@
            mpool->conns[i].fd = -1;
            n_pub_suc++;
          } 
          else if(ret == -1)  {
          else if(ret == EBUS_NET)  {
            // 网络连接错误
             mpool->closeConn( connfd);
          } else {
            // 对方的key是关闭的
            // 代理服务没有转发成功
            mpool->conns[i].fd = -1;
          }
          n_resp++;
@@ -693,7 +691,7 @@
}
/**
 * @return 0 成功, 1 对方没有对应的key, -1 网络错误
 * @return 0 成功,   EBUS_NET 网络错误, 其他值 代理服务没有转发成功。
 *
 */
int NetModSocket::read_response(int connfd, net_mod_recv_msg_t *recv_msg) {
@@ -712,7 +710,7 @@
// printf(">>>> read_response %s\n", response_head.host);
  if(response_head.code != 0) {
    // 代理服务没能成功发送给对应的key
    return 1;
    return response_head.code;
  }
  recv_buf = malloc(response_head.content_length);
@@ -722,8 +720,8 @@
  }
  if ( (recv_size = rio_readn(connfd, recv_buf, response_head.content_length) ) !=  response_head.content_length) {
    LoggerFactory::getLogger()->error(errno, "NetModSocket::read_response  rio_readnb recv_buf");
    return -1;
    //网络错误
    return EBUS_NET;
  }
  strcpy( recv_msg->host, response_head.host);
src/socket/shm_socket.cpp
@@ -30,8 +30,8 @@
static inline int  _shm_socket_check_key(shm_socket_t *socket) {
   void *tmp_ptr = mm_get_by_key(socket->key);
    if (tmp_ptr!= NULL && tmp_ptr != (void *)1 && !socket->force_bind ) {
      bus_errno = ESHM_BUS_KEY_INUSED;
      logger->error("%s. key = %d ", bus_strerror(ESHM_BUS_KEY_INUSED), socket->key);
      bus_errno = EBUS_KEY_INUSED;
      logger->error("%s. key = %d ", bus_strerror(EBUS_KEY_INUSED), socket->key);
      return 0;
    }
    return 1;
@@ -133,8 +133,8 @@
  } else {
   if(!_shm_socket_check_key(socket)) {
     bus_errno = ESHM_BUS_KEY_INUSED;
     return ESHM_BUS_KEY_INUSED;
     bus_errno = EBUS_KEY_INUSED;
     return EBUS_KEY_INUSED;
   }
  }
@@ -224,8 +224,8 @@
    socket->key = hashtable_alloc_key(hashtable);
  } else {
    if(!_shm_socket_check_key(socket)) {
      bus_errno = ESHM_BUS_KEY_INUSED;
      return ESHM_BUS_KEY_INUSED;
      bus_errno = EBUS_KEY_INUSED;
      return EBUS_KEY_INUSED;
    }
  }
@@ -338,8 +338,8 @@
    } else {
     if(!_shm_socket_check_key(socket)) {
        bus_errno = ESHM_BUS_KEY_INUSED;
        return ESHM_BUS_KEY_INUSED;
        bus_errno = EBUS_KEY_INUSED;
        return EBUS_KEY_INUSED;
     }
    }
@@ -350,10 +350,13 @@
  if ((s = pthread_mutex_unlock(&(socket->mutex))) != 0)
    err_exit(s, "shm_sendto : pthread_mutex_unlock");
  
  if (key == socket->key) {
    logger->error( "can not send to your self!");
    return -1;
  }
  // There is some case where a socket need to send to himeself, for example when bus server need to stop, he need to send himself
  // a top message.
  // if (key == socket->key) {
  //   logger->error( "can not send to your self!");
  //   return -1;
  // }
  SHMQueue<shm_msg_t> *remoteQueue;
  if ((remoteQueue = _attach_remote_queue(key)) == NULL) {
@@ -419,8 +422,8 @@
    } else {
      if(!_shm_socket_check_key(socket)) {
        bus_errno = ESHM_BUS_KEY_INUSED;
        return ESHM_BUS_KEY_INUSED;
        bus_errno = EBUS_KEY_INUSED;
        return EBUS_KEY_INUSED;
      }
    }