[Gluster-devel] Gluster internals
Ian Latter
ian.latter at midnightcode.org
Sun May 20 07:23:12 UTC 2012
> 1) What is the difference between STACK_WIND
> and STACK_WIND_COOKIE? I.e. I've only
> ever used STACK_WIND, when should I use
> it versus the other?
>
> STACK_WIND_COOKIE is used when we need to 'tie' the call
> wound with its corresponding callback. You can see this
> variant being used extensively in cluster xlators where it
> is used to identify the callback with the subvolume no. it
> is coming from.
Ok - thanks. I will take a closer look at the examples for
this .. this may help me ...
> 2) Is there a way to write linearly within a single
> function within Gluster (or is there a reason
> why I wouldn't want to do that)?
>
>
> RE 2:
>
> This may stem from my lack of understanding
> of the broader Gluster internals. I am performing
> multiple fops per fop, which is creating structural
> inelegances in the code that make me think I'm
> heading down the wrong rabbit hole. I want to
> say;
>
> read() {
> // pull in other content
> while(want more) {
> _lookup()
> _open()
> _read()
> _close()
> }
> return iovec
> }
>
>
> But the way I've understood the Gluster internal
> structure is that I need to operate in a chain of
> related functions;
>
> _read_lookup_cbk_open_cbk_read_cbk() {
> wind _close()
> }
>
> _read_lookup_cbk_open_cbk() {
> wind _read()
> add to local->iovec
> }
>
> _lookup_cbk() {
> wind _open()
> }
>
> read() {
> while(want more) {
> wind _lookup()
> }
> return local->iovec
> }
>
>
>
> Am I missing something - or is there a nicer way of
> doing this?
>
> The above method you are trying to use is the "continuation passing style" that
> is extensively used in afr-inode-read.c and afr-transaction.c to perform multiple
> internal fops on the trigger of a single fop from the application. cluster/afr may
> give you some ideas on how you could structure it if you like that more.
These may have been where I got that code style from
originally .. I will go back to these two programs, thanks
for the reference. I'm currently working my way through
the afr-heal programs ..
> The other method I can think of (not sure if it would suit your needs)
> is to use the syncop framework (see libglusterfs/src/syncop.c).
> This allows one to make a 'synchronous' glusterfs fop. inside a xlator.
> The downside is that you can only make one call at a time. This may not
> be acceptable for cluster xlators (ie, xlator with more than one child xlator).
In the syncop framework, how much gets affected when I
use it in my xlator. Does it mean that there's only one call
at a time in the whole xlator (so the current write will stop
all other reads) or is the scope only the fop (so that within
this write, my child->fops are serial, but neighbouring reads
on my xlator will continue in other threads)? And does that
then restrict what can go above and below my xlator? I
mean that my xlator isn't a cluster xlator but I would like it
to be able to be used on top of (or underneath) a cluster
xlator, will that no longer be possible?
> Hope that helps,
> krish
Thanks Krish, every bit helps!
--
Ian Latter
Late night coder ..
http://midnightcode.org/
More information about the Gluster-devel
mailing list