diff options
author | Vikas Gorur <vikas@zresearch.com> | 2009-02-19 00:18:28 -0800 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-02-19 02:57:35 -0800 |
commit | 9a4bba3a7ad86681abc9d022fd6677f668fdf062 (patch) | |
tree | 5f864457e8572e82fc02bb2be5b2862b8384e6b0 | |
parent | 77adf4cd648dce41f89469dd185deec6b6b53a0b (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>
-rw-r--r-- | doc/hacker-guide/lock-ahead.txt | 80 |
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> $ +============================================== |