[Gluster-devel] GlusterFS User and Group Quotas

Vijaikumar Mallikarjuna vmallika at redhat.com
Tue Dec 8 09:32:55 UTC 2015


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

*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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.gluster.org/pipermail/gluster-devel/attachments/20151208/18ccd1fd/attachment.html>


More information about the Gluster-devel mailing list