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

[Xen-changelog] [xen stable-4.6] oxenstored: only record operations with side-effects in history



commit f4d16c9b7042d3efe63fb6a719e8519626fc028f
Author:     Jonathan Davies <jonathan.davies@xxxxxxxxxx>
AuthorDate: Thu Mar 23 14:20:33 2017 +0000
Commit:     Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
CommitDate: Wed Apr 5 15:19:02 2017 +0100

    oxenstored: only record operations with side-effects in history
    
    There is no need to record "read" operations as they will never cause 
another
    transaction to fail.
    
    Reported-by: Juergen Gross <jgross@xxxxxxxx>
    Signed-off-by: Jonathan Davies <jonathan.davies@xxxxxxxxxx>
    Reviewed-by: Thomas Sanders <thomas.sanders@xxxxxxxxxx>
---
 tools/ocaml/xenstored/process.ml | 47 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 43 insertions(+), 4 deletions(-)

diff --git a/tools/ocaml/xenstored/process.ml b/tools/ocaml/xenstored/process.ml
index 964c044..b435a4a 100644
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -450,6 +450,37 @@ let function_of_type ty =
        | _                              -> function_of_type_simple_op ty
 
 (**
+ * Determines which individual (non-transactional) operations we want to 
retain.
+ * We only want to retain operations that have side-effects in the store since
+ * these can be the cause of transactions failing.
+ *)
+let retain_op_in_history ty =
+       match ty with
+       | Xenbus.Xb.Op.Write
+       | Xenbus.Xb.Op.Mkdir
+       | Xenbus.Xb.Op.Rm
+       | Xenbus.Xb.Op.Setperms          -> true
+       | Xenbus.Xb.Op.Debug
+       | Xenbus.Xb.Op.Directory
+       | Xenbus.Xb.Op.Read
+       | Xenbus.Xb.Op.Getperms
+       | Xenbus.Xb.Op.Watch
+       | Xenbus.Xb.Op.Unwatch
+       | Xenbus.Xb.Op.Transaction_start
+       | Xenbus.Xb.Op.Transaction_end
+       | Xenbus.Xb.Op.Introduce
+       | Xenbus.Xb.Op.Release
+       | Xenbus.Xb.Op.Getdomainpath
+       | Xenbus.Xb.Op.Watchevent
+       | Xenbus.Xb.Op.Error
+       | Xenbus.Xb.Op.Isintroduced
+       | Xenbus.Xb.Op.Resume
+       | Xenbus.Xb.Op.Set_target
+       | Xenbus.Xb.Op.Restrict
+       | Xenbus.Xb.Op.Reset_watches
+       | Xenbus.Xb.Op.Invalid           -> false
+
+(**
  * Nothrow guarantee.
  *)
 let process_packet ~store ~cons ~doms ~con ~req =
@@ -465,10 +496,18 @@ let process_packet ~store ~cons ~doms ~con ~req =
                                Connection.get_transaction con tid
                        in
 
-               let before = Store.copy store in
-               let response = input_handle_error ~cons ~doms ~fct ~con ~t ~req 
in
-               let after = Store.copy store in
-               if tid = Transaction.none then record_commit ~con ~tid ~before 
~after;
+               let execute () = input_handle_error ~cons ~doms ~fct ~con ~t 
~req in
+
+               let response =
+                       (* Note that transactions are recorded in history 
separately. *)
+                       if tid = Transaction.none && retain_op_in_history ty 
then begin
+                               let before = Store.copy store in
+                               let response = execute () in
+                               let after = Store.copy store in
+                               record_commit ~con ~tid ~before ~after;
+                               response
+                       end else execute ()
+               in
 
                let response = try
                        if tid <> Transaction.none then
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.6

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

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