66 "testing"
77 "time"
88
9+ ds "github.com/ipfs/go-datastore"
910 "github.com/rs/zerolog"
1011 "github.com/stretchr/testify/assert"
1112 "github.com/stretchr/testify/require"
@@ -337,7 +338,7 @@ func TestCachedStore_Close_FlushesPendingWrites(t *testing.T) {
337338 cs .startWriteLoop ()
338339
339340 const n = 100
340- for i := 0 ; i < n ; i ++ {
341+ for i := range n {
341342 k := fmt .Sprintf ("key-%d" , i )
342343 require .NoError (t , cs .SetMetadata (ctx , k , []byte (k )))
343344 }
@@ -348,7 +349,7 @@ func TestCachedStore_Close_FlushesPendingWrites(t *testing.T) {
348349 cs .stopMu .Unlock ()
349350 <- done
350351
351- for i := 0 ; i < n ; i ++ {
352+ for i := range n {
352353 k := fmt .Sprintf ("key-%d" , i )
353354 v , err := base .GetMetadata (ctx , k )
354355 require .NoError (t , err )
@@ -372,3 +373,38 @@ func TestCachedStore_WriteAfterClose_FallsBack(t *testing.T) {
372373 err = cs .SetMetadata (ctx , "after" , []byte ("sync" ))
373374 require .Error (t , err )
374375}
376+
377+ func TestCachedStore_CoalescesSameKeyOps (t * testing.T ) {
378+ ctx := context .Background ()
379+
380+ kv , err := NewTestInMemoryKVStore ()
381+ require .NoError (t , err )
382+
383+ require .NoError (t , kv .Put (ctx , ds .NewKey (GetMetaKey ("k" )), []byte ("original" )))
384+
385+ base := New (kv )
386+
387+ writeCh := make (chan asyncWriteOp , asyncWriteBufferSize )
388+ done := make (chan struct {})
389+ cs := & CachedStore {
390+ Store : base ,
391+ writeCh : writeCh ,
392+ done : done ,
393+ logger : zerolog .Nop (),
394+ }
395+ cs .startWriteLoop ()
396+
397+ require .NoError (t , cs .SetMetadata (ctx , "k" , []byte ("v1" )))
398+ require .NoError (t , cs .DeleteMetadata (ctx , "k" ))
399+ require .NoError (t , cs .SetMetadata (ctx , "k" , []byte ("v2" )))
400+
401+ cs .stopMu .Lock ()
402+ cs .stopped = true
403+ close (writeCh )
404+ cs .stopMu .Unlock ()
405+ <- done
406+
407+ v , err := base .GetMetadata (ctx , "k" )
408+ require .NoError (t , err )
409+ require .Equal (t , []byte ("v2" ), v , "last write (Set) should win over delete" )
410+ }
0 commit comments