Skip to content

Commit 4071f13

Browse files
committed
refactor checkReload to short circuit and return max error if data length hits the max already
1 parent 2d3a74f commit 4071f13

File tree

1 file changed

+61
-52
lines changed

1 file changed

+61
-52
lines changed

x/staking/cache/entry.go

Lines changed: 61 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,52 @@ func (e *Entry[V, E]) get(ctx context.Context, cdc codec.BinaryCodec, key string
110110
func (e *Entry[V, E]) set(ctx context.Context, cdc codec.BinaryCodec, key string, value V) error {
111111
e.mu.Lock()
112112
defer e.mu.Unlock()
113-
return e.setUnsafe(ctx, cdc, key, value)
113+
store := e.storeService.OpenMemoryStore(ctx)
114+
115+
metadata, err := e.getMetadata(store, cdc)
116+
if err != nil {
117+
return err
118+
}
119+
120+
if metadata.IsFull {
121+
return types.ErrCacheMaxSizeReached
122+
}
123+
124+
exist := false
125+
if e.max > 0 {
126+
var err error
127+
exist, err = e.exists(store, key)
128+
if err != nil {
129+
return err
130+
}
131+
}
132+
133+
bz, err := marshal(cdc, e.entryType, value)
134+
if err != nil {
135+
return err
136+
}
137+
138+
if err := e.setStore(store, key, bz); err != nil {
139+
return err
140+
}
141+
142+
if e.max > 0 && !exist {
143+
count, err := e.count(store)
144+
if err != nil {
145+
return err
146+
}
147+
148+
if count >= uint64(e.max) {
149+
metadata.IsDirty = true
150+
metadata.IsFull = true
151+
if err := e.setMetadata(store, cdc, metadata); err != nil {
152+
return err
153+
}
154+
return types.ErrCacheMaxSizeReached
155+
}
156+
}
157+
158+
return nil
114159
}
115160

116161
func (e *Entry[V, E]) delete(ctx context.Context, cdc codec.BinaryCodec, key string) error {
@@ -220,56 +265,6 @@ func (e *Entry[V, E]) setMetadata(store corestoretypes.KVStore, cdc codec.Binary
220265
return store.Set(e.getMetaKey(), bz)
221266
}
222267

223-
// setUnsafe: caller MUST hold lock
224-
func (e *Entry[V, E]) setUnsafe(ctx context.Context, cdc codec.BinaryCodec, key string, value V) error {
225-
store := e.storeService.OpenMemoryStore(ctx)
226-
227-
metadata, err := e.getMetadata(store, cdc)
228-
if err != nil {
229-
return err
230-
}
231-
232-
if metadata.IsFull {
233-
return types.ErrCacheMaxSizeReached
234-
}
235-
236-
exist := false
237-
if e.max > 0 {
238-
var err error
239-
exist, err = e.exists(store, key)
240-
if err != nil {
241-
return err
242-
}
243-
}
244-
245-
bz, err := marshal(cdc, e.entryType, value)
246-
if err != nil {
247-
return err
248-
}
249-
250-
if err := e.setStore(store, key, bz); err != nil {
251-
return err
252-
}
253-
254-
if e.max > 0 && !exist {
255-
count, err := e.count(store)
256-
if err != nil {
257-
return err
258-
}
259-
260-
if count >= uint64(e.max) {
261-
metadata.IsDirty = true
262-
metadata.IsFull = true
263-
if err := e.setMetadata(store, cdc, metadata); err != nil {
264-
return err
265-
}
266-
return types.ErrCacheMaxSizeReached
267-
}
268-
}
269-
270-
return nil
271-
}
272-
273268
// clear: caller MUST hold lock
274269
func (e *Entry[V, E]) clear(ctx context.Context, cdc codec.BinaryCodec) error {
275270
store := e.storeService.OpenMemoryStore(ctx)
@@ -320,12 +315,26 @@ func (e *Entry[V, E]) checkReload(ctx context.Context, cdc codec.BinaryCodec, lo
320315
return err
321316
}
322317

318+
size := len(data)
319+
if e.max > 0 && size >= int(e.max) {
320+
metadata.IsFull = true
321+
if err := e.setMetadata(store, cdc, metadata); err != nil {
322+
return err
323+
}
324+
return types.ErrCacheMaxSizeReached
325+
}
326+
323327
if err := e.clear(ctx, cdc); err != nil {
324328
return err
325329
}
326330

327331
for key, value := range data {
328-
if err := e.setUnsafe(ctx, cdc, key, value); err != nil {
332+
bz, err := marshal(cdc, e.entryType, value)
333+
if err != nil {
334+
return err
335+
}
336+
337+
if err := e.setStore(store, key, bz); err != nil {
329338
return err
330339
}
331340
}

0 commit comments

Comments
 (0)