diff options
author | Thomas Sanders <thomas.sanders@citrix.com> | 2017-03-28 18:57:52 +0100 |
---|---|---|
committer | Ian Jackson <Ian.Jackson@eu.citrix.com> | 2017-04-05 15:26:38 +0100 |
commit | 6bf0560e123ec50dd0fab3850effe448504d8604 (patch) | |
tree | d325adbc031f4f7268cb7168ff5b9194f08c38af | |
parent | ebd64cd82af09fe71f3b448039d73ad632a5c69d (diff) | |
download | xen-stable-4.4.tar.gz |
oxenstored: trim history in the frequent_ops functionstaging-4.4stable-4.4
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>
-rw-r--r-- | tools/ocaml/xenstored/history.ml | 6 | ||||
-rw-r--r-- | tools/ocaml/xenstored/transaction.ml | 8 | ||||
-rw-r--r-- | tools/ocaml/xenstored/xenstored.ml | 1 |
3 files changed, 10 insertions, 5 deletions
diff --git a/tools/ocaml/xenstored/history.ml b/tools/ocaml/xenstored/history.ml index 4079588896..f39565bff5 100644 --- a/tools/ocaml/xenstored/history.ml +++ b/tools/ocaml/xenstored/history.ml @@ -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) = diff --git a/tools/ocaml/xenstored/transaction.ml b/tools/ocaml/xenstored/transaction.ml index da4a3e367f..23e7ccff1b 100644 --- a/tools/ocaml/xenstored/transaction.ml +++ b/tools/ocaml/xenstored/transaction.ml @@ -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 = diff --git a/tools/ocaml/xenstored/xenstored.ml b/tools/ocaml/xenstored/xenstored.ml index 979b769712..180edd6a79 100644 --- a/tools/ocaml/xenstored/xenstored.ml +++ b/tools/ocaml/xenstored/xenstored.ml @@ -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 |