[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen stable-4.5] oxenstored: trim history in the frequent_ops function



commit b1fcfed19dc8f1f7e65d6e713f5b3becca931f84
Author:     Thomas Sanders <thomas.sanders@xxxxxxxxxx>
AuthorDate: Tue Mar 28 18:57:52 2017 +0100
Commit:     Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
CommitDate: Wed Apr 5 15:22:34 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 <thomas.sanders@xxxxxxxxxx>
---
 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 0e36e5d..e18e191 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.5

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.