[xen stable-4.4] oxenstored: do not commit read-only transactions

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view

[xen stable-4.4] oxenstored: do not commit read-only transactions

commit 63e3e0b1e319ea42cf0255523f6877dd6a9994b2
Author:     Thomas Sanders <[hidden email]>
AuthorDate: Fri Mar 24 16:16:10 2017 +0000
Commit:     Ian Jackson <[hidden email]>
CommitDate: Wed Apr 5 15:26:38 2017 +0100

    oxenstored: do not commit read-only transactions
    The packet telling us to end the transaction has always carried an
    argument telling us whether to commit.
    If the transaction made no modifications to the tree, now we ignore
    that argument and do not commit: it is just a waste of effort.
    This makes read-only transactions immune to conflicts, and means that
    we do not need to store any of their details in the history that is
    used for assigning blame for conflicts.
    We count a transaction as a read-only transaction only if it contains
    no operations that modified the tree.
    This means that (for example) a transaction that creates a new node
    then deletes it would NOT count as read-only, even though it makes no
    change overall. A more sophisticated algorithm could judge the
    transaction based on comparison of its initial and final states, but
    this would add complexity and computational cost.
    Reported-by: Juergen Gross <[hidden email]>
    Signed-off-by: Thomas Sanders <[hidden email]>
    Reviewed-by: Jonathan Davies <[hidden email]>
 tools/ocaml/xenstored/process.ml     | 1 +
 tools/ocaml/xenstored/transaction.ml | 1 +
 2 files changed, 2 insertions(+)

diff --git a/tools/ocaml/xenstored/process.ml b/tools/ocaml/xenstored/process.ml
index ff2ca65..a983b49 100644
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -387,6 +387,7 @@ let do_transaction_end con t domains cons data =
  | x :: _   -> raise (Invalid_argument x)
  | _        -> raise Invalid_Cmd_Args
+ let commit = commit && not (Transaction.is_read_only t) in
  let success =
  let commit = if commit then Some (fun con trans -> transaction_replay con trans domains cons) else None in
  History.end_transaction t con (Transaction.get_id t) commit in
diff --git a/tools/ocaml/xenstored/transaction.ml b/tools/ocaml/xenstored/transaction.ml
index edd1178..8f95301 100644
--- a/tools/ocaml/xenstored/transaction.ml
+++ b/tools/ocaml/xenstored/transaction.ml
@@ -128,6 +128,7 @@ let make ?(internal=false) id store =
 let get_store t = t.store
 let get_paths t = t.paths
+let is_read_only t = t.paths = []
 let add_wop t ty path = t.paths <- (ty, path) :: t.paths
 let add_operation ~perm t request response =
  if !Define.maxrequests >= 0
generated by git-patchbot for /home/xen/git/xen.git#stable-4.4

Xen-changelog mailing list
[hidden email]