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

Side by Side Diff: impl/memory/datastore_data.go

Issue 1894403002: datastore: Fix AddIndexes with existing namespaces (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/gae@master
Patch Set: 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 unified diff | Download patch
« no previous file with comments | « impl/memory/datastore.go ('k') | impl/memory/datastore_index.go » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 memory 5 package memory
6 6
7 import ( 7 import (
8 "bytes" 8 "bytes"
9 "fmt" 9 "fmt"
10 "strings"
10 "sync" 11 "sync"
11 "sync/atomic" 12 "sync/atomic"
12 13
13 ds "github.com/luci/gae/service/datastore" 14 ds "github.com/luci/gae/service/datastore"
14 "github.com/luci/gae/service/datastore/serialize" 15 "github.com/luci/gae/service/datastore/serialize"
15 "github.com/luci/luci-go/common/errors" 16 "github.com/luci/luci-go/common/errors"
16 "golang.org/x/net/context" 17 "golang.org/x/net/context"
17 ) 18 )
18 19
19 //////////////////////////////// dataStoreData ///////////////////////////////// 20 //////////////////////////////// dataStoreData /////////////////////////////////
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 d.Lock() 73 d.Lock()
73 defer d.Unlock() 74 defer d.Unlock()
74 75
75 if always { 76 if always {
76 d.snap = nil 77 d.snap = nil
77 } else { 78 } else {
78 d.snap = d.head.Snapshot() 79 d.snap = d.head.Snapshot()
79 } 80 }
80 } 81 }
81 82
82 func (d *dataStoreData) addIndexes(ns string, idxs []*ds.IndexDefinition) { 83 func (d *dataStoreData) addIndexes(idxs []*ds.IndexDefinition) {
83 d.Lock() 84 d.Lock()
84 defer d.Unlock() 85 defer d.Unlock()
85 » addIndexes(d.head, d.aid, ns, idxs) 86 » addIndexes(d.head, d.aid, idxs)
86 } 87 }
87 88
88 func (d *dataStoreData) setAutoIndex(enable bool) { 89 func (d *dataStoreData) setAutoIndex(enable bool) {
89 d.Lock() 90 d.Lock()
90 defer d.Unlock() 91 defer d.Unlock()
91 d.autoIndex = enable 92 d.autoIndex = enable
92 } 93 }
93 94
94 func (d *dataStoreData) maybeAutoIndex(err error) bool { 95 func (d *dataStoreData) maybeAutoIndex(err error) bool {
95 mi, ok := err.(*ErrMissingIndex) 96 mi, ok := err.(*ErrMissingIndex)
96 if !ok { 97 if !ok {
97 return false 98 return false
98 } 99 }
99 100
100 d.rwlock.RLock() 101 d.rwlock.RLock()
101 ai := d.autoIndex 102 ai := d.autoIndex
102 d.rwlock.RUnlock() 103 d.rwlock.RUnlock()
103 104
104 if !ai { 105 if !ai {
105 return false 106 return false
106 } 107 }
107 108
108 » d.addIndexes(mi.ns, []*ds.IndexDefinition{mi.Missing}) 109 » d.addIndexes([]*ds.IndexDefinition{mi.Missing})
109 return true 110 return true
110 } 111 }
111 112
112 func (d *dataStoreData) setDisableSpecialEntities(enabled bool) { 113 func (d *dataStoreData) setDisableSpecialEntities(enabled bool) {
113 d.Lock() 114 d.Lock()
114 defer d.Unlock() 115 defer d.Unlock()
115 d.disableSpecialEntities = true 116 d.disableSpecialEntities = true
116 } 117 }
117 118
118 func (d *dataStoreData) getDisableSpecialEntities() bool { 119 func (d *dataStoreData) getDisableSpecialEntities() bool {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 func (d *dataStoreData) catchupIndexes() { 159 func (d *dataStoreData) catchupIndexes() {
159 d.rwlock.Lock() 160 d.rwlock.Lock()
160 defer d.rwlock.Unlock() 161 defer d.rwlock.Unlock()
161 if d.snap == nil { 162 if d.snap == nil {
162 // we're 'always consistent' 163 // we're 'always consistent'
163 return 164 return
164 } 165 }
165 d.snap = d.head.Snapshot() 166 d.snap = d.head.Snapshot()
166 } 167 }
167 168
169 func (d *dataStoreData) namespaces() []string {
170 d.rwlock.Lock()
171 defer d.rwlock.Unlock()
172
173 return namespaces(d.head)
174 }
175
168 /////////////////////////// indexes(dataStoreData) //////////////////////////// 176 /////////////////////////// indexes(dataStoreData) ////////////////////////////
169 177
170 func groupMetaKey(key *ds.Key) []byte { 178 func groupMetaKey(key *ds.Key) []byte {
171 return keyBytes(ds.NewKey("", "", "__entity_group__", "", 1, key.Root()) ) 179 return keyBytes(ds.NewKey("", "", "__entity_group__", "", 1, key.Root()) )
172 } 180 }
173 181
174 func groupIDsKey(key *ds.Key) []byte { 182 func groupIDsKey(key *ds.Key) []byte {
175 return keyBytes(ds.NewKey("", "", "__entity_group_ids__", "", 1, key.Roo t())) 183 return keyBytes(ds.NewKey("", "", "__entity_group_ids__", "", 1, key.Roo t()))
176 } 184 }
177 185
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 } 571 }
564 572
565 func keyBytes(key *ds.Key) []byte { 573 func keyBytes(key *ds.Key) []byte {
566 return serialize.ToBytes(ds.MkProperty(key)) 574 return serialize.ToBytes(ds.MkProperty(key))
567 } 575 }
568 576
569 func rpm(data []byte) (ds.PropertyMap, error) { 577 func rpm(data []byte) (ds.PropertyMap, error) {
570 return serialize.ReadPropertyMap(bytes.NewBuffer(data), 578 return serialize.ReadPropertyMap(bytes.NewBuffer(data),
571 serialize.WithContext, "", "") 579 serialize.WithContext, "", "")
572 } 580 }
581
582 func namespaces(store *memStore) []string {
583 var namespaces []string
584 for _, c := range store.GetCollectionNames() {
585 ns, has := trimPrefix(c, "ents:")
586 if !has {
587 if len(namespaces) > 0 {
588 break
589 }
590 continue
591 }
592 namespaces = append(namespaces, ns)
593 }
594 return namespaces
595 }
596
597 func trimPrefix(v, p string) (string, bool) {
598 if strings.HasPrefix(v, p) {
599 return v[len(p):], true
600 }
601 return v, false
602 }
OLDNEW
« 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