]> xenbits.xensource.com Git - xen.git/commitdiff
oxenstored: add transaction info relevant to history-tracking
authorJonathan Davies <jonathan.davies@citrix.com>
Tue, 14 Mar 2017 12:17:38 +0000 (12:17 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Wed, 5 Apr 2017 14:22:33 +0000 (15:22 +0100)
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 <jgross@suse.com>
Signed-off-by: Jonathan Davies <jonathan.davies@citrix.com>
Reviewed-by: Thomas Sanders <thomas.sanders@citrix.com>
Reviewed-by: Ian Jackson <ian.jackson@eu.citrix.com>
Reviewed-by: Christian Lindig <christian.lindig@citrix.com>
tools/ocaml/xenstored/process.ml
tools/ocaml/xenstored/transaction.ml

index 5a7f81ab647e13ea1ef1fc8e5d9cddfa9d4970ab..0596be2b0872c1a07b87ca7ad210ca76c1ef9529 100644 (file)
@@ -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
index 6f758ff58bc255c05b9cbc09fd9defbe199c8e9d..b1791b3af5175264cefdeb9b29d880b0c4521d46 100644 (file)
@@ -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;