blob: b051832eeabdaf8167c00514b50a395f6889595f (plain
* booster is a LD_PRELOADable library which boosts read/write performance by bypassing fuse for
read() and write() calls.
* fetch volfile from glusterfs.
* identify whether multiple files are from the same mount point. If so, use only one context.
* for a getxattr, along with other attributes, fuse returns following attributes.
* contents of client volume-file.
* mount point.
* LD_PRELOADed booster.so maintains an hash table storing mount-points and libglusterfsclient handles
so that handles are reused for files from same mount point.
* it also maintains a fdtable. fdtable maps the fd (integer) returned to application to fd (pointer to fd struct)
used by libglusterfsclient. application is returned the same fd as the one returned from libc apis.
* During fork, these tables are overwritten to enable creation of fresh glusterfs context in child.
* application willing to use booster LD_PRELOADs booster.so which is a wrapper library implementing
open, read and write.
* application should specify the path to logfile through the environment variable GLFS_BOOSTER_LOGFILE. If
not specified, logging is done to /dev/stderr.
* open call does,
* real_open on the file.
* store the volume-file content got in the dictionary to a temporary file.
* look in the hashtable for the mount-point, if already present get the libglusterfsclient handle from the
hashtable. Otherwise get a new handle from libglusterfsclient (be careful about mount point not present in
the hashtable and multiple glusterfs_inits running simultaneously for the same mount-point there by using
multiple handles for the same mount point).
* real_close (fd).
* delete temporary volume-volfile.
* glusterfs_open (handle, path, mode).
* store the fd returned by glusterfs_open in the fdtable at the same index as the fd returned by real_open.
* return the index as fd.
* read/write calls do,
* get the libglusterfsclient fd from fdtable.
* if found use glusterfs_read/glusterfs_write, else use real_read/real_write.
* close call does,
* remove the fd from the fdtable.
* other calls use real_calls.