summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Sanders <thomas.sanders@citrix.com>2017-03-28 18:57:52 +0100
committerIan Jackson <Ian.Jackson@eu.citrix.com>2017-04-05 15:26:38 +0100
commit6bf0560e123ec50dd0fab3850effe448504d8604 (patch)
treed325adbc031f4f7268cb7168ff5b9194f08c38af
parentebd64cd82af09fe71f3b448039d73ad632a5c69d (diff)
downloadxen-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.ml6
-rw-r--r--tools/ocaml/xenstored/transaction.ml8
-rw-r--r--tools/ocaml/xenstored/xenstored.ml1
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