Project

General

Profile

Feature #15308

Updated by Vikhyat Umrao about 8 years ago

LIBRADOS modify Pipe::connect() to return the error code 

 Steps to Reproduce: 

 1. create a qemu instance  
 2. reduce the fd limits with prlimit command  
 3. try to attach rbd image to this qemu instance  
 4.    ceph client side log file will have logs as given below : 

 7f0b769e7700 -1 -- 192.168.128.30:0/2021513 >> 192.168.128.35:6800/24374 pipe(0x7f0bcabc0000 sd=-1 :0 s=1 pgs=0 cs=0 l=1 c=0x7f0bc55e1ce0).connect couldn't created socket (24) Too many open files 

 5. But qemu logs will not log anything regarding this error as rados_connect call from qemu wont have proper return code from librados Pipe::connect(). 


 Ceph source file : src/msg/simple/Pipe.cc 

 <pre> 
  870 int Pipe::connect() 
  871 { 
  872     bool got_bad_auth = false; 
  873  
  874     ldout(msgr->cct,10) << "connect " << connect_seq << dendl; 
  875     assert(pipe_lock.is_locked()); 

 .................... 
 ..................... 

  901     // create socket? 
  902     sd = ::socket(peer_addr.get_family(), SOCK_STREAM, 0); 
  903     if (sd < 0) { 
  904       lderr(msgr->cct) << "connect couldn't created socket " << cpp_strerror(errno) << dendl; 
  905       goto fail; 
  906     } 

 ........................ 
 ......................... 

 1215    fail: 
 1216     if (conf->ms_inject_internal_delays) { 
 1217       ldout(msgr->cct, 10) << " sleep for " << msgr->cct->_conf->ms_inject_internal_delays << dendl; 
 1218       utime_t t; 
 1219       t.set_from_double(msgr->cct->_conf->ms_inject_internal_delays); 
 1220       t.sleep(); 
 1221     } 
 1222  
 1223     pipe_lock.Lock(); 
 1224    fail_locked: 
 1225     if (state == STATE_CONNECTING) 
 1226       fault(); 
 1227     else 
 1228       ldout(msgr->cct,3) << "connect fault, but state = " << get_state_name() 
 1229                          << " != connecting, stopping" << dendl; 
 1230  
 1231    stop_locked: 
 1232     delete authorizer; 
 1233     return -1; 
 1234 } 
 </pre> <\pre> 

 - "connect couldn't created socket (24) Too many open files" 
 - This error is coming from this function socket() from Pipe::connect() function. 
 - Here we are    going to *fail* label but if we check    *fail*    we    returning "-1" but we need proper error handling in this function.

Back