summaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
authorVikas Gorur <vikas@zresearch.com>2009-02-19 00:18:28 -0800
committerAnand V. Avati <avati@dev.gluster.com>2009-02-19 02:57:35 -0800
commit9a4bba3a7ad86681abc9d022fd6677f668fdf062 (patch)
tree5f864457e8572e82fc02bb2be5b2862b8384e6b0 /doc
parent77adf4cd648dce41f89469dd185deec6b6b53a0b (diff)
added lock-ahead translator design document
Design document for the lock-ahead translator Vikas Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
Diffstat (limited to 'doc')
-rw-r--r--doc/hacker-guide/lock-ahead.txt80
1 files changed, 80 insertions, 0 deletions
diff --git a/doc/hacker-guide/lock-ahead.txt b/doc/hacker-guide/lock-ahead.txt
new file mode 100644
index 00000000000..46232610c34
--- /dev/null
+++ b/doc/hacker-guide/lock-ahead.txt
@@ -0,0 +1,80 @@
+ Lock-ahead translator
+ ---------------------
+
+The objective of the lock-ahead translator is to speculatively
+hold locks (inodelk and entrylk) on the universal set (0 - infinity
+in case of inodelk and all basenames in case of entrylk) even
+when a lock is requested only on a subset, in anticipation that
+further locks will be requested within the same universal set.
+
+So, for example, when cluster/replicate locks a region before
+writing to it, lock-ahead would instead lock the entire file.
+On further writes, lock-ahead can immediately return success for
+the lock requests, since the entire file has been previously locked.
+
+To avoid starvation of other clients/mountpoints, we employ a
+notify mechanism, described below.
+
+typedef struct {
+ struct list_head subset_locks;
+} la_universal_lock_t;
+
+Universal lock structure is stored in the inode context.
+
+typedef struct {
+ enum {LOCK_AHEAD_ENTRYLK, LOCK_AHEAD_FENTRYLK,
+ LOCK_AHEAD_INODELK, LOCK_AHEAD_FINODELK};
+
+ union {
+ fd_t *fd;
+ loc_t loc;
+ };
+
+ off_t l_start;
+ off_t l_len;
+
+ const char *basename;
+
+ struct list_head universal_lock;
+} la_subset_lock_t;
+
+
+fops implemented:
+
+* inodelk/finodelk/entrylk/fentrylk:
+
+lock:
+ if universal lock held:
+ add subset to it (save loc_t or fd) and return success
+ else:
+ send lock-notify fop
+ hold universal lock and return
+ (set inode context, add subset to it, save loc_t or fd)
+
+ if this fails:
+ forward the lock request
+
+unlock:
+ if subset exists in universal lock:
+ delete subset lock from list
+ else:
+ forward it
+
+* release:
+ hold subset locks (each subset lock using the saved loc_t or fd)
+ and release universal lock
+
+* lock-notify (on unwind) (new fop)
+ hold subset locks and release universal lock
+
+
+lock-notify in locks translator:
+
+if a subset lock in entrylk/inodelk cannot be satisfied
+because of a universal lock held by someone else:
+ unwind the lock-notify fop
+
+==============================================
+$ Last updated: Tue Feb 17 11:31:18 IST 2009 $
+$ Author: Vikas Gorur <vikas@zresearch.com> $
+==============================================