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

[Xen-changelog] [xen stable-4.6] oxenstored: allow self-conflicts



commit 3d1affc787bd3a2a93316981c749c52a5ba660f7
Author:     Thomas Sanders <thomas.sanders@xxxxxxxxxx>
AuthorDate: Thu Mar 23 19:06:54 2017 +0000
Commit:     Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
CommitDate: Wed Apr 5 15:19:02 2017 +0100

    oxenstored: allow self-conflicts
    
    We already avoid inter-domain conflicts but now allow intra-domain
    conflicts.  Although there are no known practical examples of a domain
    that might perform operations that conflict with its own transactions,
    this is conceivable, so here we avoid changing those semantics
    unnecessarily.
    
    When a transaction commit fails with a conflict and we look through
    the history of commits to see which connection(s) to blame, ignore
    historical commits that were made by the same connection as the
    failing commit.
    
    Reported-by: Juergen Gross <jgross@xxxxxxxx>
    Signed-off-by: Thomas Sanders <thomas.sanders@xxxxxxxxxx>
    Reviewed-by: Jonathan Davies <jonathan.davies@xxxxxxxxxx>
---
 tools/ocaml/xenstored/history.ml | 3 ++-
 tools/ocaml/xenstored/process.ml | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/tools/ocaml/xenstored/history.ml b/tools/ocaml/xenstored/history.ml
index e941e2b..4079588 100644
--- a/tools/ocaml/xenstored/history.ml
+++ b/tools/ocaml/xenstored/history.ml
@@ -60,11 +60,12 @@ let push (x: history_record) =
        | Some d -> if not (Domain.is_free_to_conflict d) then history := x :: 
!history
 
 (* Find the connections from records since commit-count [since] for which [f 
record] returns [true] *)
-let filter_connections ~since ~f =
+let filter_connections ~ignore ~since ~f =
        (* The "mem" call is an optimisation, to avoid calling f if we have 
picked con already. *)
        (* Using a hash table rather than a list is to optimise the "mem" call. 
*)
        List.fold_left (fun acc hist_rec ->
                if hist_rec.finish_count > since
+               && not (hist_rec.con == ignore)
                && not (Hashtbl.mem acc hist_rec.con)
                && f hist_rec
                then Hashtbl.replace acc hist_rec.con ();
diff --git a/tools/ocaml/xenstored/process.ml b/tools/ocaml/xenstored/process.ml
index 5e5a1ab..b56e3fc 100644
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -350,7 +350,7 @@ let transaction_replay c t doms cons =
                                        then (punish hist_rec.History.con; true)
                                        else false
                                ) in
-                               let guilty_cons = History.filter_connections 
~since:t.Transaction.start_count ~f:judge_and_sentence in
+                               let guilty_cons = History.filter_connections 
~ignore:c ~since:t.Transaction.start_count ~f:judge_and_sentence in
                                if Hashtbl.length guilty_cons = 0 then debug 
"Found no culprit for conflict in %s: must be self or not in history." con;
                                false
                        )
--
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®.