(2) S3 connect reset by peer

Connect reset 原因 定位分析

1. 问题表现

继第一篇《问题描述 & 初步分析定位》, 问题表现为:

  • s3cmd error message: error: [Errno 104] Connection reset by peer

  • radosgw error message: ERROR: flush_read_list(): d->client_cb->handle_data() returned -5

2. 定位radosgw error code -5

2.1. 在ceph radosgw 中定位报错代码

rgw_rados.cc:


int RGWRados::flush_read_list(struct get_obj_data *d)

{

...

    r = d->client_cb->handle_data(bl, 0, bl.length());

    if (r < 0) {

      dout(0) << "ERROR: flush_read_list(): d->client_cb->handle_data() returned " << r << dendl;

      break;

    }

...

}

  • 从上面代码可以看出:d->client_cb->handle_data(bl, 0, bl.length());函数报错

  • 现在我们需要进一步定位handle_data()报错原因,以及-5代码含义

2.2. 定位handle_data()失败原因

通过gdb等手段,确认handle_data()函数调用堆栈为:


flush_read_list()

  RGWGetObj::get_data_cb()

    RGWGetObj_ObjStore_S3::send_response_data()

     dump_body()

       ......

         civetweb.c: push_all()


             civetweb.c: push()

                   Linux  socket send()

从调用堆栈中看出,是网络的send()失败,导致最上层的失败。

civetweb.c: push()的代码如下:


static int

push(struct mg_context *ctx,

     FILE *fp,

     SOCKET sock,

     SSL *ssl,

     const char *buf,

     int len,

     double timeout)

{

......

   n = (int)send(sock, buf, (len_t)len, MSG_NOSIGNAL);

   err = (n < 0) ? ERRNO : 0;

  if ((n > 0) || (n == 0 && len == 0)) {

   /* some data has been read, or no data was requested */

   return n;

  }

  if (n == 0) {

   /* shutdown of the socket at client side */

   return -1;

  }

  i
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值