On 2019-05-02 03:45, Liu, Changcheng wrote:
Hi Penyaev, Could you give more info about below point? I don't understand it quiet well. > My question is why you daemonize your ceph services and do not rely on systemd, > which does fork() on its own and runs each service with '-f' flag, which means > do not daemonize? So I would not daemonize services and this can be a simple solution.
You provided the test, which reproduces the problem with -EACCESS, where you explicitly call fork(). According to my code understanding ceph services do fork() on early start only in daemon() glibc call (which internally does fork()). If you use systemd daemonization is not used, so fork() is not called, so I am a bit confused: what exact places in the code you know, where fork() is called?
Thanks for your patch. I'll verify it when I'm back to office. Is it possible that rdma_cm library supply one API, e.g. rdma_put_devices(), to close the devices in proper status? Then, the child process could re-open the device with rdma_get_devices and query the device's attribute succeed.
That would be a perfect way, but I could not find an easy way to destroy Infiniband singleton object (I did some experiments and it turned out not so easy, e.g. if you can't deregister memory regions in child process or after setuid()). -- Roman