| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package txnBuf | 5 package txnBuf |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "bytes" | 8 "bytes" |
| 9 "sync" | 9 "sync" |
| 10 | 10 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 // they're same groups affected by the parent transactions. So i
nstead of | 138 // they're same groups affected by the parent transactions. So i
nstead of |
| 139 // respecting opts.XG for inner transactions, we just dup everyt
hing from | 139 // respecting opts.XG for inner transactions, we just dup everyt
hing from |
| 140 // the parent transaction. | 140 // the parent transaction. |
| 141 roots = parentState.roots.Dup() | 141 roots = parentState.roots.Dup() |
| 142 rootLimit = parentState.rootLimit | 142 rootLimit = parentState.rootLimit |
| 143 | 143 |
| 144 sizeBudget = parentState.sizeBudget - parentState.entState.total | 144 sizeBudget = parentState.sizeBudget - parentState.entState.total |
| 145 writeCountBudget = parentState.writeCountBudget - parentState.en
tState.numWrites() | 145 writeCountBudget = parentState.writeCountBudget - parentState.en
tState.numWrites() |
| 146 } | 146 } |
| 147 | 147 |
| 148 bufDS, err := memory.NewDatastore(inf.FullyQualifiedAppID(), ns) | |
| 149 if err != nil { | |
| 150 return err | |
| 151 } | |
| 152 | |
| 153 state := &txnBufState{ | 148 state := &txnBufState{ |
| 154 entState: &sizeTracker{}, | 149 entState: &sizeTracker{}, |
| 155 » » bufDS: bufDS.Raw(), | 150 » » bufDS: memory.NewDatastore(inf).Raw(), |
| 156 roots: roots, | 151 roots: roots, |
| 157 rootLimit: rootLimit, | 152 rootLimit: rootLimit, |
| 158 ns: ns, | 153 ns: ns, |
| 159 » » aid: inf.AppID(), | 154 » » aid: inf.FullyQualifiedAppID(), |
| 160 parentDS: datastore.Get(context.WithValue(ctx, dsTxnBufH
aveLock, true)).Raw(), | 155 parentDS: datastore.Get(context.WithValue(ctx, dsTxnBufH
aveLock, true)).Raw(), |
| 161 sizeBudget: sizeBudget, | 156 sizeBudget: sizeBudget, |
| 162 writeCountBudget: writeCountBudget, | 157 writeCountBudget: writeCountBudget, |
| 163 } | 158 } |
| 164 » if err = cb(context.WithValue(ctx, dsTxnBufParent, state)); err != nil { | 159 » if err := cb(context.WithValue(ctx, dsTxnBufParent, state)); err != nil
{ |
| 165 return err | 160 return err |
| 166 } | 161 } |
| 167 | 162 |
| 168 // no reason to unlock this ever. At this point it's toast. | 163 // no reason to unlock this ever. At this point it's toast. |
| 169 state.Lock() | 164 state.Lock() |
| 170 | 165 |
| 171 if parentState == nil { | 166 if parentState == nil { |
| 172 return commitToReal(state) | 167 return commitToReal(state) |
| 173 } | 168 } |
| 174 | 169 |
| 175 » if err = parentState.canApplyLocked(state); err != nil { | 170 » if err := parentState.canApplyLocked(state); err != nil { |
| 176 return err | 171 return err |
| 177 } | 172 } |
| 178 | 173 |
| 179 parentState.commitLocked(state) | 174 parentState.commitLocked(state) |
| 180 return nil | 175 return nil |
| 181 } | 176 } |
| 182 | 177 |
| 183 // item is a temporary object for representing key/entity pairs and their cache | 178 // item is a temporary object for representing key/entity pairs and their cache |
| 184 // state (e.g. if they exist in the in-memory datastore buffer or not). | 179 // state (e.g. if they exist in the in-memory datastore buffer or not). |
| 185 // Additionally item memoizes some common comparison strings. item objects | 180 // Additionally item memoizes some common comparison strings. item objects |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 // plus a stringset of all the encoded root keys that `keys` represents. | 542 // plus a stringset of all the encoded root keys that `keys` represents. |
| 548 func toEncoded(keys []*datastore.Key) (full []string, roots stringset.Set) { | 543 func toEncoded(keys []*datastore.Key) (full []string, roots stringset.Set) { |
| 549 roots = stringset.New(len(keys)) | 544 roots = stringset.New(len(keys)) |
| 550 full = make([]string, len(keys)) | 545 full = make([]string, len(keys)) |
| 551 for i, k := range keys { | 546 for i, k := range keys { |
| 552 roots.Add(string(serialize.ToBytes(k.Root()))) | 547 roots.Add(string(serialize.ToBytes(k.Root()))) |
| 553 full[i] = string(serialize.ToBytes(k)) | 548 full[i] = string(serialize.ToBytes(k)) |
| 554 } | 549 } |
| 555 return | 550 return |
| 556 } | 551 } |
| OLD | NEW |