summaryrefslogtreecommitdiffstats
path: root/doc/booster.txt
blob: 684ac8965c4d8212ecaa234616492410c66e8678 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Introduction
============
* booster is a LD_PRELOADable library which boosts read/write performance by bypassing fuse for 
  read() and write() calls.

Requirements
============
* fetch volfile from glusterfs.
* identify whether multiple files are from the same mount point. If so, use only one context.

Design
======
* 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.
 
Working
=======
* 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.
  * fgetxattr(fd).
  * store the volume-file content got in the dictionary to a temparory 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.