[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] oxenstored: allow updates regardless of quota



commit ed4f4bb739c4c25a0bc48712960a3b6fb9b465c2
Author:     Zheng Li <zheng.li@xxxxxxxxxxxxx>
AuthorDate: Thu Oct 31 16:32:56 2013 +0000
Commit:     Ian Campbell <ian.campbell@xxxxxxxxxx>
CommitDate: Mon Nov 11 15:41:18 2013 +0000

    oxenstored: allow updates regardless of quota
    
    Allow a domain updating existing xenstore keys even if it has already 
reached
    its max entries limit
    
    As updating existing key won't increase the number of entries belonging to a
    domain, we should avoid checking the max entries limit prematurely. The 
patch
    addresses this issue in the following functions: write/add, mkdir, setperms.
    
    Signed-off-by: Zheng Li <zheng.li@xxxxxxxxxxxxx>
    Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
---
 tools/ocaml/xenstored/store.ml |   26 +++++++++++++++++---------
 1 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/tools/ocaml/xenstored/store.ml b/tools/ocaml/xenstored/store.ml
index df11fa7..cac0b44 100644
--- a/tools/ocaml/xenstored/store.ml
+++ b/tools/ocaml/xenstored/store.ml
@@ -180,12 +180,12 @@ let get_node rnode path =
                try Some (lookup_get rnode path) with Define.Doesnt_exist -> 
None
        )
 
-(* get the deepest existing node for this path *)
+(* get the deepest existing node for this path, return the node and a flag on 
the existence of the full path *)
 let rec get_deepest_existing_node node = function
-       | [] -> node
+       | [] -> node, true
        | h :: t ->
                try get_deepest_existing_node (Node.find node h) t 
-               with Not_found -> node
+               with Not_found -> node, false
 
 let set_node rnode path nnode =
        let quota = Quota.create () in
@@ -348,7 +348,7 @@ let traversal root_node f =
                List.iter (_traversal (path @ [ Symbol.to_string node.Node.name 
])) node.Node.children
                in
        _traversal [] root_node
-               
+
 let dump_store_buf root_node =
        let buf = Buffer.create 8192 in
        let dump_node path node =
@@ -381,16 +381,24 @@ let set_node store path node =
        Quota.add store.quota quota_diff
 
 let write store perm path value =
-       let owner = Node.get_owner (get_deepest_existing_node store path) in
-       Quota.check store.quota owner (String.length value);
+       let node, existing = get_deepest_existing_node store path in
+       let owner = Node.get_owner node in
+       if existing then
+               (* Only check the string length limit *)
+               Quota.check store.quota (-1) (String.length value)
+       else
+               (* Check the domain entries limit too *)
+               Quota.check store.quota owner (String.length value);
        let root, node_created = path_write store perm path value in
        store.root <- root;
        if node_created
        then Quota.add_entry store.quota owner
 
 let mkdir store perm path =
-       let owner = Node.get_owner (get_deepest_existing_node store path) in
-       Quota.check store.quota owner 0;
+       let node, existing = get_deepest_existing_node store path in
+       let owner = Node.get_owner node in
+       (* It's upt to the mkdir logic to decide what to do with existing path 
*)
+       if not existing then Quota.check store.quota owner 0;
        store.root <- path_mkdir store perm path;
        Quota.add_entry store.quota owner
 
@@ -408,7 +416,7 @@ let setperms store perm path nperms =
        | Some node ->
                let old_owner = Node.get_owner node in
                let new_owner = Perms.Node.get_owner nperms in
-               Quota.check store.quota new_owner 0;
+               if old_owner <> new_owner then Quota.check store.quota 
new_owner 0;
                store.root <- path_setperms store perm path nperms;
                Quota.del_entry store.quota old_owner;
                Quota.add_entry store.quota new_owner
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.