mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
oxenstored: trim history in the frequent_ops function
We were trimming the history of commits only at the end of each transaction (regardless of how it ended). Therefore if non-transactional writes were being made but no transactions were being ended, the history would grow indefinitely. Now we trim the history at regular intervals. Signed-off-by: Thomas Sanders <thomas.sanders@citrix.com>
This commit is contained in:
1 parent
ebd64cd82a
commit
6bf0560e12
3 files changed
+10
-5
No files matched your search
@@ -39,7 +39,8 @@ let mark_symbols () =
|
||||
(* Keep only enough commit-history to protect the running transactions that we are still tracking *)
|
||||
(* There is scope for optimisation here, replacing List.filter with something more efficient,
|
||||
* probably on a different list-like structure. *)
|
||||
let trim () =
|
||||
let trim ?txn () =
|
||||
Transaction.trim_short_running_transactions txn;
|
||||
history := match Transaction.oldest_short_running_transaction () with
|
||||
| None -> [] (* We have no open transaction, so no history is needed *)
|
||||
| Some (_, txn) -> (
|
||||
@@ -49,8 +50,7 @@ let trim () =
|
||||
|
||||
let end_transaction txn con tid commit =
|
||||
let success = Connection.end_transaction con tid commit in
|
||||
Transaction.end_transaction txn;
|
||||
trim ();
|
||||
trim ~txn ();
|
||||
success
|
||||
|
||||
let push (x: history_record) =
|
||||
|
||||
@@ -106,10 +106,14 @@ let oldest_short_running_transaction () =
|
||||
| x :: xs -> last xs
|
||||
in last !short_running_txns
|
||||
|
||||
let end_transaction txn =
|
||||
let trim_short_running_transactions txn =
|
||||
let cutoff = Unix.gettimeofday () -. !Define.conflict_max_history_seconds in
|
||||
let keep = match txn with
|
||||
| None -> (function (start_time, _) -> start_time >= cutoff)
|
||||
| Some t -> (function (start_time, tx) -> start_time >= cutoff && tx != t)
|
||||
in
|
||||
short_running_txns := List.filter
|
||||
(function (start_time, tx) -> start_time >= cutoff && tx != txn)
|
||||
keep
|
||||
!short_running_txns
|
||||
|
||||
let make ?(internal=false) id store =
|
||||
|
||||
@@ -278,6 +278,7 @@ let _ =
|
||||
* than the periodic_ops function *)
|
||||
let frequent_ops () =
|
||||
if Unix.gettimeofday () > !next_frequent_ops then (
|
||||
History.trim ();
|
||||
Domains.incr_conflict_credit domains;
|
||||
advance_next_frequent_ops ()
|
||||
) in
|
||||
|
||||