Hello Krish,
yes, no deadlock occurs without blocking (... somewhat obviously). However, if I can't block I do not gain anything regarding code readability. It makes more sense to use the standard STACK_WIND / UNWIND pairs instead of creating a syncthread with a callback function. I could use this approach if I start the syncthread in the FOP instead of the CBK function (and use syncops for everything). The problem is that in my scenario only the return of the FOP will tell me if additional FOPs need to be executed (and 99%+ of the time this won't be the case). This makes spawning a syncthread every time sound like a bad idea. I think you identified the occurring deadlock in your other reply correctly by the way. Seems it's a bit more complicated to use syncops correctly than I originally assumed, I'll probably go back to STACK_WIND / UNWIND chains even if the resulting code is quite messy. Thanks for your insight ~fog Date: Mon, 29 Apr 2013 14:30:50 +0530 From: kparthas@xxxxxxxxxx To: fog_is_my_name@xxxxxxxxxxx CC: gluster-devel@xxxxxxxxxx Subject: Re: rpc problems when using syncops in callbacks Fog,
On 04/29/2013 01:57 PM, fog - wrote: If you don't provide a synctask_cbk_t to synctask_new, you are using synctask in a 'blocking' mode. That is, the thread calling synctask_new would block until the synctask_fn_t function (ie, __xattr_store_sync) returns. An alternative way to do this would be, int32_t xattr_store_sync(xlator_t *this, call_frame_t *frame, loc_t *loc, dict_t *dic) { syncstore_args args = {this, loc, dic}; return synctask_new(this->ctx->env, __xattr_store_sync, __xattr_store_sync_cbk, NULL, &args); } int32_t __xattr_store_sync_cbk (int ret, /*and the other args*/) { // Your code goes here return ret; } Now, all file operations performed using syncop_* inside __xattr_store_sync would have the synchronous flavour, while leaving the calling thread (thread calling xattr_store_sync fn) 'free'. This should avoid the hang issue. HTH, krish
|