diff --git a/embedded_client_test.go b/embedded_client_test.go index e5b1aa6d..fd7d8f58 100644 --- a/embedded_client_test.go +++ b/embedded_client_test.go @@ -21,6 +21,7 @@ import ( "time" "github.com/olric-data/olric/internal/testutil" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" ) @@ -614,3 +615,27 @@ func TestEmbeddedClient_Ping_WithMessage(t *testing.T) { require.NoError(t, err) require.Equal(t, message, response) } + +func TestEmbeddedClient_DMap_Put_PX_With_NX(t *testing.T) { + cluster := newTestOlricCluster(t) + db0 := cluster.addMember(t) + db1 := cluster.addMember(t) + + ctx := context.Background() + e := db0.NewEmbeddedClient() + dm0, err := e.NewDMap("mydmap") + require.NoError(t, err) + + err = dm0.Put(ctx, "mykey", "myvalue", PX(time.Minute), NX()) + require.NoError(t, err) + + <-time.After(time.Millisecond) + + e = db1.NewEmbeddedClient() + dm1, err := e.NewDMap("mydmap") + require.NoError(t, err) + + gr, err := dm1.Get(ctx, "mykey") + require.NoError(t, err) + assert.NotZero(t, gr.TTL()) +} diff --git a/internal/dmap/put_handlers.go b/internal/dmap/put_handlers.go index 26367f7f..e80415f0 100644 --- a/internal/dmap/put_handlers.go +++ b/internal/dmap/put_handlers.go @@ -40,6 +40,9 @@ func (s *Service) putCommandHandler(conn redcon.Conn, cmd redcon.Command) { pc.HasNX = true case putCmd.XX: pc.HasXX = true + } + + switch { case putCmd.EX != 0: pc.HasEX = true pc.EX = time.Duration(putCmd.EX * float64(time.Second)) diff --git a/internal/dmap/put_test.go b/internal/dmap/put_test.go index 3c50f2ae..f8506622 100644 --- a/internal/dmap/put_test.go +++ b/internal/dmap/put_test.go @@ -26,6 +26,7 @@ import ( "github.com/olric-data/olric/internal/cluster/partitions" "github.com/olric-data/olric/internal/testcluster" "github.com/olric-data/olric/internal/testutil" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -363,3 +364,35 @@ func TestDMap_Put_ErrEntryTooLarge(t *testing.T) { err = dm.Put(ctx, "key", data, nil) require.ErrorIs(t, err, ErrEntryTooLarge) } + +func TestDMap_Put_PX_With_NX(t *testing.T) { + cluster := testcluster.New(NewService) + s1 := cluster.AddMember(nil).(*Service) + s2 := cluster.AddMember(nil).(*Service) + defer cluster.Shutdown() + + ctx := context.Background() + dm1, err := s1.NewDMap("mydmap") + require.NoError(t, err) + + pc := &PutConfig{ + HasPX: true, + PX: time.Minute, + HasNX: true, + } + for i := range 10 { + err = dm1.Put(ctx, testutil.ToKey(i), testutil.ToVal(i), pc) + require.NoError(t, err) + } + + <-time.After(10 * time.Millisecond) + + dm2, err := s2.NewDMap("mydmap") + require.NoError(t, err) + + for i := range 10 { + gr, err := dm2.Get(ctx, testutil.ToKey(i)) + require.NoError(t, err) + assert.NotZero(t, gr.TTL()) + } +}