[xen stable-4.4] oxenstored: add transaction info relevant to history-tracking

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

[xen stable-4.4] oxenstored: add transaction info relevant to history-tracking

patchbot
commit 5c4b09b6bd998a15d7f4d02c9ca5a34d6a811414
Author:     Jonathan Davies <[hidden email]>
AuthorDate: Tue Mar 14 12:17:38 2017 +0000
Commit:     Ian Jackson <[hidden email]>
CommitDate: Wed Apr 5 15:26:38 2017 +0100

    oxenstored: add transaction info relevant to history-tracking
   
    Specifically:
     * retain the original store (not just the root) in full transactions
     * store commit count at the time of the start of the transaction
   
    Reported-by: Juergen Gross <[hidden email]>
    Signed-off-by: Jonathan Davies <[hidden email]>
    Reviewed-by: Thomas Sanders <[hidden email]>
    Reviewed-by: Ian Jackson <[hidden email]>
    Reviewed-by: Christian Lindig <[hidden email]>
---
 tools/ocaml/xenstored/process.ml     |  2 +-
 tools/ocaml/xenstored/transaction.ml | 12 ++++++++----
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/tools/ocaml/xenstored/process.ml b/tools/ocaml/xenstored/process.ml
index 9cf2b46..ff5fc24 100644
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -295,7 +295,7 @@ let transaction_replay c t doms cons =
  | Transaction.No ->
  error "attempted to replay a non-full transaction";
  false
- | Transaction.Full(id, oldroot, cstore) ->
+ | Transaction.Full(id, oldstore, cstore) ->
  let tid = Connection.start_transaction c cstore in
  let new_t = Transaction.make tid cstore in
  let con = sprintf "r(%d):%s" id (Connection.get_domstr c) in
diff --git a/tools/ocaml/xenstored/transaction.ml b/tools/ocaml/xenstored/transaction.ml
index 6f758ff..b1791b3 100644
--- a/tools/ocaml/xenstored/transaction.ml
+++ b/tools/ocaml/xenstored/transaction.ml
@@ -73,12 +73,13 @@ let can_coalesce oldroot currentroot path =
 
 type ty = No | Full of (
  int *          (* Transaction id *)
- Store.Node.t * (* Original root *)
+ Store.t *      (* Original store *)
  Store.t        (* A pointer to the canonical store: its root changes on each transaction-commit *)
 )
 
 type t = {
  ty: ty;
+ start_count: int64;
  store: Store.t; (* This is the store that we change in write operations. *)
  quota: Quota.t;
  mutable paths: (Xenbus.Xb.Op.operation * Store.Path.t) list;
@@ -87,10 +88,13 @@ type t = {
  mutable write_lowpath: Store.Path.t option;
 }
 
+let counter = ref 0L
+
 let make id store =
- let ty = if id = none then No else Full(id, Store.get_root store, store) in
+ let ty = if id = none then No else Full(id, Store.copy store, store) in
  {
  ty = ty;
+ start_count = !counter;
  store = if id = none then store else Store.copy store;
  quota = Quota.copy store.Store.quota;
  paths = [];
@@ -161,7 +165,7 @@ let commit ~con t =
  let has_commited =
  match t.ty with
  | No                         -> true
- | Full (id, oldroot, cstore) ->       (* "cstore" meaning current canonical store *)
+ | Full (id, oldstore, cstore) ->       (* "cstore" meaning current canonical store *)
  let commit_partial oldroot cstore store =
  (* get the lowest path of the query and verify that it hasn't
    been modified by others transactions. *)
@@ -204,7 +208,7 @@ let commit ~con t =
  if !test_eagain && Random.int 3 = 0 then
  false
  else
- try_commit oldroot cstore t.store
+ try_commit (Store.get_root oldstore) cstore t.store
  in
  if has_commited && has_write_ops then
  Disk.write t.store;
--
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