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

leonchen83 / redis-replicator / #2187

07 Jun 2025 09:11AM UTC coverage: 69.535% (-0.5%) from 69.989%
#2187

push

leonchen83
redis-8.0

1 of 123 new or added lines in 13 files covered. (0.81%)

1 existing line in 1 file now uncovered.

6642 of 9552 relevant lines covered (69.54%)

0.7 hits per line

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

78.33
/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_LISTPACK_EX;
24
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_HASH_METADATA;
25
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_HASH_ZIPLIST;
26
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_HASH_ZIPMAP;
27
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_LIST;
28
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_LIST_QUICKLIST;
29
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_LIST_QUICKLIST_2;
30
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_LIST_ZIPLIST;
31
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_MODULE;
32
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_MODULE_2;
33
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_SET;
34
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_SET_INTSET;
35
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_SET_LISTPACK;
36
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_STREAM_LISTPACKS;
37
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_STREAM_LISTPACKS_2;
38
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_STREAM_LISTPACKS_3;
39
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_STRING;
40
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_ZSET;
41
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_ZSET_2;
42
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_ZSET_LISTPACK;
43
import static com.moilioncircle.redis.replicator.Constants.RDB_TYPE_ZSET_ZIPLIST;
44
import static com.moilioncircle.redis.replicator.Constants.RDB_VERSION;
45
import static java.lang.Integer.parseInt;
46

47
import java.io.IOException;
48
import java.util.List;
49
import java.util.Map;
50
import java.util.Set;
51

52
import org.slf4j.Logger;
53
import org.slf4j.LoggerFactory;
54

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

83
/**
84
 * @author Leon Chen
85
 * @since 2.1.0
86
 */
87
public class DefaultRdbVisitor extends RdbVisitor {
88

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

91
    protected final Replicator replicator;
92
    protected final RdbValueVisitor valueVisitor;
93

94
    public DefaultRdbVisitor(Replicator replicator) {
95
        this(replicator, new DefaultRdbValueVisitor(replicator));
1✔
96
    }
1✔
97

98
    public DefaultRdbVisitor(Replicator replicator, RdbValueVisitor valueVisitor) {
1✔
99
        this.replicator = replicator;
1✔
100
        this.valueVisitor = valueVisitor;
1✔
101
    }
1✔
102

103
    @Override
104
    public String applyMagic(RedisInputStream in) throws IOException {
105
        String magic = BaseRdbParser.StringHelper.str(in, 5);//REDIS
1✔
106
        if (!magic.equals("REDIS")) {
1✔
107
            throw new UnsupportedOperationException("can't read MAGIC STRING [REDIS] ,value:" + magic);
×
108
        }
109
        return magic;
1✔
110
    }
111

112
    @Override
113
    public int applyVersion(RedisInputStream in) throws IOException {
114
        int version = parseInt(BaseRdbParser.StringHelper.str(in, 4));
1✔
115
        if (version < 2 || version > RDB_VERSION) {
1✔
116
            throw new UnsupportedOperationException(String.valueOf("can't handle RDB format version " + version));
×
117
        }
118
        return version;
1✔
119
    }
120

121
    @Override
122
    public int applyType(RedisInputStream in) throws IOException {
123
        return in.read();
1✔
124
    }
125
    
126
    @Override
127
    public Event applyFunction(RedisInputStream in, int version) throws IOException {
128
        return valueVisitor.applyFunction(in, version);
1✔
129
    }
130
    
131
    @Override
132
    public Event applyFunction2(RedisInputStream in, int version) throws IOException {
133
        return valueVisitor.applyFunction2(in, version);
1✔
134
    }
135

136
    @Override
137
    public DB applySelectDB(RedisInputStream in, int version) throws IOException {
138
        /*
139
         * ----------------------------
140
         * FE $length-encoding         # Previous db ends, next db starts. Database number read using length encoding.
141
         * ----------------------------
142
         */
143
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
144
        long dbNumber = parser.rdbLoadLen().len;
1✔
145
        return new DB(dbNumber);
1✔
146
    }
147

148
    @Override
149
    public DB applyResizeDB(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
150
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
151
        long dbsize = parser.rdbLoadLen().len;
1✔
152
        long expiresSize = parser.rdbLoadLen().len;
1✔
153
        DB db = context.getDb();
1✔
154
        if (db != null) db.setDbsize(dbsize);
1✔
155
        if (db != null) db.setExpires(expiresSize);
1✔
156
        return db;
1✔
157
    }
158
    
159
    @Override
160
    public Slot applySlotInfo(RedisInputStream in, int version) throws IOException {
161
        BaseRdbParser parser = new BaseRdbParser(in);
×
162
        long slotId = parser.rdbLoadLen().len;
×
163
        long slotSize = parser.rdbLoadLen().len;
×
164
        long expiresSlotSize = parser.rdbLoadLen().len;
×
165
        return new Slot(slotId, slotSize, expiresSlotSize);
×
166
    }
167

168
    @Override
169
    public Event applyAux(RedisInputStream in, int version) throws IOException {
170
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
171
        String auxKey = Strings.toString(parser.rdbLoadEncodedStringObject().first());
1✔
172
        String auxValue = Strings.toString(parser.rdbLoadEncodedStringObject().first());
1✔
173
        if (!auxKey.startsWith("%")) {
1✔
174
            if (logger.isInfoEnabled()) {
1✔
175
                logger.info("RDB {}: {}", auxKey, auxValue);
1✔
176
            }
177
            
178
            // avoid set repl_offset too early.
179
            // if (auxKey.equals("repl-id")) replicator.getConfiguration().setReplId(auxValue);
180
            // if (auxKey.equals("repl-offset")) replicator.getConfiguration().setReplOffset(parseLong(auxValue));
181
            if (auxKey.equals("repl-stream-db")) replicator.getConfiguration().setReplStreamDB(parseInt(auxValue));
1✔
182
            return new AuxField(auxKey, auxValue);
1✔
183
        } else {
184
            if (logger.isWarnEnabled()) {
×
185
                logger.warn("unrecognized RDB AUX field: {}, value: {}", auxKey, auxValue);
×
186
            }
187
            return null;
×
188
        }
189
    }
190

191
    @Override
192
    public Event applyModuleAux(RedisInputStream in, int version) throws IOException {
193
        SkipRdbParser parser = new SkipRdbParser(in);
×
194
        parser.rdbLoadLen();
×
195
        parser.rdbLoadCheckModuleValue();
×
196
        return null;
×
197
    }
198

199
    @Override
200
    public long applyEof(RedisInputStream in, int version) throws IOException {
201
        /*
202
         * ----------------------------
203
         * ...                         # Key value pairs for this database, additonal database
204
         * FF                          ## End of RDB file indicator
205
         * 8 byte checksum             ## CRC 64 checksum of the entire file.
206
         * ----------------------------
207
         */
208
        if (version >= 5) return in.readLong(8);
1✔
209
        return 0L;
1✔
210
    }
211

212
    @Override
213
    public Event applyExpireTime(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
214
        /*
215
         * ----------------------------
216
         * FD $unsigned int            # FD indicates "expiry time in seconds". After that, expiry time is read as a 4 byte unsigned int
217
         * $value-type                 # 1 byte flag indicating the type of value - set, map, sorted set etc.
218
         * $string-encoded-name         # The name, encoded as a redis string
219
         * $encoded-value              # The value. Encoding depends on $value-type
220
         * ----------------------------
221
         */
222
        BaseRdbParser parser = new BaseRdbParser(in);
×
223
        long expiredSec = parser.rdbLoadTime();
×
224
        int type = applyType(in);
×
225
        context.setExpiredType(ExpiredType.SECOND);
×
226
        context.setExpiredValue(expiredSec);
×
227
        context.setValueRdbType(type);
×
228
        KeyValuePair<?, ?> kv;
229
        if (type == RDB_OPCODE_FREQ) {
×
230
            kv = (KeyValuePair<?, ?>) applyFreq(in, version, context);
×
231
        } else if (type == RDB_OPCODE_IDLE) {
×
232
            kv = (KeyValuePair<?, ?>) applyIdle(in, version, context);
×
233
        } else {
234
            kv = rdbLoadObject(in, version, context);
×
235
        }
236
        return kv;
×
237
    }
238

239
    @Override
240
    public Event applyExpireTimeMs(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
241
        /*
242
         * ----------------------------
243
         * FC $unsigned long           # FC indicates "expiry time in ms". After that, expiry time is read as a 8 byte unsigned long
244
         * $value-type                 # 1 byte flag indicating the type of value - set, map, sorted set etc.
245
         * $string-encoded-name         # The name, encoded as a redis string
246
         * $encoded-value              # The value. Encoding depends on $value-type
247
         * ----------------------------
248
         */
249
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
250
        long expiredMs = parser.rdbLoadMillisecondTime();
1✔
251
        int type = applyType(in);
1✔
252
        context.setExpiredType(ExpiredType.MS);
1✔
253
        context.setExpiredValue(expiredMs);
1✔
254
        context.setValueRdbType(type);
1✔
255
        KeyValuePair<?, ?> kv;
256
        if (type == RDB_OPCODE_FREQ) {
1✔
257
            kv = (KeyValuePair<?, ?>) applyFreq(in, version, context);
1✔
258
        } else if (type == RDB_OPCODE_IDLE) {
1✔
259
            kv = (KeyValuePair<?, ?>) applyIdle(in, version, context);
1✔
260
        } else {
261
            kv = rdbLoadObject(in, version, context);
1✔
262
        }
263
        return kv;
1✔
264
    }
265

266
    @Override
267
    public Event applyFreq(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
268
        long lfuFreq = in.read();
1✔
269
        int valueType = applyType(in);
1✔
270
        context.setValueRdbType(valueType);
1✔
271
        context.setEvictType(EvictType.LFU);
1✔
272
        context.setEvictValue(lfuFreq);
1✔
273
        KeyValuePair<?, ?> kv = rdbLoadObject(in, version, context);
1✔
274
        return kv;
1✔
275
    }
276

277
    @Override
278
    public Event applyIdle(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
279
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
280
        long lruIdle = parser.rdbLoadLen().len;
1✔
281
        int valueType = applyType(in);
1✔
282
        context.setValueRdbType(valueType);
1✔
283
        context.setEvictType(EvictType.LRU);
1✔
284
        context.setEvictValue(lruIdle);
1✔
285
        KeyValuePair<?, ?> kv = rdbLoadObject(in, version, context);
1✔
286
        return kv;
1✔
287
    }
288

289
    @Override
290
    public Event applyString(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
291
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
292
        KeyValuePair<byte[], byte[]> o0 = new KeyStringValueString();
1✔
293
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
294

295
        byte[] val = valueVisitor.applyString(in, version);
1✔
296
        o0.setValueRdbType(RDB_TYPE_STRING);
1✔
297
        o0.setValue(val);
1✔
298
        o0.setKey(key);
1✔
299
        return context.valueOf(o0);
1✔
300
    }
301

302
    @Override
303
    public Event applyList(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
304
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
305
        KeyValuePair<byte[], List<byte[]>> o1 = new KeyStringValueList();
1✔
306
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
307

308
        List<byte[]> list = valueVisitor.applyList(in, version);
1✔
309
        o1.setValueRdbType(RDB_TYPE_LIST);
1✔
310
        o1.setValue(list);
1✔
311
        o1.setKey(key);
1✔
312
        return context.valueOf(o1);
1✔
313
    }
314

315
    @Override
316
    public Event applySet(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
317
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
318
        KeyValuePair<byte[], Set<byte[]>> o2 = new KeyStringValueSet();
1✔
319
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
320

321
        Set<byte[]> set = valueVisitor.applySet(in, version);
1✔
322
        o2.setValueRdbType(RDB_TYPE_SET);
1✔
323
        o2.setValue(set);
1✔
324
        o2.setKey(key);
1✔
325
        return context.valueOf(o2);
1✔
326
    }
327
    
328
    @Override
329
    public Event applySetListPack(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
330
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
331
        KeyValuePair<byte[], Set<byte[]>> o20 = new KeyStringValueSet();
1✔
332
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
333
        
334
        Set<byte[]> set = valueVisitor.applySetListPack(in, version);
1✔
335
        o20.setValueRdbType(RDB_TYPE_SET_LISTPACK);
1✔
336
        o20.setValue(set);
1✔
337
        o20.setKey(key);
1✔
338
        return context.valueOf(o20);
1✔
339
    }
340

341
    @Override
342
    public Event applyZSet(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
343
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
344
        KeyValuePair<byte[], Set<ZSetEntry>> o3 = new KeyStringValueZSet();
1✔
345
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
346

347
        Set<ZSetEntry> zset = valueVisitor.applyZSet(in, version);
1✔
348
        o3.setValueRdbType(RDB_TYPE_ZSET);
1✔
349
        o3.setValue(zset);
1✔
350
        o3.setKey(key);
1✔
351
        return context.valueOf(o3);
1✔
352
    }
353

354
    @Override
355
    public Event applyZSet2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
356
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
357
        KeyValuePair<byte[], Set<ZSetEntry>> o5 = new KeyStringValueZSet();
1✔
358
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
359

360
        Set<ZSetEntry> zset = valueVisitor.applyZSet2(in, version);
1✔
361
        o5.setValueRdbType(RDB_TYPE_ZSET_2);
1✔
362
        o5.setValue(zset);
1✔
363
        o5.setKey(key);
1✔
364
        return context.valueOf(o5);
1✔
365
    }
366

367
    @Override
368
    public Event applyHash(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
369
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
370
        KeyValuePair<byte[], Map<byte[], byte[]>> o4 = new KeyStringValueHash();
1✔
371
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
372

373
        ByteArrayMap map = valueVisitor.applyHash(in, version);
1✔
374
        o4.setValueRdbType(RDB_TYPE_HASH);
1✔
375
        o4.setValue(map);
1✔
376
        o4.setKey(key);
1✔
377
        return context.valueOf(o4);
1✔
378
    }
379

380
    @Override
381
    public Event applyHashZipMap(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
382
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
383
        KeyValuePair<byte[], Map<byte[], byte[]>> o9 = new KeyStringValueHash();
1✔
384
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
385

386
        ByteArrayMap map = valueVisitor.applyHashZipMap(in, version);
1✔
387
        o9.setValueRdbType(RDB_TYPE_HASH_ZIPMAP);
1✔
388
        o9.setValue(map);
1✔
389
        o9.setKey(key);
1✔
390
        return context.valueOf(o9);
1✔
391
    }
392

393
    @Override
394
    public Event applyListZipList(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
395
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
396
        KeyValuePair<byte[], List<byte[]>> o10 = new KeyStringValueList();
1✔
397
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
398

399
        List<byte[]> list = valueVisitor.applyListZipList(in, version);
1✔
400
        o10.setValueRdbType(RDB_TYPE_LIST_ZIPLIST);
1✔
401
        o10.setValue(list);
1✔
402
        o10.setKey(key);
1✔
403
        return context.valueOf(o10);
1✔
404
    }
405

406
    @Override
407
    public Event applySetIntSet(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
408
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
409
        KeyValuePair<byte[], Set<byte[]>> o11 = new KeyStringValueSet();
1✔
410
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
411

412
        Set<byte[]> set = valueVisitor.applySetIntSet(in, version);
1✔
413
        o11.setValueRdbType(RDB_TYPE_SET_INTSET);
1✔
414
        o11.setValue(set);
1✔
415
        o11.setKey(key);
1✔
416
        return context.valueOf(o11);
1✔
417
    }
418

419
    @Override
420
    public Event applyZSetZipList(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
421
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
422
        KeyValuePair<byte[], Set<ZSetEntry>> o12 = new KeyStringValueZSet();
1✔
423
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
424

425
        Set<ZSetEntry> zset = valueVisitor.applyZSetZipList(in, version);
1✔
426
        o12.setValueRdbType(RDB_TYPE_ZSET_ZIPLIST);
1✔
427
        o12.setValue(zset);
1✔
428
        o12.setKey(key);
1✔
429
        return context.valueOf(o12);
1✔
430
    }
431
    
432
    @Override
433
    public Event applyZSetListPack(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
434
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
435
        KeyValuePair<byte[], Set<ZSetEntry>> o17 = new KeyStringValueZSet();
1✔
436
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
437
    
438
        Set<ZSetEntry> zset = valueVisitor.applyZSetListPack(in, version);
1✔
439
        o17.setValueRdbType(RDB_TYPE_ZSET_LISTPACK);
1✔
440
        o17.setValue(zset);
1✔
441
        o17.setKey(key);
1✔
442
        return context.valueOf(o17);
1✔
443
    }
444

445
    @Override
446
    public Event applyHashZipList(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
447
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
448
        KeyValuePair<byte[], Map<byte[], byte[]>> o13 = new KeyStringValueHash();
1✔
449
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
450

451
        ByteArrayMap map = valueVisitor.applyHashZipList(in, version);
1✔
452
        o13.setValueRdbType(RDB_TYPE_HASH_ZIPLIST);
1✔
453
        o13.setValue(map);
1✔
454
        o13.setKey(key);
1✔
455
        return context.valueOf(o13);
1✔
456
    }
457
    
458
    @Override
459
    public Event applyHashListPack(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
460
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
461
        KeyValuePair<byte[], Map<byte[], byte[]>> o16 = new KeyStringValueHash();
1✔
462
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
463
        
464
        ByteArrayMap map = valueVisitor.applyHashListPack(in, version);
1✔
465
        o16.setValueRdbType(RDB_TYPE_HASH_LISTPACK);
1✔
466
        o16.setValue(map);
1✔
467
        o16.setKey(key);
1✔
468
        return context.valueOf(o16);
1✔
469
    }
470

471
    @Override
472
    public Event applyListQuickList(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
473
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
474
        KeyValuePair<byte[], List<byte[]>> o14 = new KeyStringValueList();
1✔
475
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
476

477
        List<byte[]> list = valueVisitor.applyListQuickList(in, version);
1✔
478
        o14.setValueRdbType(RDB_TYPE_LIST_QUICKLIST);
1✔
479
        o14.setValue(list);
1✔
480
        o14.setKey(key);
1✔
481
        return context.valueOf(o14);
1✔
482
    }
483
    
484
    @Override
485
    public Event applyListQuickList2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
486
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
487
        KeyValuePair<byte[], List<byte[]>> o18 = new KeyStringValueList();
1✔
488
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
489
        
490
        List<byte[]> list = valueVisitor.applyListQuickList2(in, version);
1✔
491
        o18.setValueRdbType(RDB_TYPE_LIST_QUICKLIST_2);
1✔
492
        o18.setValue(list);
1✔
493
        o18.setKey(key);
1✔
494
        return context.valueOf(o18);
1✔
495
    }
496
    
497
    @Override
498
    @SuppressWarnings("resource")
499
    public Event applyHashMetadata(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException{
NEW
500
        BaseRdbParser parser = new BaseRdbParser(in);
×
NEW
501
        KeyValuePair<byte[], Map<byte[], TTLValue>> o24 = new KeyStringValueTTLHash();
×
NEW
502
        byte[] key = parser.rdbLoadEncodedStringObject().first();
×
503
        
NEW
504
        TTLByteArrayMap map = valueVisitor.applyHashMetadata(in, version);
×
NEW
505
        o24.setValueRdbType(RDB_TYPE_HASH_METADATA);
×
NEW
506
        o24.setValue(map);
×
NEW
507
        o24.setKey(key);
×
NEW
508
        return context.valueOf(o24);
×
509
    }
510
    
511
    @Override
512
    @SuppressWarnings("resource")
513
    public Event applyHashListPackEx(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
NEW
514
        BaseRdbParser parser = new BaseRdbParser(in);
×
NEW
515
        KeyValuePair<byte[], Map<byte[], TTLValue>> o25 = new KeyStringValueTTLHash();
×
NEW
516
        byte[] key = parser.rdbLoadEncodedStringObject().first();
×
517
        
NEW
518
        TTLByteArrayMap map = valueVisitor.applyHashListPackEx(in, version);
×
NEW
519
        o25.setValueRdbType(RDB_TYPE_HASH_LISTPACK_EX);
×
NEW
520
        o25.setValue(map);
×
NEW
521
        o25.setKey(key);
×
NEW
522
        return context.valueOf(o25);
×
523
    }
524
    
525
    @Override
526
    public Event applyModule(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
527
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
528
        KeyValuePair<byte[], Module> o6 = new KeyStringValueModule();
1✔
529
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
530

531
        Module module = valueVisitor.applyModule(in, version);
1✔
532
        o6.setValueRdbType(RDB_TYPE_MODULE);
1✔
533
        o6.setValue(module);
1✔
534
        o6.setKey(key);
1✔
535
        return context.valueOf(o6);
1✔
536
    }
537

538
    @Override
539
    public Event applyModule2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
540
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
541
        KeyValuePair<byte[], Module> o7 = new KeyStringValueModule();
1✔
542
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
543

544
        Module module = valueVisitor.applyModule2(in, version);
1✔
545
        o7.setValueRdbType(RDB_TYPE_MODULE_2);
1✔
546
        o7.setValue(module);
1✔
547
        o7.setKey(key);
1✔
548
        return context.valueOf(o7);
1✔
549
    }
550

551
    @Override
552
    @SuppressWarnings("resource")
553
    public Event applyStreamListPacks(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
554
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
555
        KeyValuePair<byte[], Stream> o15 = new KeyStringValueStream();
1✔
556
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
557

558
        Stream stream = valueVisitor.applyStreamListPacks(in, version);
1✔
559
        o15.setValueRdbType(RDB_TYPE_STREAM_LISTPACKS);
1✔
560
        o15.setValue(stream);
1✔
561
        o15.setKey(key);
1✔
562
        return context.valueOf(o15);
1✔
563
    }
564
    
565
    @Override
566
    @SuppressWarnings("resource")
567
    public Event applyStreamListPacks2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
568
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
569
        KeyValuePair<byte[], Stream> o19 = new KeyStringValueStream();
1✔
570
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
571
        
572
        Stream stream = valueVisitor.applyStreamListPacks2(in, version);
1✔
573
        o19.setValueRdbType(RDB_TYPE_STREAM_LISTPACKS_2);
1✔
574
        o19.setValue(stream);
1✔
575
        o19.setKey(key);
1✔
576
        return context.valueOf(o19);
1✔
577
    }
578
    
579
    @Override
580
    @SuppressWarnings("resource")
581
    public Event applyStreamListPacks3(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
582
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
583
        KeyValuePair<byte[], Stream> o21 = new KeyStringValueStream();
1✔
584
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
585
        
586
        Stream stream = valueVisitor.applyStreamListPacks3(in, version);
1✔
587
        o21.setValueRdbType(RDB_TYPE_STREAM_LISTPACKS_3);
1✔
588
        o21.setValue(stream);
1✔
589
        o21.setKey(key);
1✔
590
        return context.valueOf(o21);
1✔
591
    }
592
    
593
    protected ModuleParser<? extends Module> lookupModuleParser(String moduleName, int moduleVersion) {
UNCOV
594
        return replicator.getModuleParser(moduleName, moduleVersion);
×
595
    }
596

597
    protected KeyValuePair<?, ?> rdbLoadObject(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
598
        /*
599
         * ----------------------------
600
         * $value-type                 # This name value pair doesn't have an expiry. $value_type guaranteed != to FD, FC, FE and FF
601
         * $string-encoded-name
602
         * $encoded-value
603
         * ----------------------------
604
         */
605
        int valueType = context.getValueRdbType();
1✔
606
        switch (valueType) {
1✔
607
            case RDB_TYPE_STRING:
608
                return (KeyValuePair<?, ?>) applyString(in, version, context);
1✔
609
            case RDB_TYPE_LIST:
610
                return (KeyValuePair<?, ?>) applyList(in, version, context);
×
611
            case RDB_TYPE_SET:
612
                return (KeyValuePair<?, ?>) applySet(in, version, context);
×
613
            case RDB_TYPE_SET_LISTPACK:
614
                return (KeyValuePair<?, ?>) applySetListPack(in, version, context);
×
615
            case RDB_TYPE_ZSET:
616
                return (KeyValuePair<?, ?>) applyZSet(in, version, context);
×
617
            case RDB_TYPE_ZSET_2:
618
                return (KeyValuePair<?, ?>) applyZSet2(in, version, context);
×
619
            case RDB_TYPE_HASH:
620
                return (KeyValuePair<?, ?>) applyHash(in, version, context);
×
621
            case RDB_TYPE_HASH_ZIPMAP:
622
                return (KeyValuePair<?, ?>) applyHashZipMap(in, version, context);
×
623
            case RDB_TYPE_LIST_ZIPLIST:
624
                return (KeyValuePair<?, ?>) applyListZipList(in, version, context);
×
625
            case RDB_TYPE_SET_INTSET:
626
                return (KeyValuePair<?, ?>) applySetIntSet(in, version, context);
×
627
            case RDB_TYPE_ZSET_ZIPLIST:
628
                return (KeyValuePair<?, ?>) applyZSetZipList(in, version, context);
×
629
            case RDB_TYPE_ZSET_LISTPACK:
630
                return (KeyValuePair<?, ?>) applyZSetListPack(in, version, context);
×
631
            case RDB_TYPE_HASH_ZIPLIST:
632
                return (KeyValuePair<?, ?>) applyHashZipList(in, version, context);
×
633
            case RDB_TYPE_HASH_LISTPACK:
634
                return (KeyValuePair<?, ?>) applyHashListPack(in, version, context);
×
635
            case RDB_TYPE_LIST_QUICKLIST:
636
                return (KeyValuePair<?, ?>) applyListQuickList(in, version, context);
×
637
            case RDB_TYPE_LIST_QUICKLIST_2:
638
                return (KeyValuePair<?, ?>) applyListQuickList2(in, version, context);
×
639
            case RDB_TYPE_MODULE:
640
                return (KeyValuePair<?, ?>) applyModule(in, version, context);
×
641
            case RDB_TYPE_MODULE_2:
642
                return (KeyValuePair<?, ?>) applyModule2(in, version, context);
1✔
643
            case RDB_TYPE_STREAM_LISTPACKS:
644
                return (KeyValuePair<?, ?>) applyStreamListPacks(in, version, context);
×
645
            case RDB_TYPE_STREAM_LISTPACKS_2:
646
                return (KeyValuePair<?, ?>) applyStreamListPacks2(in, version, context);
×
647
            case RDB_TYPE_STREAM_LISTPACKS_3:
648
                return (KeyValuePair<?, ?>) applyStreamListPacks3(in, version, context);
×
649
            case RDB_TYPE_HASH_LISTPACK_EX:
650
                return (KeyValuePair<?, ?>) applyHashListPackEx(in, version, context);
×
651
            case RDB_TYPE_HASH_METADATA:
652
                return (KeyValuePair<?, ?>) applyHashMetadata(in, version, context);
×
653
            default:
654
                throw new AssertionError("unexpected value type:" + valueType);
×
655
        }
656
    }
657
}
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