Re: Segfault at client3_3_create_cbk() when calling fops->create

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




So you are using the frame pointer in readv_cbk to do the STACK_WIND of create or open. But are you sure you are not unwinding the same frame right after the STACK_WIND? 

  I was unwinding by mistake at the end of read_cbk because I missed some code there that I should have copied to another point. It was proper code with the syncops, but not with the wind/unwinds... my mistake, sorry.


  Anyway, I was able to execute the code after some modifications, but there was a problem intrinsic to the assync behaviour of the wind/unwind I found a bit tricky to deal with when thinking about other situations I will still have to implement. Let's see:

  My normal code flow with syncop was, at each read_cbk, to create and write the file locally, and if the file existed, truncate it because I'd be overwriting it. For now a simple global variable at "private" monitors if the local write was beginning or in action already. Something like:

--> Syncop flow:
if priv->write_in_progress ==0 
if (syncop_create)
syncop_open (RW | TRUNC)
(syncop_fsetattr)

if priv->write_in_progress ==1 
syncop_open (RW | APPEND)

  So, in wind/unwind code this translated to the logic below, with also 2 paths to go. But when executing this code it seems I get a race condition where the 2nd path arrives at its end before the 1st one (which has more steps to complete). Meaning that the 2nd data block from readv_cbk reaches read__open_cbk__writev_cbk first, while the 1st readv_cbk data block is still at _read__create_cbk__open_cbk during execution and hadn't written the content it should have written first.

  This kind of behavior is expected and normal or am I missing something here?

  My first ideia was to put a semaphore at the 2nd path waiting for the conclusion of the 1st call, but it didn't work, so I endup creating one path only, always calling the create() and open() in sequence, but changing the flags at _read__create_cbk() to APPEND in case the error from create() was "file already exists".

----> Wind/unwind code:
read ()
if priv->write_in_progress == 0
wind _create() -----------------------> 1st flow
else if priv->write_in_progress == 1
         wind _open()      -----------------------> 2nd flow

> 1st flow (to be executed once only, at the beginning of the write):
_read__create_cbk()
if (error == file exist) wind _open -----> if exist, open with APPEND flags, otherwise, keep the same flags
else unwind ()  -> error, finish all here
_read__create_cbk__open_cbk()
wind _fsetattr
_read__create_cbk__open_cbk__fsetattr_cbk() --> joint the operations from create and open
wind _writev
_read__create_cbk__open_cbk__fsetattr_cbk__writev_cbk()
unwind () -> success, chain of fops finished.

> 2nd flow:
_read__open_cbk()
wind _writev
_read__open_cbk__writev_cbk() -------> CONCLUDES 1ST than _read__create_cbk__open_cbk
unwind () -> success, chain of fops finished.


----> Stack (stbuf is NULL at fuse_read_cbk, accessing stbuf->ia_size generates the fault):
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff5605e29 in fuse_readv_cbk (frame=0x7ffff5bc1fc0, cookie=0x7ffff5dcb184, this=0x651250, op_ret=131072, op_errno=0, vector=0x7fffffffdec0, count=-8624, stbuf=0x0, iobref=0x7ffff6edac07,
    xdata=0x7fff00000000) at fuse-bridge.c:2037
2037                    gf_log ("glusterfs-fuse", GF_LOG_TRACE,
(gdb)
(gdb) bt
#0  0x00007ffff5605e29 in fuse_readv_cbk (frame=0x7ffff5bc1fc0, cookie=0x7ffff5dcb184, this=0x651250, op_ret=131072, op_errno=0, vector=0x7fffffffdec0, count=-8624, stbuf=0x0, iobref=0x7ffff6edac07, 
    xdata=0x7fff00000000) at fuse-bridge.c:2037
#1  0x00007ffff398c610 in _read__open_cbk__writev_cbk (frame=0x7ffff5dcb184, cookie=0x7ffff5dcb4e0, this=0x664bd0, op_ret=131072, op_errno=0, prebuf=0x7fffffffdec0, postbuf=0x7fffffffde50, xdata=0x0)
    at gbfs_t.c:213
#2  0x00007ffff3bc3369 in client3_3_writev_cbk (req=0x7ffff367402c, iov=0x7ffff367406c, count=1, myframe=0x7ffff5dcb4e0) at client-rpc-fops.c:867
#3  0x00007ffff7944e8b in rpc_clnt_handle_reply (clnt=0x693890, pollin=0x6e7d70) at rpc-clnt.c:784
#4  0x00007ffff79451fc in rpc_clnt_notify (trans=0x6a32c0, mydata=0x6938c0, event=RPC_TRANSPORT_MSG_RECEIVED, data="" at rpc-clnt.c:903
#5  0x00007ffff79416bb in rpc_transport_notify (this=0x6a32c0, event=RPC_TRANSPORT_MSG_RECEIVED, data="" at rpc-transport.c:495
#6  0x00007ffff3466e20 in socket_event_poll_in (this=0x6a32c0) at socket.c:1986
#7  0x00007ffff34672bd in socket_event_handler (fd=14, idx=1, data="" poll_in=1, poll_out=0, poll_err=0) at socket.c:2097
#8  0x00007ffff7b98fce in event_dispatch_epoll_handler (event_pool=0x6505e0, events=0x6c9cc0, i=0) at event.c:784
#9  0x00007ffff7b991ad in event_dispatch_epoll (event_pool=0x6505e0) at event.c:845
#10 0x00007ffff7b99494 in event_dispatch (event_pool=0x6505e0) at event.c:945
#11 0x0000000000408ae0 in main (argc=7, argv=0x7fffffffe568) at glusterfsd.c:1814


Best,
Gustavo.

[Index of Archives]     [Gluster Users]     [Ceph Users]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux