GitHub PushEvent at 2014-10-27 08:23:24
Repository: ceph
Actor: thesues
Payload: {"shas":[["8fe8875a6f6fdad284bfdd8fce43c4c10a5282d0","016deec4507c09b644a240896ecb8d8245b50987@gmail.com","Set the default RadosSTriperImpl refcnt from 0 to 1\n\nDear list,\n\nI have met this when I was using radosstriper C API. My program is\nroughly like this:\n\n1. rados_striper_aio_write\n2  rados_aio_flush\n3. rados_aio_wait_for_safe\n4. rados_aio_release\n5. rados_striper_destroy\n6. rados_ioctx_destroy\n7. rados_shutdown\n\nIn most time, this works well, But the programm occasionally\nhangs forever. Output of gstack:\n\nThread 1 (Thread 0x7fe0afba0760 (LWP 18509)):\n0  0x000000330f20822d in pthread_join () from /lib64/libpthread.so.0\n1  0x000000347566cea2 in Thread::join(void**) () from /usr/lib64/librados.so.2\n2  0x00000034755ac535 in librados::RadosClient::shutdown() () from /usr/lib64/librados.so.2\n3  0x0000003475592269 in rados_shutdown () from /usr/lib64/librados.so.2\n4  0x0000000000402349 in main ()\n\nThread 4 (Thread 0x7fe0ab14d700 (LWP 18541)):\n0  0x000000330f20e264 in __lll_lock_wait () from /lib64/libpthread.so.0\n1  0x000000330f209508 in _L_lock_854 () from /lib64/libpthread.so.0\n2  0x000000330f2093d7 in pthread_mutex_lock () from /lib64/libpthread.so.0\n3  0x0000003475633af1 in Mutex::Lock(bool) () from /usr/lib64/librados.so.2\n4  0x00000034755abd37 in librados::RadosClient::put() () from /usr/lib64/librados.so.2\n5  0x0000003475592501 in librados::Rados::shutdown() () from /usr/lib64/librados.so.2\n6  0x00007fe0afbba9f7 in libradosstriper::RadosStriperImpl::CompletionData::~CompletionData() () from /usr/lib64/libradosstriper.so.1\n7  0x00007fe0afbbaad9 in libradosstriper::RadosStriperImpl::WriteCompletionData::~WriteCompletionData() () from /usr/lib64/libradosstriper.so.1\n8  0x00007fe0afbc1d75 in RefCountedObject::put() () from /usr/lib64/libradosstriper.so.1\n9  0x00007fe0afbc224d in libradosstriper::MultiAioCompletionImpl::safe_request(long) () from /usr/lib64/libradosstriper.so.1\n10 0x00000034755c5ce8 in librados::C_AioSafe::finish(int) () from /usr/lib64/librados.so.2\n11 0x00000034755a0e89 in Context::complete(int) () from /usr/lib64/librados.so.2\n12 0x000000347564d4c8 in Finisher::finisher_thread_entry() () from /usr/lib64/librados.so.2\n13 0x000000330f2079d1 in start_thread () from /lib64/libpthread.so.0\n14 0x000000330eae886d in clone () from /lib64/libc.so.6\n\nWhen the last CompletionData were released, it will release\nRadosStriperImpl itself and the RadosClient. There are two shutdown threads in the same\ntime. I think since API caller will always call rados_striper_destroy to\nrelease memory. we do not need the RadosStriperImpl to be released\nautomacally, and it will also have race conditions like this one;\n\nany thoughts?","Dongmao Zhang",true]],"size":1,"ref":"refs/heads/fix-hang","head":"8fe8875a6f6fdad284bfdd8fce43c4c10a5282d0"}