[Gluster-devel] Gluster internals

Ian Latter ian.latter at midnightcode.org
Mon May 21 23:02:44 UTC 2012


> >     0) Is there any developer docco?  I've just done
> >         another quick search and I can't see any.  Let
> >         me know if there is and I'll try and answer the
> >         below myself.
> 
> Your best bet right now (if I may say so) is the stuff I've posted on
> hekafs.org - the "Translator 101" articles plus the API overview at
> 
> http://hekafs.org/dist/xlator_api_2.html

You must say so - there is so little docco.  Actually before I
posted I went and re-read your Translator 101 docs as you 
referred them to me on 10 May, but I hadn't found your API
overview - thanks (for both)!


> >     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)?  
> 
> Any blocking ops would have to be built on top of async ops plus semaphores
> etc. because (unlike e.g. an HTTP server) the underlying sockets etc. are
> shared/multiplexed between users and activities.  Thus you'd get much more
> context switching that way than if you stay within the async/continuation style.

Interesting - I haven't ever done semaphore coding, but it may not
be needed.  The syncop framework that Krish referred too seems to 
do this via a mutex lock (synctask_yawn) and a context switch (synctask_yield).  What's the drawback with increased context
switching?
  After my email thread with Krish I decided against syncop, but the
flow without was going to be horrific.  The only way I could bring it
back to anything even half as sane as the afr code (which can
cleverly loop through its own _cbk's recursively - I like that, whoever
put that together) was to have the last cbk in a chain (say the
"close_cbk") call the original function with an index or stepper 
increment.
  But after sitting on the idea for a couple of days I actually came
to the same conclusion as Manu did in the last message.  I.e.
without docco I have been writing to what seems to work, and
in my 2009 code (I saw last night) a "mkdir" wind followed by "create" 
code in the same function - which I believe, now, is probably a 
race condition (because of the threaded/async structure forced
through the wind/call macro model).
  In that case I *do* want a synchronous write - but only within
my xlator (which, if I'm reading this right, *is* what syncop does)
- as opposed to an end-to-end synchronous write (being sync'd
through the full stack of xlators: ignoring caching, waiting for 
replication to be validated, etc).
  Although, the same synchronous outcome comes from the 
chained async calls ... but then we get back to the readability/
fixability of the code.
 
> Some day in the distant future, I'd like to work some more on a preprocessor
> that turns linear code into async code so that it's easier to write but retains
> the performance and resource-efficiency advantages of an essentially async
> style.  I did some work (http://pl.atyp.us/ripper/UserGuide.html) in this area
> several years ago, but it has probably bit-rotted to hell since then.  With
> more recent versions of gcc and LLVM it should be possible to overcome some of
> the limitations that version had.

Yes, I had a very similar thought - a C pre-processor isn't in my 
experience or time scale though; I considered writing up a script that 
would chain it out in C for me.  I was going to borrow from a script that I 
wrote which builds one of the libMidnightCode header files but even 
that seemed impractical .. would anyone be able to debug it?  Would I
even understand in 2yrs from now - lol


So I think the long and the short of it is that anything I do here won't be
pretty .. or perhaps: one will look pretty and the other will run pretty :)





--
Ian Latter
Late night coder ..
http://midnightcode.org/




More information about the Gluster-devel mailing list