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:
Thomas Sanders authored and Ian Jackson committed 2017-04-05 15:19:02 +01:00
1 parent 4eff891f1b
commit 3d1affc787
2 files changed
+3 -2

No files matched your search

+2 -1
View File
@@ -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 ();
+1 -1
View File
@@ -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
)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.