[prev in list] [next in list] [prev in thread] [next in thread]
List: xen-cvs
Subject: [Xen-changelog] [xen master] oxenstored: allow self-conflicts
From: patchbot () xen ! org
Date: 2017-03-31 11:56:53
Message-ID: E1ctvAj-0002s6-5Z () xenbits ! xenproject ! org
[Download RAW message or body]
commit 467c9de412f2ba80dc40a82b049abefc7bf8126a
Author: Thomas Sanders <thomas.sanders@citrix.com>
AuthorDate: Thu Mar 23 19:06:54 2017 +0000
Commit: Ian Jackson <Ian.Jackson@eu.citrix.com>
CommitDate: Tue Mar 28 13:07:04 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.
Signed-off-by: Thomas Sanders <thomas.sanders@citrix.com>
Reviewed-by: Jonathan Davies <jonathan.davies@citrix.com>
---
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 0570d82..88fea34 100644
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -335,7 +335,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#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xen.org
https://lists.xenproject.org/xen-changelog
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic