@@ -110,7 +110,52 @@ func (e *Entry[V, E]) get(ctx context.Context, cdc codec.BinaryCodec, key string
110110func (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
116161func (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
274269func (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