• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

leonchen83 / redis-replicator / #2074

09 Dec 2023 02:37AM UTC coverage: 71.561%. Remained the same
#2074

push

Baoyi Chen
test

3 of 3 new or added lines in 2 files covered. (100.0%)

140 existing lines in 4 files now uncovered.

6628 of 9262 relevant lines covered (71.56%)

0.72 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.84
/src/main/java/com/moilioncircle/redis/replicator/rdb/DefaultRdbVisitor.java
1
/*
2
 * Copyright 2016-2018 Leon Chen
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 *     http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16

17
package com.moilioncircle.redis.replicator.rdb;
18

19
import static com.moilioncircle.redis.replicator.Constants.RDB_OPCODE_FREQ;
20
import static com.moilioncircle.redis.replicator.Constants.RDB_OPCODE_IDLE;
21
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_HASH;
22
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_HASH_LISTPACK;
23
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_HASH_ZIPLIST;
24
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_HASH_ZIPMAP;
25
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_LIST;
26
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_LIST_QUICKLIST;
27
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_LIST_QUICKLIST_2;
28
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_LIST_ZIPLIST;
29
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_MODULE;
30
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_MODULE_2;
31
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_SET;
32
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_SET_INTSET;
33
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_SET_LISTPACK;
34
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_STREAM_LISTPACKS;
35
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_STREAM_LISTPACKS_2;
36
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_STREAM_LISTPACKS_3;
37
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_STRING;
38
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_ZSET;
39
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_ZSET_2;
40
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_ZSET_LISTPACK;
41
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_ZSET_ZIPLIST;
42
import static java.lang.Integer.parseInt;
43

44
import java.io.IOException;
45
import java.util.List;
46
import java.util.Map;
47
import java.util.Set;
48

49
import org.slf4j.Logger;
50
import org.slf4j.LoggerFactory;
51

52
import com.moilioncircle.redis.replicator.Replicator;
53
import com.moilioncircle.redis.replicator.event.Event;
54
import com.moilioncircle.redis.replicator.io.RedisInputStream;
55
import com.moilioncircle.redis.replicator.rdb.datatype.AuxField;
56
import com.moilioncircle.redis.replicator.rdb.datatype.ContextKeyValuePair;
57
import com.moilioncircle.redis.replicator.rdb.datatype.DB;
58
import com.moilioncircle.redis.replicator.rdb.datatype.EvictType;
59
import com.moilioncircle.redis.replicator.rdb.datatype.ExpiredType;
60
import com.moilioncircle.redis.replicator.rdb.datatype.KeyStringValueHash;
61
import com.moilioncircle.redis.replicator.rdb.datatype.KeyStringValueList;
62
import com.moilioncircle.redis.replicator.rdb.datatype.KeyStringValueModule;
63
import com.moilioncircle.redis.replicator.rdb.datatype.KeyStringValueSet;
64
import com.moilioncircle.redis.replicator.rdb.datatype.KeyStringValueStream;
65
import com.moilioncircle.redis.replicator.rdb.datatype.KeyStringValueString;
66
import com.moilioncircle.redis.replicator.rdb.datatype.KeyStringValueZSet;
67
import com.moilioncircle.redis.replicator.rdb.datatype.KeyValuePair;
68
import com.moilioncircle.redis.replicator.rdb.datatype.Module;
69
import com.moilioncircle.redis.replicator.rdb.datatype.Stream;
70
import com.moilioncircle.redis.replicator.rdb.datatype.ZSetEntry;
71
import com.moilioncircle.redis.replicator.rdb.module.ModuleParser;
72
import com.moilioncircle.redis.replicator.rdb.skip.SkipRdbParser;
73
import com.moilioncircle.redis.replicator.util.ByteArrayMap;
74
import com.moilioncircle.redis.replicator.util.Strings;
75

76
/**
77
 * @author Leon Chen
78
 * @since 2.1.0
79
 */
80
public class DefaultRdbVisitor extends RdbVisitor {
81

82
    protected static final Logger logger = LoggerFactory.getLogger(DefaultRdbVisitor.class);
1✔
83

84
    protected final Replicator replicator;
85
    protected final RdbValueVisitor valueVisitor;
86

87
    public DefaultRdbVisitor(Replicator replicator) {
88
        this(replicator, new DefaultRdbValueVisitor(replicator));
1✔
89
    }
1✔
90

91
    public DefaultRdbVisitor(Replicator replicator, RdbValueVisitor valueVisitor) {
1✔
92
        this.replicator = replicator;
1✔
93
        this.valueVisitor = valueVisitor;
1✔
94
    }
1✔
95

96
    @Override
97
    public String applyMagic(RedisInputStream in) throws IOException {
98
        String magic = BaseRdbParser.StringHelper.str(in, 5);//REDIS
1✔
99
        if (!magic.equals("REDIS")) {
1✔
UNCOV
100
            throw new UnsupportedOperationException("can't read MAGIC STRING [REDIS] ,value:" + magic);
×
101
        }
102
        return magic;
1✔
103
    }
104

105
    @Override
106
    public int applyVersion(RedisInputStream in) throws IOException {
107
        int version = parseInt(BaseRdbParser.StringHelper.str(in, 4));
1✔
108
        if (version < 2 || version > 11) {
1✔
UNCOV
109
            throw new UnsupportedOperationException(String.valueOf("can't handle RDB format version " + version));
×
110
        }
111
        return version;
1✔
112
    }
113

114
    @Override
115
    public int applyType(RedisInputStream in) throws IOException {
116
        return in.read();
1✔
117
    }
118
    
119
    @Override
120
    public Event applyFunction(RedisInputStream in, int version) throws IOException {
121
        return valueVisitor.applyFunction(in, version);
1✔
122
    }
123
    
124
    @Override
125
    public Event applyFunction2(RedisInputStream in, int version) throws IOException {
126
        return valueVisitor.applyFunction2(in, version);
1✔
127
    }
128

129
    @Override
130
    public DB applySelectDB(RedisInputStream in, int version) throws IOException {
131
        /*
132
         * ----------------------------
133
         * FE $length-encoding         # Previous db ends, next db starts. Database number read using length encoding.
134
         * ----------------------------
135
         */
136
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
137
        long dbNumber = parser.rdbLoadLen().len;
1✔
138
        return new DB(dbNumber);
1✔
139
    }
140

141
    @Override
142
    public DB applyResizeDB(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
143
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
144
        long dbsize = parser.rdbLoadLen().len;
1✔
145
        long expiresSize = parser.rdbLoadLen().len;
1✔
146
        DB db = context.getDb();
1✔
147
        if (db != null) db.setDbsize(dbsize);
1✔
148
        if (db != null) db.setExpires(expiresSize);
1✔
149
        return db;
1✔
150
    }
151

152
    @Override
153
    public Event applyAux(RedisInputStream in, int version) throws IOException {
154
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
155
        String auxKey = Strings.toString(parser.rdbLoadEncodedStringObject().first());
1✔
156
        String auxValue = Strings.toString(parser.rdbLoadEncodedStringObject().first());
1✔
157
        if (!auxKey.startsWith("%")) {
1✔
158
            if (logger.isInfoEnabled()) {
1✔
159
                logger.info("RDB {}: {}", auxKey, auxValue);
1✔
160
            }
161
            
162
            // avoid set repl_offset too early.
163
            // if (auxKey.equals("repl-id")) replicator.getConfiguration().setReplId(auxValue);
164
            // if (auxKey.equals("repl-offset")) replicator.getConfiguration().setReplOffset(parseLong(auxValue));
165
            if (auxKey.equals("repl-stream-db")) replicator.getConfiguration().setReplStreamDB(parseInt(auxValue));
1✔
166
            return new AuxField(auxKey, auxValue);
1✔
167
        } else {
UNCOV
168
            if (logger.isWarnEnabled()) {
×
UNCOV
169
                logger.warn("unrecognized RDB AUX field: {}, value: {}", auxKey, auxValue);
×
170
            }
UNCOV
171
            return null;
×
172
        }
173
    }
174

175
    @Override
176
    public Event applyModuleAux(RedisInputStream in, int version) throws IOException {
UNCOV
177
        SkipRdbParser parser = new SkipRdbParser(in);
×
UNCOV
178
        parser.rdbLoadLen();
×
UNCOV
179
        parser.rdbLoadCheckModuleValue();
×
UNCOV
180
        return null;
×
181
    }
182

183
    @Override
184
    public long applyEof(RedisInputStream in, int version) throws IOException {
185
        /*
186
         * ----------------------------
187
         * ...                         # Key value pairs for this database, additonal database
188
         * FF                          ## End of RDB file indicator
189
         * 8 byte checksum             ## CRC 64 checksum of the entire file.
190
         * ----------------------------
191
         */
192
        if (version >= 5) return in.readLong(8);
1✔
193
        return 0L;
1✔
194
    }
195

196
    @Override
197
    public Event applyExpireTime(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
198
        /*
199
         * ----------------------------
200
         * FD $unsigned int            # FD indicates "expiry time in seconds". After that, expiry time is read as a 4 byte unsigned int
201
         * $value-type                 # 1 byte flag indicating the type of value - set, map, sorted set etc.
202
         * $string-encoded-name         # The name, encoded as a redis string
203
         * $encoded-value              # The value. Encoding depends on $value-type
204
         * ----------------------------
205
         */
206
        BaseRdbParser parser = new BaseRdbParser(in);
×
UNCOV
207
        long expiredSec = parser.rdbLoadTime();
×
208
        int type = applyType(in);
×
209
        context.setExpiredType(ExpiredType.SECOND);
×
210
        context.setExpiredValue(expiredSec);
×
211
        context.setValueRdbType(type);
×
212
        KeyValuePair<?, ?> kv;
213
        if (type == RDB_OPCODE_FREQ) {
×
UNCOV
214
            kv = (KeyValuePair<?, ?>) applyFreq(in, version, context);
×
215
        } else if (type == RDB_OPCODE_IDLE) {
×
UNCOV
216
            kv = (KeyValuePair<?, ?>) applyIdle(in, version, context);
×
217
        } else {
UNCOV
218
            kv = rdbLoadObject(in, version, context);
×
219
        }
UNCOV
220
        return kv;
×
221
    }
222

223
    @Override
224
    public Event applyExpireTimeMs(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
225
        /*
226
         * ----------------------------
227
         * FC $unsigned long           # FC indicates "expiry time in ms". After that, expiry time is read as a 8 byte unsigned long
228
         * $value-type                 # 1 byte flag indicating the type of value - set, map, sorted set etc.
229
         * $string-encoded-name         # The name, encoded as a redis string
230
         * $encoded-value              # The value. Encoding depends on $value-type
231
         * ----------------------------
232
         */
233
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
234
        long expiredMs = parser.rdbLoadMillisecondTime();
1✔
235
        int type = applyType(in);
1✔
236
        context.setExpiredType(ExpiredType.MS);
1✔
237
        context.setExpiredValue(expiredMs);
1✔
238
        context.setValueRdbType(type);
1✔
239
        KeyValuePair<?, ?> kv;
240
        if (type == RDB_OPCODE_FREQ) {
1✔
241
            kv = (KeyValuePair<?, ?>) applyFreq(in, version, context);
1✔
242
        } else if (type == RDB_OPCODE_IDLE) {
1✔
243
            kv = (KeyValuePair<?, ?>) applyIdle(in, version, context);
1✔
244
        } else {
245
            kv = rdbLoadObject(in, version, context);
1✔
246
        }
247
        return kv;
1✔
248
    }
249

250
    @Override
251
    public Event applyFreq(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
252
        long lfuFreq = in.read();
1✔
253
        int valueType = applyType(in);
1✔
254
        context.setValueRdbType(valueType);
1✔
255
        context.setEvictType(EvictType.LFU);
1✔
256
        context.setEvictValue(lfuFreq);
1✔
257
        KeyValuePair<?, ?> kv = rdbLoadObject(in, version, context);
1✔
258
        return kv;
1✔
259
    }
260

261
    @Override
262
    public Event applyIdle(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
263
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
264
        long lruIdle = parser.rdbLoadLen().len;
1✔
265
        int valueType = applyType(in);
1✔
266
        context.setValueRdbType(valueType);
1✔
267
        context.setEvictType(EvictType.LRU);
1✔
268
        context.setEvictValue(lruIdle);
1✔
269
        KeyValuePair<?, ?> kv = rdbLoadObject(in, version, context);
1✔
270
        return kv;
1✔
271
    }
272

273
    @Override
274
    public Event applyString(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
275
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
276
        KeyValuePair<byte[], byte[]> o0 = new KeyStringValueString();
1✔
277
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
278

279
        byte[] val = valueVisitor.applyString(in, version);
1✔
280
        o0.setValueRdbType(RDB_TYPE_STRING);
1✔
281
        o0.setValue(val);
1✔
282
        o0.setKey(key);
1✔
283
        return context.valueOf(o0);
1✔
284
    }
285

286
    @Override
287
    public Event applyList(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
288
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
289
        KeyValuePair<byte[], List<byte[]>> o1 = new KeyStringValueList();
1✔
290
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
291

292
        List<byte[]> list = valueVisitor.applyList(in, version);
1✔
293
        o1.setValueRdbType(RDB_TYPE_LIST);
1✔
294
        o1.setValue(list);
1✔
295
        o1.setKey(key);
1✔
296
        return context.valueOf(o1);
1✔
297
    }
298

299
    @Override
300
    public Event applySet(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
301
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
302
        KeyValuePair<byte[], Set<byte[]>> o2 = new KeyStringValueSet();
1✔
303
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
304

305
        Set<byte[]> set = valueVisitor.applySet(in, version);
1✔
306
        o2.setValueRdbType(RDB_TYPE_SET);
1✔
307
        o2.setValue(set);
1✔
308
        o2.setKey(key);
1✔
309
        return context.valueOf(o2);
1✔
310
    }
311
    
312
    @Override
313
    public Event applySetListPack(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
314
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
315
        KeyValuePair<byte[], Set<byte[]>> o20 = new KeyStringValueSet();
1✔
316
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
317
        
318
        Set<byte[]> set = valueVisitor.applySetListPack(in, version);
1✔
319
        o20.setValueRdbType(RDB_TYPE_SET_LISTPACK);
1✔
320
        o20.setValue(set);
1✔
321
        o20.setKey(key);
1✔
322
        return context.valueOf(o20);
1✔
323
    }
324

325
    @Override
326
    public Event applyZSet(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
327
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
328
        KeyValuePair<byte[], Set<ZSetEntry>> o3 = new KeyStringValueZSet();
1✔
329
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
330

331
        Set<ZSetEntry> zset = valueVisitor.applyZSet(in, version);
1✔
332
        o3.setValueRdbType(RDB_TYPE_ZSET);
1✔
333
        o3.setValue(zset);
1✔
334
        o3.setKey(key);
1✔
335
        return context.valueOf(o3);
1✔
336
    }
337

338
    @Override
339
    public Event applyZSet2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
340
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
341
        KeyValuePair<byte[], Set<ZSetEntry>> o5 = new KeyStringValueZSet();
1✔
342
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
343

344
        Set<ZSetEntry> zset = valueVisitor.applyZSet2(in, version);
1✔
345
        o5.setValueRdbType(RDB_TYPE_ZSET_2);
1✔
346
        o5.setValue(zset);
1✔
347
        o5.setKey(key);
1✔
348
        return context.valueOf(o5);
1✔
349
    }
350

351
    @Override
352
    public Event applyHash(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
353
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
354
        KeyValuePair<byte[], Map<byte[], byte[]>> o4 = new KeyStringValueHash();
1✔
355
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
356

357
        ByteArrayMap map = valueVisitor.applyHash(in, version);
1✔
358
        o4.setValueRdbType(RDB_TYPE_HASH);
1✔
359
        o4.setValue(map);
1✔
360
        o4.setKey(key);
1✔
361
        return context.valueOf(o4);
1✔
362
    }
363

364
    @Override
365
    public Event applyHashZipMap(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
366
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
367
        KeyValuePair<byte[], Map<byte[], byte[]>> o9 = new KeyStringValueHash();
1✔
368
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
369

370
        ByteArrayMap map = valueVisitor.applyHashZipMap(in, version);
1✔
371
        o9.setValueRdbType(RDB_TYPE_HASH_ZIPMAP);
1✔
372
        o9.setValue(map);
1✔
373
        o9.setKey(key);
1✔
374
        return context.valueOf(o9);
1✔
375
    }
376

377
    @Override
378
    public Event applyListZipList(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
379
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
380
        KeyValuePair<byte[], List<byte[]>> o10 = new KeyStringValueList();
1✔
381
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
382

383
        List<byte[]> list = valueVisitor.applyListZipList(in, version);
1✔
384
        o10.setValueRdbType(RDB_TYPE_LIST_ZIPLIST);
1✔
385
        o10.setValue(list);
1✔
386
        o10.setKey(key);
1✔
387
        return context.valueOf(o10);
1✔
388
    }
389

390
    @Override
391
    public Event applySetIntSet(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
392
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
393
        KeyValuePair<byte[], Set<byte[]>> o11 = new KeyStringValueSet();
1✔
394
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
395

396
        Set<byte[]> set = valueVisitor.applySetIntSet(in, version);
1✔
397
        o11.setValueRdbType(RDB_TYPE_SET_INTSET);
1✔
398
        o11.setValue(set);
1✔
399
        o11.setKey(key);
1✔
400
        return context.valueOf(o11);
1✔
401
    }
402

403
    @Override
404
    public Event applyZSetZipList(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
405
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
406
        KeyValuePair<byte[], Set<ZSetEntry>> o12 = new KeyStringValueZSet();
1✔
407
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
408

409
        Set<ZSetEntry> zset = valueVisitor.applyZSetZipList(in, version);
1✔
410
        o12.setValueRdbType(RDB_TYPE_ZSET_ZIPLIST);
1✔
411
        o12.setValue(zset);
1✔
412
        o12.setKey(key);
1✔
413
        return context.valueOf(o12);
1✔
414
    }
415
    
416
    @Override
417
    public Event applyZSetListPack(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
418
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
419
        KeyValuePair<byte[], Set<ZSetEntry>> o17 = new KeyStringValueZSet();
1✔
420
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
421
    
422
        Set<ZSetEntry> zset = valueVisitor.applyZSetListPack(in, version);
1✔
423
        o17.setValueRdbType(RDB_TYPE_ZSET_LISTPACK);
1✔
424
        o17.setValue(zset);
1✔
425
        o17.setKey(key);
1✔
426
        return context.valueOf(o17);
1✔
427
    }
428

429
    @Override
430
    public Event applyHashZipList(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
431
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
432
        KeyValuePair<byte[], Map<byte[], byte[]>> o13 = new KeyStringValueHash();
1✔
433
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
434

435
        ByteArrayMap map = valueVisitor.applyHashZipList(in, version);
1✔
436
        o13.setValueRdbType(RDB_TYPE_HASH_ZIPLIST);
1✔
437
        o13.setValue(map);
1✔
438
        o13.setKey(key);
1✔
439
        return context.valueOf(o13);
1✔
440
    }
441
    
442
    @Override
443
    public Event applyHashListPack(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
444
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
445
        KeyValuePair<byte[], Map<byte[], byte[]>> o16 = new KeyStringValueHash();
1✔
446
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
447
        
448
        ByteArrayMap map = valueVisitor.applyHashListPack(in, version);
1✔
449
        o16.setValueRdbType(RDB_TYPE_HASH_LISTPACK);
1✔
450
        o16.setValue(map);
1✔
451
        o16.setKey(key);
1✔
452
        return context.valueOf(o16);
1✔
453
    }
454

455
    @Override
456
    public Event applyListQuickList(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
457
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
458
        KeyValuePair<byte[], List<byte[]>> o14 = new KeyStringValueList();
1✔
459
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
460

461
        List<byte[]> list = valueVisitor.applyListQuickList(in, version);
1✔
462
        o14.setValueRdbType(RDB_TYPE_LIST_QUICKLIST);
1✔
463
        o14.setValue(list);
1✔
464
        o14.setKey(key);
1✔
465
        return context.valueOf(o14);
1✔
466
    }
467
    
468
    @Override
469
    public Event applyListQuickList2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
470
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
471
        KeyValuePair<byte[], List<byte[]>> o18 = new KeyStringValueList();
1✔
472
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
473
        
474
        List<byte[]> list = valueVisitor.applyListQuickList2(in, version);
1✔
475
        o18.setValueRdbType(RDB_TYPE_LIST_QUICKLIST_2);
1✔
476
        o18.setValue(list);
1✔
477
        o18.setKey(key);
1✔
478
        return context.valueOf(o18);
1✔
479
    }
480
    
481
    @Override
482
    public Event applyModule(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
483
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
484
        KeyValuePair<byte[], Module> o6 = new KeyStringValueModule();
1✔
485
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
486

487
        Module module = valueVisitor.applyModule(in, version);
1✔
488
        o6.setValueRdbType(RDB_TYPE_MODULE);
1✔
489
        o6.setValue(module);
1✔
490
        o6.setKey(key);
1✔
491
        return context.valueOf(o6);
1✔
492
    }
493

494
    @Override
495
    public Event applyModule2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
496
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
497
        KeyValuePair<byte[], Module> o7 = new KeyStringValueModule();
1✔
498
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
499

500
        Module module = valueVisitor.applyModule2(in, version);
1✔
501
        o7.setValueRdbType(RDB_TYPE_MODULE_2);
1✔
502
        o7.setValue(module);
1✔
503
        o7.setKey(key);
1✔
504
        return context.valueOf(o7);
1✔
505
    }
506

507
    @Override
508
    @SuppressWarnings("resource")
509
    public Event applyStreamListPacks(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
510
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
511
        KeyValuePair<byte[], Stream> o15 = new KeyStringValueStream();
1✔
512
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
513

514
        Stream stream = valueVisitor.applyStreamListPacks(in, version);
1✔
515
        o15.setValueRdbType(RDB_TYPE_STREAM_LISTPACKS);
1✔
516
        o15.setValue(stream);
1✔
517
        o15.setKey(key);
1✔
518
        return context.valueOf(o15);
1✔
519
    }
520
    
521
    @Override
522
    @SuppressWarnings("resource")
523
    public Event applyStreamListPacks2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
524
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
525
        KeyValuePair<byte[], Stream> o19 = new KeyStringValueStream();
1✔
526
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
527
        
528
        Stream stream = valueVisitor.applyStreamListPacks2(in, version);
1✔
529
        o19.setValueRdbType(RDB_TYPE_STREAM_LISTPACKS_2);
1✔
530
        o19.setValue(stream);
1✔
531
        o19.setKey(key);
1✔
532
        return context.valueOf(o19);
1✔
533
    }
534
    
535
    @Override
536
    @SuppressWarnings("resource")
537
    public Event applyStreamListPacks3(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
538
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
539
        KeyValuePair<byte[], Stream> o21 = new KeyStringValueStream();
1✔
540
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
541
        
542
        Stream stream = valueVisitor.applyStreamListPacks3(in, version);
1✔
543
        o21.setValueRdbType(RDB_TYPE_STREAM_LISTPACKS_3);
1✔
544
        o21.setValue(stream);
1✔
545
        o21.setKey(key);
1✔
546
        return context.valueOf(o21);
1✔
547
    }
548

549
    protected ModuleParser<? extends Module> lookupModuleParser(String moduleName, int moduleVersion) {
UNCOV
550
        return replicator.getModuleParser(moduleName, moduleVersion);
×
551
    }
552

553
    protected KeyValuePair<?, ?> rdbLoadObject(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
554
        /*
555
         * ----------------------------
556
         * $value-type                 # This name value pair doesn't have an expiry. $value_type guaranteed != to FD, FC, FE and FF
557
         * $string-encoded-name
558
         * $encoded-value
559
         * ----------------------------
560
         */
561
        int valueType = context.getValueRdbType();
1✔
562
        switch (valueType) {
1✔
563
            case RDB_TYPE_STRING:
564
                return (KeyValuePair<?, ?>) applyString(in, version, context);
1✔
565
            case RDB_TYPE_LIST:
UNCOV
566
                return (KeyValuePair<?, ?>) applyList(in, version, context);
×
567
            case RDB_TYPE_SET:
UNCOV
568
                return (KeyValuePair<?, ?>) applySet(in, version, context);
×
569
            case RDB_TYPE_SET_LISTPACK:
UNCOV
570
                return (KeyValuePair<?, ?>) applySetListPack(in, version, context);
×
571
            case RDB_TYPE_ZSET:
UNCOV
572
                return (KeyValuePair<?, ?>) applyZSet(in, version, context);
×
573
            case RDB_TYPE_ZSET_2:
UNCOV
574
                return (KeyValuePair<?, ?>) applyZSet2(in, version, context);
×
575
            case RDB_TYPE_HASH:
UNCOV
576
                return (KeyValuePair<?, ?>) applyHash(in, version, context);
×
577
            case RDB_TYPE_HASH_ZIPMAP:
UNCOV
578
                return (KeyValuePair<?, ?>) applyHashZipMap(in, version, context);
×
579
            case RDB_TYPE_LIST_ZIPLIST:
UNCOV
580
                return (KeyValuePair<?, ?>) applyListZipList(in, version, context);
×
581
            case RDB_TYPE_SET_INTSET:
UNCOV
582
                return (KeyValuePair<?, ?>) applySetIntSet(in, version, context);
×
583
            case RDB_TYPE_ZSET_ZIPLIST:
UNCOV
584
                return (KeyValuePair<?, ?>) applyZSetZipList(in, version, context);
×
585
            case RDB_TYPE_ZSET_LISTPACK:
UNCOV
586
                return (KeyValuePair<?, ?>) applyZSetListPack(in, version, context);
×
587
            case RDB_TYPE_HASH_ZIPLIST:
UNCOV
588
                return (KeyValuePair<?, ?>) applyHashZipList(in, version, context);
×
589
            case RDB_TYPE_HASH_LISTPACK:
UNCOV
590
                return (KeyValuePair<?, ?>) applyHashListPack(in, version, context);
×
591
            case RDB_TYPE_LIST_QUICKLIST:
UNCOV
592
                return (KeyValuePair<?, ?>) applyListQuickList(in, version, context);
×
593
            case RDB_TYPE_LIST_QUICKLIST_2:
UNCOV
594
                return (KeyValuePair<?, ?>) applyListQuickList2(in, version, context);
×
595
            case RDB_TYPE_MODULE:
UNCOV
596
                return (KeyValuePair<?, ?>) applyModule(in, version, context);
×
597
            case RDB_TYPE_MODULE_2:
598
                return (KeyValuePair<?, ?>) applyModule2(in, version, context);
1✔
599
            case RDB_TYPE_STREAM_LISTPACKS:
UNCOV
600
                return (KeyValuePair<?, ?>) applyStreamListPacks(in, version, context);
×
601
            case RDB_TYPE_STREAM_LISTPACKS_2:
UNCOV
602
                return (KeyValuePair<?, ?>) applyStreamListPacks2(in, version, context);
×
603
            case RDB_TYPE_STREAM_LISTPACKS_3:
UNCOV
604
                return (KeyValuePair<?, ?>) applyStreamListPacks3(in, version, context);
×
605
            default:
UNCOV
606
                throw new AssertionError("unexpected value type:" + valueType);
×
607
        }
608
    }
609
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc