[xen stable-4.4] oxenstored: trim history in the frequent_ops function

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[xen stable-4.4] oxenstored: trim history in the frequent_ops function

patchbot
commit 6bf0560e123ec50dd0fab3850effe448504d8604
Author:     Thomas Sanders <[hidden email]>
AuthorDate: Tue Mar 28 18:57:52 2017 +0100
Commit:     Ian Jackson <[hidden email]>
CommitDate: Wed Apr 5 15:26:38 2017 +0100

    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 <[hidden email]>
---
 tools/ocaml/xenstored/history.ml     | 6 +++---
 tools/ocaml/xenstored/transaction.ml | 8 ++++++--
 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 4079588..f39565b 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 da4a3e3..23e7ccf 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 979b769..180edd6 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
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.4

_______________________________________________
Xen-changelog mailing list
[hidden email]
https://lists.xenproject.org/xen-changelog
Loading...