@@ -2,9 +2,13 @@ package adapter
22
33import (
44 "context"
5+ "math"
6+ "strconv"
57 "testing"
68
9+ "github.com/bootjp/elastickv/store"
710 "github.com/redis/go-redis/v9"
11+ "github.com/stretchr/testify/assert"
812 "github.com/stretchr/testify/require"
913)
1014
@@ -90,3 +94,103 @@ func TestRedis_DiscardClearsTxn(t *testing.T) {
9094 require .NoError (t , err )
9195 require .Equal (t , "before" , got )
9296}
97+
98+ func TestRedis_DelList_RemovesLargeListAndInternalKeys (t * testing.T ) {
99+ t .Parallel ()
100+ nodes , _ , _ := createNode (t , 3 )
101+ defer shutdown (nodes )
102+
103+ rdb := redis .NewClient (& redis.Options {Addr : nodes [0 ].redisAddress })
104+ ctx := context .Background ()
105+
106+ args := make ([]interface {}, 0 , 1302 )
107+ args = append (args , "RPUSH" , "list-big-del" )
108+ for i := 0 ; i < 1300 ; i ++ {
109+ args = append (args , "v" + strconv .Itoa (i ))
110+ }
111+ _ , err := rdb .Do (ctx , args ... ).Result ()
112+ require .NoError (t , err )
113+
114+ delCount , err := rdb .Del (ctx , "list-big-del" ).Result ()
115+ require .NoError (t , err )
116+ require .Equal (t , int64 (1 ), delCount )
117+
118+ rangeRes , err := rdb .Do (ctx , "LRANGE" , "list-big-del" , 0 , - 1 ).Result ()
119+ require .NoError (t , err )
120+ require .Equal (t , []interface {}{}, rangeRes )
121+
122+ readTS := nodes [0 ].redisServer .readTS ()
123+ _ , err = nodes [0 ].redisServer .store .GetAt (ctx , store .ListMetaKey ([]byte ("list-big-del" )), readTS )
124+ require .ErrorIs (t , err , store .ErrKeyNotFound )
125+
126+ kvs , err := nodes [0 ].redisServer .store .ScanAt (
127+ ctx ,
128+ store .ListItemKey ([]byte ("list-big-del" ), math .MinInt64 ),
129+ store .ListItemKey ([]byte ("list-big-del" ), math .MaxInt64 ),
130+ 1 ,
131+ readTS ,
132+ )
133+ require .NoError (t , err )
134+ assert .Len (t , kvs , 0 )
135+ }
136+
137+ func TestRedis_DelList_EmptyAfterDeleteHasNoResidualInternalKeys (t * testing.T ) {
138+ t .Parallel ()
139+ nodes , _ , _ := createNode (t , 3 )
140+ defer shutdown (nodes )
141+
142+ rdb := redis .NewClient (& redis.Options {Addr : nodes [0 ].redisAddress })
143+ ctx := context .Background ()
144+
145+ _ , err := rdb .Do (ctx , "RPUSH" , "list-empty-del" , "a" ).Result ()
146+ require .NoError (t , err )
147+
148+ _ , err = rdb .Del (ctx , "list-empty-del" ).Result ()
149+ require .NoError (t , err )
150+
151+ // Second DEL should be a no-op for list internals.
152+ _ , err = rdb .Del (ctx , "list-empty-del" ).Result ()
153+ require .NoError (t , err )
154+
155+ readTS := nodes [0 ].redisServer .readTS ()
156+ _ , err = nodes [0 ].redisServer .store .GetAt (ctx , store .ListMetaKey ([]byte ("list-empty-del" )), readTS )
157+ require .ErrorIs (t , err , store .ErrKeyNotFound )
158+
159+ kvs , err := nodes [0 ].redisServer .store .ScanAt (
160+ ctx ,
161+ store .ListItemKey ([]byte ("list-empty-del" ), math .MinInt64 ),
162+ store .ListItemKey ([]byte ("list-empty-del" ), math .MaxInt64 ),
163+ 1 ,
164+ readTS ,
165+ )
166+ require .NoError (t , err )
167+ assert .Len (t , kvs , 0 )
168+ }
169+
170+ func TestRedis_MultiExec_DelThenRPushRecreatesList (t * testing.T ) {
171+ t .Parallel ()
172+ nodes , _ , _ := createNode (t , 3 )
173+ defer shutdown (nodes )
174+
175+ rdb := redis .NewClient (& redis.Options {Addr : nodes [1 ].redisAddress })
176+ ctx := context .Background ()
177+
178+ _ , err := rdb .Do (ctx , "RPUSH" , "list-del-rpush" , "old1" , "old2" ).Result ()
179+ require .NoError (t , err )
180+
181+ require .Equal (t , "OK" , rdb .Do (ctx , "MULTI" ).Val ())
182+ require .Equal (t , "QUEUED" , rdb .Do (ctx , "DEL" , "list-del-rpush" ).Val ())
183+ require .Equal (t , "QUEUED" , rdb .Do (ctx , "RPUSH" , "list-del-rpush" , "new1" , "new2" ).Val ())
184+
185+ execRes , err := rdb .Do (ctx , "EXEC" ).Result ()
186+ require .NoError (t , err )
187+ vals , ok := execRes .([]interface {})
188+ require .True (t , ok )
189+ require .Len (t , vals , 2 )
190+ require .Equal (t , int64 (1 ), vals [0 ])
191+ require .Equal (t , int64 (2 ), vals [1 ])
192+
193+ rangeRes , err := rdb .Do (ctx , "LRANGE" , "list-del-rpush" , 0 , - 1 ).Result ()
194+ require .NoError (t , err )
195+ require .Equal (t , []interface {}{"new1" , "new2" }, rangeRes )
196+ }
0 commit comments