[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |