Skip to content

Commit a241c93

Browse files
phmxburaksezer
authored andcommitted
Fix conflict between "not exist" and expiration options.
Problem: NX & XX options are conflicting with expiration options (e.g. EX and PX,) when written to other cluster members. Solution: Fixed DMap service PUT handlers to handle those options separately as everywhere else.
1 parent 65285b4 commit a241c93

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

embedded_client_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"time"
2222

2323
"github.com/olric-data/olric/internal/testutil"
24+
"github.com/stretchr/testify/assert"
2425
"github.com/stretchr/testify/require"
2526
"golang.org/x/sync/errgroup"
2627
)
@@ -614,3 +615,27 @@ func TestEmbeddedClient_Ping_WithMessage(t *testing.T) {
614615
require.NoError(t, err)
615616
require.Equal(t, message, response)
616617
}
618+
619+
func TestEmbeddedClient_DMap_Put_PX_With_NX(t *testing.T) {
620+
cluster := newTestOlricCluster(t)
621+
db0 := cluster.addMember(t)
622+
db1 := cluster.addMember(t)
623+
624+
ctx := context.Background()
625+
e := db0.NewEmbeddedClient()
626+
dm0, err := e.NewDMap("mydmap")
627+
require.NoError(t, err)
628+
629+
err = dm0.Put(ctx, "mykey", "myvalue", PX(time.Minute), NX())
630+
require.NoError(t, err)
631+
632+
<-time.After(time.Millisecond)
633+
634+
e = db1.NewEmbeddedClient()
635+
dm1, err := e.NewDMap("mydmap")
636+
require.NoError(t, err)
637+
638+
gr, err := dm1.Get(ctx, "mykey")
639+
require.NoError(t, err)
640+
assert.NotZero(t, gr.TTL())
641+
}

internal/dmap/put_handlers.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ func (s *Service) putCommandHandler(conn redcon.Conn, cmd redcon.Command) {
4040
pc.HasNX = true
4141
case putCmd.XX:
4242
pc.HasXX = true
43+
}
44+
45+
switch {
4346
case putCmd.EX != 0:
4447
pc.HasEX = true
4548
pc.EX = time.Duration(putCmd.EX * float64(time.Second))

internal/dmap/put_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/olric-data/olric/internal/cluster/partitions"
2727
"github.com/olric-data/olric/internal/testcluster"
2828
"github.com/olric-data/olric/internal/testutil"
29+
"github.com/stretchr/testify/assert"
2930
"github.com/stretchr/testify/require"
3031
)
3132

@@ -363,3 +364,35 @@ func TestDMap_Put_ErrEntryTooLarge(t *testing.T) {
363364
err = dm.Put(ctx, "key", data, nil)
364365
require.ErrorIs(t, err, ErrEntryTooLarge)
365366
}
367+
368+
func TestDMap_Put_PX_With_NX(t *testing.T) {
369+
cluster := testcluster.New(NewService)
370+
s1 := cluster.AddMember(nil).(*Service)
371+
s2 := cluster.AddMember(nil).(*Service)
372+
defer cluster.Shutdown()
373+
374+
ctx := context.Background()
375+
dm1, err := s1.NewDMap("mydmap")
376+
require.NoError(t, err)
377+
378+
pc := &PutConfig{
379+
HasPX: true,
380+
PX: time.Minute,
381+
HasNX: true,
382+
}
383+
for i := range 10 {
384+
err = dm1.Put(ctx, testutil.ToKey(i), testutil.ToVal(i), pc)
385+
require.NoError(t, err)
386+
}
387+
388+
<-time.After(10 * time.Millisecond)
389+
390+
dm2, err := s2.NewDMap("mydmap")
391+
require.NoError(t, err)
392+
393+
for i := range 10 {
394+
gr, err := dm2.Get(ctx, testutil.ToKey(i))
395+
require.NoError(t, err)
396+
assert.NotZero(t, gr.TTL())
397+
}
398+
}

0 commit comments

Comments
 (0)