Linux ocfs2 filesystem development
 help / color / mirror / Atom feed
From: Wengang Wang <wen.gang.wang@oracle.com>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [RFC] ocfs2/dlm: support range lock
Date: Thu, 29 Jan 2015 11:21:09 +0800	[thread overview]
Message-ID: <54C9A725.3010909@oracle.com> (raw)
In-Reply-To: <54C9794B.9000708@suse.de>


? 2015?01?29? 08:05, Goldwyn Rodrigues ??:
> Hi Yangwenfang,
>
> I appreciate the effort in this regard.
>
> On 01/26/2015 06:28 AM, yangwenfang wrote:
>> What:
>> Byte range lock is applied to lock a region of a file to accelerate
>> reading/writing concurrently.
>>
>> Why:		
>> Currently ocfs2 does not support byte range lock. Since multiple nodes
>> may concurrently update/write at different positions of the same file
>> in database workloads, the performance(tpmc) of DB+ocfs2 is much poorer than
>> DB+GPFS in running TPCC.
>> Aiming at improving the efficiency of parallel accesses to the same file,
>> we have implemented a demo of range lock feature which has been supported
>> by lustre and GPFS, so that a file can be updated by different nodes in
>> the cluster when they are visiting different blocks.
>>
>> How:
>> Key issues in design and implementation:
>> 1.In ocfs2, each file only has one lock, which is incapable of telling
>> different position.
>> One solution is to add a range field (start,end) in a lock. For example:
>> -ocfs2_lock_res(N1)	      dlm_lock_resource(Master)	ocfs2_lock_res(N2)
>> -ocfs2_res_range_lock (0,9)----dlm_lock(0,9)    N1			
>> -				dlm_lock(10,19)  N2<--ocfs2_res_range_lock(10,19)
>> -ocfs2_res_range_lock (20,29)---dlm_lock(20,29)  N1			
>> -				dlm_lock(30,49)  N2<--ocfs2_res_range_lock(30,49)
>> -ocfs2_res_range_lock (50,59)---dlm_lock(50,59)  N1			
>> -				dlm_lock(60,69)  N2<--ocfs2_res_range_lock(60,69)
>>
>> Each lock resource deploys an interval tree to manage the range, which
>> supports basic operations like add, delete, insert, find, split and merge.
>> The most important issue is to determine the existance of conflicts
>> among the ranges. Conflict-free ranges of the same file can be accessed
>> concurrently. In the contrary, nodes must wait for the release of a
>> conflicted lock before accessing the range of file.
>>
>> Byte range lock supports split and merge rules: for same level, larger
>> scope; different level, write > read(If a node keeps EX lock with
>> range(start,end), then it has PR range lock(start,end)).
>> For example:
>> (1) merge: N1 keeps range lock (0,9)PR and (5,19)PR, the lock is merged into
>> (0,19) PR;
>> (2) merge: N1 keeps range lock (0,9)PR and (5,19)EX, the merged lock should
>> become(0,19) PR, (5,19)EX;
>> (3) split: N1 keeps range lock (0,9)PR, N2 tries to lock(0,5) PR, N1 should
>> split the lock and keep (6,9)PR.
> What is the purpose of doing this kind of merge/split? I assume this
> will be required in case of multiple processes from the same node
> read/write to the file. Would it not be simpler to not merge or split
> and keep separate instances in lock resources? This way you would have
> to do relatively lesser book keeping with respect to comparisons.
>
> Are these numbers in your pseudocode byte ranges? If yes, how do you
> propose multiple writes which lie within a block_size/cluster_size range?
>

Yes, if the range lock is used for file read/write, the granularity 
would be block rather than byte.
Say for example block size is 512, a write to 0-9 would acquire whole 
0~511 bytes to be locked. Or acquire 0~0 block to be locked. Otherwise 
If two write requests would access to same block, say one writes to 
0~254 and the other writes to 255~511, if they take 0~254 and 255~511 
respectively, the contents in this block may get corrupted after the two 
writes.

thanks,
wengang

>> 2.In ocfs2, there are only three types of lock resources: rw, inode and open
>> which provide protections to different contents.
>> We need to add another lock resource(ip_range_lock_lockres) to protect
>> different ranges in IO read/write process.
>> For example: buffer read/write.
>> (1)ocfs2_file_aio_write	------------->ocfs2_file_aio_write
>> 	ocfs2_rw_lock(ex)		ocfs2_rw_lock(pr)
>> 					ocfs2_range_lock(start, end, ex)
> This does not seem right. ocfs2_rw_lock is meant to serialize writes to
> the same file. Changing it from ex to pr would make the file
> inconsistent for writes to the same file. As Srini proposed, why create
> a new lock instead of adding the feature to rw_lock?
>
>> 	ocfs2_write_begin
>> 		ocfs2_inode_lock(ex)    ocfs2_inode_lock(pr)
>> 					if append, update to ex;
>> (2)ocfs2_file_aio_read---------------> no need to change.
>> 	ocfs2_readpage
>> 		ocfs2_inode_lock(pr)
>> (3)but it is a problem in read_ahead.
>> 	ocfs2_readpages------------------>ocfs2_readpages
>> 	ocfs2_inode_lock(pr)		ocfs2_inode_lock(pr)
>> 					ocfs2_range_lock(start, end, pr)
>> 																	
>> Limitations based on our assumption:
>> 1.Byte range lock is only beneficial for update write.
>> 2.Too many locks because of delayed unlock.
>> 3.Significant source code modification is necessitated, involving almost the
>> whole dlmglue and dlm modules.
>>
>> As described above, there are also many limitations base on our assumption.
>> Many thanks for any advice.
>>
>

  reply	other threads:[~2015-01-29  3:21 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-26 12:28 [Ocfs2-devel] [RFC] ocfs2/dlm: support range lock yangwenfang
2015-01-27  7:08 ` Srinivas Eeda
2015-01-29  6:42   ` yangwenfang
2015-01-29 11:04     ` Goldwyn Rodrigues
2015-01-30  2:59       ` Xue jiufei
2015-01-30 12:37         ` Goldwyn Rodrigues
2015-01-31  4:15           ` yangwenfang
2015-01-29 11:07     ` Goldwyn Rodrigues
2015-01-29  0:05 ` Goldwyn Rodrigues
2015-01-29  3:21   ` Wengang Wang [this message]
2015-01-29  7:47   ` yangwenfang
2015-01-29  8:06     ` Wengang Wang
2015-01-30  3:54       ` yangwenfang
2015-01-30  6:02         ` Wengang Wang
2015-01-30  7:46           ` yangwenfang
  -- strict thread matches above, loose matches on Subject: below --
2015-01-28  8:43 David Weber

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54C9A725.3010909@oracle.com \
    --to=wen.gang.wang@oracle.com \
    --cc=ocfs2-devel@oss.oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox