[Gluster-devel] Is it safe to use synctask_{wake, yield} outside of __wake and __yield macros?
Anand Avati
anand.avati at gmail.com
Fri Feb 15 00:58:32 UTC 2013
On Wed, Feb 13, 2013 at 8:37 PM, krish <kparthas at redhat.com> wrote:
> The strategy is to defer yield'ing of the task till a mgmt operation is
> sent to all the peers.
>
> If I understand it right, the following theorem is true,
> - A function which begins execution in a synctask (ie. thread from
> syncenv's thread pool), would always
> resume execution (ie, wake) in the same thread (viz. part of syncenv's
> thread pool).
>
Nope! A synctask can yield in one syncproc pthread and resume in a
different one. But that should not matter for you as long as it is any one
of those syncproc pthreads from the pool.
> If the above theorem is correct, then all syncops performed by mgmt
> operation handlers are
> guaranteed to be called from a syncenv. The synctask is spawned at rpcsvc
> layer for all glusterd mgmt
> operations programs.
>
> Following is an example code snippet.
>
> <code>
> gd_lock_op_phase (struct list_head *peers, char **op_errstr, int npeers) {
>
> ....
>
> list_for_each_entry (peerinfo, peers, op_peers_list) {
> gd_syncop_mgmt_lock (peerinfo->rpc, aggr, index,
> MY_UUID, peer_uuid);
> index++;
> }
> synctask_yield (aggr->task);
> //note: block in the above line until all the cbks return - call_cnt
> mechanism
>
> ....
>
> }
>
> #define GD_SYNCOP(rpc, stb, cbk, req, prog, procnum, xdrproc) do { \
> int ret = 0; \
> struct synctask *task = NULL; \
> \
> task = synctask_get (); \
> stb->task = task; \
> ret = gd_syncop_submit_request (rpc, req, stb, \
> prog, procnum, cbk, \
> (xdrproc_t)xdrproc); \
> // note: yield here has been removed
> } while (0)
>
> </code>
>
>
Where/how is callcnt set, and decremented?
Avati
> Let me know if we can come up with a generic framework for what I am
> trying to do here.
>
> thanks,
> krish
>
>
> On 02/14/2013 05:23 AM, Anand Avati wrote:
>
> So you are not using the SYNCOP() macro, right? Can you show a code
> snippet of how you are trying to fan-out and yield? We could probably come
> up with a generic framework for such fan-out->yield->wake pattern.
>
> You should be able to call syncop_yield() instead of __yield() if you
> are _sure_ that the caller is going to be from within a syncenv.
>
> Avati
>
> On Wed, Feb 13, 2013 at 11:29 AM, Krishnan Parthasarathi <
> kparthas at redhat.com> wrote:
>
>> In glusterd, I am trying to perform a series of syncops in a batch. ie,
>> yield the thread
>> once all the non-blocking operations are queued. The wakeup back to the
>> yielded thread
>> happens as part of the call_cnt mechanism in the callback(s).
>>
>> Given this, I wanted to know if I would be flouting any of assumptions,
>> if I used
>> synctask_yield and synctask_wake as opposed to their macro counterparts.
>> More specifically,
>> is there a chance that synctask_get() would return NULL on a thread which
>> is part of a syncenv's
>> thread pool?
>>
>> thanks,
>> krish
>>
>>
>> _______________________________________________
>> Gluster-devel mailing list
>> Gluster-devel at nongnu.org
>> https://lists.nongnu.org/mailman/listinfo/gluster-devel
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://supercolony.gluster.org/pipermail/gluster-devel/attachments/20130214/2286fcc4/attachment-0001.html>
More information about the Gluster-devel
mailing list