Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Unified Diff: impl/memory/datastore_data.go

Issue 1911263002: Fix memory corruption bug in impl/memory (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/gae@master
Patch Set: fix comments Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « impl/memory/datastore.go ('k') | impl/memory/datastore_index.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: impl/memory/datastore_data.go
diff --git a/impl/memory/datastore_data.go b/impl/memory/datastore_data.go
index ff06a4722099e6dbd770ea2ca067ad5bd5a888a9..94a868878e6db035cb3de4e9b4e6758e8e514e2f 100644
--- a/impl/memory/datastore_data.go
+++ b/impl/memory/datastore_data.go
@@ -26,10 +26,10 @@ type dataStoreData struct {
aid string
// See README.md for head schema.
- head *memStore
+ head memStore
// if snap is nil, that means that this is always-consistent, and
// getQuerySnaps will return (head, head)
- snap *memStore
+ snap memStore
// For testing, see SetTransactionRetryCount.
txnFakeRetry int
// true means that queries with insufficent indexes will pause to add them
@@ -122,7 +122,7 @@ func (d *dataStoreData) getDisableSpecialEntities() bool {
return d.disableSpecialEntities
}
-func (d *dataStoreData) getQuerySnaps(consistent bool) (idx, head *memStore) {
+func (d *dataStoreData) getQuerySnaps(consistent bool) (idx, head memStore) {
d.rwlock.RLock()
defer d.rwlock.RUnlock()
if d.snap == nil {
@@ -140,13 +140,13 @@ func (d *dataStoreData) getQuerySnaps(consistent bool) (idx, head *memStore) {
return
}
-func (d *dataStoreData) takeSnapshot() *memStore {
+func (d *dataStoreData) takeSnapshot() memStore {
d.rwlock.RLock()
defer d.rwlock.RUnlock()
return d.head.Snapshot()
}
-func (d *dataStoreData) setSnapshot(snap *memStore) {
+func (d *dataStoreData) setSnapshot(snap memStore) {
d.rwlock.Lock()
defer d.rwlock.Unlock()
if d.snap == nil {
@@ -187,7 +187,7 @@ func rootIDsKey(kind string) []byte {
return keyBytes(ds.NewKey("", "", "__entity_root_ids__", kind, 0, nil))
}
-func curVersion(ents *memCollection, key []byte) int64 {
+func curVersion(ents memCollection, key []byte) int64 {
if ents != nil {
if v := ents.Get(key); v != nil {
pm, err := rpm(v)
@@ -204,7 +204,7 @@ func curVersion(ents *memCollection, key []byte) int64 {
return 0
}
-func incrementLocked(ents *memCollection, key []byte, amt int) int64 {
+func incrementLocked(ents memCollection, key []byte, amt int) int64 {
if amt <= 0 {
panic(fmt.Errorf("incrementLocked called with bad `amt`: %d", amt))
}
@@ -215,24 +215,15 @@ func incrementLocked(ents *memCollection, key []byte, amt int) int64 {
return ret
}
-func (d *dataStoreData) mutableEntsLocked(ns string) *memCollection {
- coll := "ents:" + ns
- ents := d.head.GetCollection(coll)
- if ents == nil {
- ents = d.head.SetCollection(coll, nil)
- }
- return ents
-}
-
func (d *dataStoreData) allocateIDs(incomplete *ds.Key, n int) (int64, error) {
d.Lock()
defer d.Unlock()
- ents := d.mutableEntsLocked(incomplete.Namespace())
+ ents := d.head.GetOrCreateCollection("ents:" + incomplete.Namespace())
return d.allocateIDsLocked(ents, incomplete, n)
}
-func (d *dataStoreData) allocateIDsLocked(ents *memCollection, incomplete *ds.Key, n int) (int64, error) {
+func (d *dataStoreData) allocateIDsLocked(ents memCollection, incomplete *ds.Key, n int) (int64, error) {
if d.disableSpecialEntities {
return 0, errors.New("disableSpecialEntities is true so allocateIDs is disabled")
}
@@ -246,7 +237,7 @@ func (d *dataStoreData) allocateIDsLocked(ents *memCollection, incomplete *ds.Ke
return incrementLocked(ents, idKey, n), nil
}
-func (d *dataStoreData) fixKeyLocked(ents *memCollection, key *ds.Key) (*ds.Key, error) {
+func (d *dataStoreData) fixKeyLocked(ents memCollection, key *ds.Key) (*ds.Key, error) {
if key.Incomplete() {
id, err := d.allocateIDsLocked(ents, key, 1)
if err != nil {
@@ -268,7 +259,7 @@ func (d *dataStoreData) putMulti(keys []*ds.Key, vals []ds.PropertyMap, cb ds.Pu
d.Lock()
defer d.Unlock()
- ents := d.mutableEntsLocked(ns)
+ ents := d.head.GetOrCreateCollection("ents:" + ns)
ret, err = d.fixKeyLocked(ents, k)
if err != nil {
@@ -298,7 +289,7 @@ func (d *dataStoreData) putMulti(keys []*ds.Key, vals []ds.PropertyMap, cb ds.Pu
return nil
}
-func getMultiInner(keys []*ds.Key, cb ds.GetMultiCB, getColl func() (*memCollection, error)) error {
+func getMultiInner(keys []*ds.Key, cb ds.GetMultiCB, getColl func() (memCollection, error)) error {
ents, err := getColl()
if err != nil {
return err
@@ -322,7 +313,7 @@ func getMultiInner(keys []*ds.Key, cb ds.GetMultiCB, getColl func() (*memCollect
}
func (d *dataStoreData) getMulti(keys []*ds.Key, cb ds.GetMultiCB) error {
- return getMultiInner(keys, cb, func() (*memCollection, error) {
+ return getMultiInner(keys, cb, func() (memCollection, error) {
s := d.takeSnapshot()
return s.GetCollection("ents:" + keys[0].Namespace()), nil
@@ -335,7 +326,7 @@ func (d *dataStoreData) delMulti(keys []*ds.Key, cb ds.DeleteMultiCB) error {
hasEntsInNS := func() bool {
d.Lock()
defer d.Unlock()
- return d.mutableEntsLocked(ns) != nil
+ return d.head.GetOrCreateCollection("ents:"+ns) != nil
}()
if hasEntsInNS {
@@ -346,7 +337,7 @@ func (d *dataStoreData) delMulti(keys []*ds.Key, cb ds.DeleteMultiCB) error {
d.Lock()
defer d.Unlock()
- ents := d.mutableEntsLocked(ns)
+ ents := d.head.GetOrCreateCollection("ents:" + ns)
if !d.disableSpecialEntities {
incrementLocked(ents, groupMetaKey(k), 1)
@@ -452,7 +443,7 @@ type txnDataStoreData struct {
closed int32
isXG bool
- snap *memStore
+ snap memStore
// string is the raw-bytes encoding of the entity root incl. namespace
muts map[string][]txnMutation
@@ -533,7 +524,7 @@ func (td *txnDataStoreData) putMulti(keys []*ds.Key, vals []ds.PropertyMap, cb d
err := func() (err error) {
td.parent.Lock()
defer td.parent.Unlock()
- ents := td.parent.mutableEntsLocked(ns)
+ ents := td.parent.head.GetOrCreateCollection("ents:" + ns)
k, err = td.parent.fixKeyLocked(ents, k)
return
@@ -548,7 +539,7 @@ func (td *txnDataStoreData) putMulti(keys []*ds.Key, vals []ds.PropertyMap, cb d
}
func (td *txnDataStoreData) getMulti(keys []*ds.Key, cb ds.GetMultiCB) error {
- return getMultiInner(keys, cb, func() (*memCollection, error) {
+ return getMultiInner(keys, cb, func() (memCollection, error) {
err := error(nil)
for _, key := range keys {
err = td.writeMutation(true, key, nil)
@@ -579,7 +570,7 @@ func rpm(data []byte) (ds.PropertyMap, error) {
serialize.WithContext, "", "")
}
-func namespaces(store *memStore) []string {
+func namespaces(store memStore) []string {
var namespaces []string
for _, c := range store.GetCollectionNames() {
ns, has := trimPrefix(c, "ents:")
« no previous file with comments | « impl/memory/datastore.go ('k') | impl/memory/datastore_index.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698