[Gluster-devel] Issue with THIS and libgfapi

SATHEESARAN sasundar at redhat.com
Tue May 12 14:38:14 UTC 2015


On 05/12/2015 07:36 PM, Poornima Gurusiddaiah wrote:
> Hi,
>
> We recently uncovered an issue with THIS and libgfapi, it can be 
> generalized to any process having multiple glusterfs_ctxs.
>
> Before the master xlator (fuse/libgfapi) is created, all the code that 
> access THIS will be using global_xlator object,
> defined globally for the whole of the process.
> The problem is when multiple threads start modifying THIS, and 
> overwrite thr global_xlators' ctx eg: glfs_new:
> glfs_new () {
> ...
> ctx = glusterfs_ctx_new();
> glusterfs_globals_inti();
> THIS = NULL;  /* implies THIS = &global_xlator */
> THIS->ctx = ctx;
> ...
> }
> The issue is more severe than it appears, as the other threads like 
> epoll, timer, sigwaiter, when not executing in
> fop context will always refer to the global_xlator and 
> global_xlator->ctx. Because of the probable race condition
> explained above we may be referring to the stale ctxs and could lead 
> to crashes.
>
> Probable solution:
> Currently THIS is thread specific, but the global xlator object it 
> modifies is global to all threads!!
> The obvious association would be to have global_xlator per ctx instead 
> of per process.
> The changes would be as follows:
> - Have a new global_xlator object in glusterfs_ctx.
> - After every creation of new ctx assign
>   <store THIS>
>   THIS = new_ctx->global_xlator
>   <restore THIS>
> - But how to set the THIS in every thread(epoll, timer etc) that gets 
> created as a part of that ctx.
>   Replace all the pthread_create for the ctx threads, with 
> gf_pthread_create:
>  gf_pthread_create (fn,..., ctx) {
>   ...
>   thr_id = pthread_create (global_thread_init, fn, ctx...);
>   ...
>   }
>
>   global_thread_init (fn, ctx, args) {
>   THIS = ctx->global_xlator;
>   fn(args);
>   }
>
>  The other solution would be to not associate threads with ctx, 
> instead shared among ctxs
>
> Please let me know your thoughts on the same.
>
> Regards,
> Poornima
>
Hi Poornima,

Recently with glusterfs-3.7 beta1 rpms, while create VM Image using 
qemu-img, I see the following errors :

[2015-05-08 09:04:14.358896] E [rpc-transport.c:512:rpc_transport_unref] 
(--> /lib64/libglusterfs.so.0(_gf_log_callingfn+0x186)[0x7f51f6bb6516] 
(--> /lib64/libgfrpc.so.0(rpc_transport_unref+0xa3)[0x7f51f965e493] (--> 
/lib64/libgfrpc.so.0(rpc_clnt_unref+0x5c)[0x7f51f96617dc] (--> 
/lib64/libglusterfs.so.0(+0x1edc1)[0x7f51f6bb2dc1] (--> 
/lib64/libglusterfs.so.0(+0x1ed55)[0x7f51f6bb2d55] ))))) 
0-rpc_transport: invalid argument: this
[2015-05-08 09:04:14.359085] E [rpc-transport.c:512:rpc_transport_unref] 
(--> /lib64/libglusterfs.so.0(_gf_log_callingfn+0x186)[0x7f51f6bb6516] 
(--> /lib64/libgfrpc.so.0(rpc_transport_unref+0xa3)[0x7f51f965e493] (--> 
/lib64/libgfrpc.so.0(rpc_clnt_unref+0x5c)[0x7f51f96617dc] (--> 
/lib64/libglusterfs.so.0(+0x1edc1)[0x7f51f6bb2dc1] (--> 
/lib64/libglusterfs.so.0(+0x1ed55)[0x7f51f6bb2d55] ))))) 
0-rpc_transport: invalid argument: this
[2015-05-08 09:04:14.359241] E [rpc-transport.c:512:rpc_transport_unref] 
(--> /lib64/libglusterfs.so.0(_gf_log_callingfn+0x186)[0x7f51f6bb6516] 
(--> /lib64/libgfrpc.so.0(rpc_transport_unref+0xa3)[0x7f51f965e493] (--> 
/lib64/libgfrpc.so.0(rpc_clnt_unref+0x5c)[0x7f51f96617dc] (--> 
/lib64/libglusterfs.so.0(+0x1edc1)[0x7f51f6bb2dc1] (--> 
/lib64/libglusterfs.so.0(+0x1ed55)[0x7f51f6bb2d55] ))))) 
0-rpc_transport: invalid argument: this

Is this the consequence of the issue that you are talking about ?


-- Satheesaran
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.gluster.org/pipermail/gluster-devel/attachments/20150512/eb38aa27/attachment.html>


More information about the Gluster-devel mailing list