Project

General

Profile

Feature #15308

Updated by Vikhyat Umrao over 4 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