On Fri, Dec 11, 2015 at 2:03 AM, Shyam <srang...@redhat.com> wrote:
> On 12/08/2015 04:32 AM, Vijaikumar Mallikarjuna wrote:
>>
>> Hi All,
>>
>> Below is the design for '*GlusterFS User and Group Quotas', *please
>> provide your feedback on the same.
>>
>>
>> *_Developers:_*
>> Vijaikumar.M and Manikandan.S
>>
>>
>> *_Introduction:_*
>> User and Group quotas is to limit the amount of disk space for a
>> specified user/group ID.
>> This documents provides some details about how the accounting (marker
>> xlator) can be done
>> for user and group quotas
>>
>>
>> *_Design:_*
>> We have three different approaches, each has pros and cons
>>
>
> my 2 c's,
>
> The problem below is that of maintaining a journal as I see it. With the
> addition of pre/post size awareness, so that the delta can be reflected in
> the quota appropriately.

+1. That's precisely what journaled quotas are - providing the same
benefits as journaled filesystem after unclean shutdowns.

>
> With the above in mind, I would say, steer clear on any database stores,
> unless that is the journal, and if so should be generic for all such use
> case consumers.
>
> One other thing that can be done in the interim, though not I would prefer
> the journal method, would be to update the quota using the existing dirty
> flag, but for files instead of parents. That way, some form of tracking is
> built in. Why I state this is, if the brick went offline in between, then
> the client gets a -ve RPC result, and hence the client would have to take
> some action, so this would be the last write that did not make it through,
> or a truncate that did not make it through. In such cases the dirty flag on
> the file should help resolving the space accounting. One problem though is
> remembering the old and new sizes even in this approach.
>
>> *_Approach-1)_*
>> T1 - For each file/dir 'file_x', create a contribution extended
>> attribute say 'trusted.glusterfs.quota.<uid>-contri'
>> T2 - In a lookup/write operation read the actual size from the stat-buf,
>> add the delta size to the contribution xattr
>> T3 - Create a file .glusterfs/quota/users/<uid>.
>>       Update size extended attribute say 'trusted.glusterfs.quota.size'
>> by adding the delta size calculated in T2
>>
>> Same for group quotas a size xattr is updated under
>> .glusterfs/quota/groups/<gid>.
>>
>> cons:
>>      If the brick crashes after executing T2 and before T3. Now
>> accounting information is in-correct.
>>      To recover and correct the accounting information, entire
>> file-systems needs to be crawled to fix the trusted.glusterfs.quota.size
>>      value by summing up the contribution of all files with UID. But is
>> a slow process.
>>
>>
>> *_Approach-2)_*
>> T1 - For each file/dir 'file_x', create a contribution extended
>> attribute say 'trusted.glusterfs.quota.<uid>-contri'
>> T2 - create a directory '.glusterfs/quota/users/<uid>'
>>       create a hardlink for file file_x under this directories
>> T3 - In a lookup/write operation, set dirty flag
>> 'trusted.glusterfs.quota.dirty' for directory
>> '.glusterfs/quota/users/<uid>'
>> T4 - Read the actual size of a file from the stat-buf, add the delta
>> size to the contribution xattr
>> T5 - update size extended attribute say for directory
>> '.glusterfs/quota/users/<uid>'
>> T6 - unset the dirty flag
>>
>> Same for group quotas a size xattr is updated under
>> .glusterfs/quota/groups/<gid>.
>>
>> Problem of approach 1 of crawling entire brick is solved by only
>> crawling the directory which is set dirty.
>>
>> cons:
>>      Need to make sure that the hard-link for a file is consistent when
>> having another hardlinks
>>      under .glusterfs/quota/users/<uid> and .glusterfs/quota/groups/<gid>
>>
>>
>> *_Approach-3)_*
>> T1 - For each file/dir 'file_x', update a contribution entry in the
>> SQL-LITE DB (Create a DB file under .glusterfs/quota/)
>> T2 - In a lookup/write operation read the actual size from the statbuf,
>> add the update the size in the USER-QUOTA schema in the DB
>> T3 - In a lookup/write operation, set dirty flag
>> 'trusted.glusterfs.quota.dirty' for directory
>> '.glusterfs/quota/users/<uid>'
>>
>> Atomicity problem found in approach 1 and 2 is solved by using DB
>> transactions.
>>
>> Note: need to test the consistency of the SQL-LITE DB.
>>
>> We feel approach-3 is more simpler and efficient way of implementing
>> user/group quotas.
>>
>>
>> Thanks,
>> Vijay
>>
>>
>> _______________________________________________
>> Gluster-devel mailing list
>> Gluster-devel@gluster.org
>> http://www.gluster.org/mailman/listinfo/gluster-devel
>>
> _______________________________________________
> Gluster-devel mailing list
> Gluster-devel@gluster.org
> http://www.gluster.org/mailman/listinfo/gluster-devel



-- 
    Venky
_______________________________________________
Gluster-devel mailing list
Gluster-devel@gluster.org
http://www.gluster.org/mailman/listinfo/gluster-devel

Reply via email to