mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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@suse.com> Signed-off-by: Thomas Sanders <thomas.sanders@citrix.com> Reviewed-by: Jonathan Davies <jonathan.davies@citrix.com>
This commit is contained in:
1 parent
4eff891f1b
commit
3d1affc787
2 files changed
+3
-2
No files matched your search
@@ -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 ();
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||