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

leonchen83 / redis-replicator / #2155

06 Jun 2025 04:52AM UTC coverage: 71.406% (-0.2%) from 71.609%
#2155

push

chenby
redis 8.0

3 of 33 new or added lines in 14 files covered. (9.09%)

3 existing lines in 2 files now uncovered.

6635 of 9292 relevant lines covered (71.41%)

0.71 hits per line

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

83.63
/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.KeyStringValueZSet;
70
import com.moilioncircle.redis.replicator.rdb.datatype.KeyValuePair;
71
import com.moilioncircle.redis.replicator.rdb.datatype.Module;
72
import com.moilioncircle.redis.replicator.rdb.datatype.Stream;
73
import com.moilioncircle.redis.replicator.rdb.datatype.ZSetEntry;
74
import com.moilioncircle.redis.replicator.rdb.module.ModuleParser;
75
import com.moilioncircle.redis.replicator.rdb.skip.SkipRdbParser;
76
import com.moilioncircle.redis.replicator.util.ByteArrayMap;
77
import com.moilioncircle.redis.replicator.util.Strings;
78

79
/**
80
 * @author Leon Chen
81
 * @since 2.1.0
82
 */
83
public class DefaultRdbVisitor extends RdbVisitor {
84

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

87
    protected final Replicator replicator;
88
    protected final RdbValueVisitor valueVisitor;
89

90
    public DefaultRdbVisitor(Replicator replicator) {
91
        this(replicator, new DefaultRdbValueVisitor(replicator));
1✔
92
    }
1✔
93

94
    public DefaultRdbVisitor(Replicator replicator, RdbValueVisitor valueVisitor) {
1✔
95
        this.replicator = replicator;
1✔
96
        this.valueVisitor = valueVisitor;
1✔
97
    }
1✔
98

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

517
        Stream stream = valueVisitor.applyStreamListPacks(in, version);
1✔
518
        o15.setValueRdbType(RDB_TYPE_STREAM_LISTPACKS);
1✔
519
        o15.setValue(stream);
1✔
520
        o15.setKey(key);
1✔
521
        return context.valueOf(o15);
1✔
522
    }
523
    
524
    @Override
525
    @SuppressWarnings("resource")
526
    public Event applyStreamListPacks2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
527
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
528
        KeyValuePair<byte[], Stream> o19 = new KeyStringValueStream();
1✔
529
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
530
        
531
        Stream stream = valueVisitor.applyStreamListPacks2(in, version);
1✔
532
        o19.setValueRdbType(RDB_TYPE_STREAM_LISTPACKS_2);
1✔
533
        o19.setValue(stream);
1✔
534
        o19.setKey(key);
1✔
535
        return context.valueOf(o19);
1✔
536
    }
537
    
538
    @Override
539
    @SuppressWarnings("resource")
540
    public Event applyStreamListPacks3(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
541
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
542
        KeyValuePair<byte[], Stream> o21 = new KeyStringValueStream();
1✔
543
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
544
        
545
        Stream stream = valueVisitor.applyStreamListPacks3(in, version);
1✔
546
        o21.setValueRdbType(RDB_TYPE_STREAM_LISTPACKS_3);
1✔
547
        o21.setValue(stream);
1✔
548
        o21.setKey(key);
1✔
549
        return context.valueOf(o21);
1✔
550
    }
551
    
552
    @Override
553
    @SuppressWarnings("resource")
554
    public Event applyHashMetadata(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException{
555
        // TODO
NEW
556
        return null;
×
557
    }
558
    
559
    @Override
560
    @SuppressWarnings("resource")
561
    public Event applyHashListPackEx(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
562
        // TODO
NEW
563
        return null;
×
564
    }
565

566
    protected ModuleParser<? extends Module> lookupModuleParser(String moduleName, int moduleVersion) {
567
        return replicator.getModuleParser(moduleName, moduleVersion);
×
568
    }
569

570
    protected KeyValuePair<?, ?> rdbLoadObject(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
571
        /*
572
         * ----------------------------
573
         * $value-type                 # This name value pair doesn't have an expiry. $value_type guaranteed != to FD, FC, FE and FF
574
         * $string-encoded-name
575
         * $encoded-value
576
         * ----------------------------
577
         */
578
        int valueType = context.getValueRdbType();
1✔
579
        switch (valueType) {
1✔
580
            case RDB_TYPE_STRING:
581
                return (KeyValuePair<?, ?>) applyString(in, version, context);
1✔
582
            case RDB_TYPE_LIST:
583
                return (KeyValuePair<?, ?>) applyList(in, version, context);
×
584
            case RDB_TYPE_SET:
585
                return (KeyValuePair<?, ?>) applySet(in, version, context);
×
586
            case RDB_TYPE_SET_LISTPACK:
587
                return (KeyValuePair<?, ?>) applySetListPack(in, version, context);
×
588
            case RDB_TYPE_ZSET:
589
                return (KeyValuePair<?, ?>) applyZSet(in, version, context);
×
590
            case RDB_TYPE_ZSET_2:
591
                return (KeyValuePair<?, ?>) applyZSet2(in, version, context);
×
592
            case RDB_TYPE_HASH:
593
                return (KeyValuePair<?, ?>) applyHash(in, version, context);
×
594
            case RDB_TYPE_HASH_ZIPMAP:
595
                return (KeyValuePair<?, ?>) applyHashZipMap(in, version, context);
×
596
            case RDB_TYPE_LIST_ZIPLIST:
597
                return (KeyValuePair<?, ?>) applyListZipList(in, version, context);
×
598
            case RDB_TYPE_SET_INTSET:
599
                return (KeyValuePair<?, ?>) applySetIntSet(in, version, context);
×
600
            case RDB_TYPE_ZSET_ZIPLIST:
601
                return (KeyValuePair<?, ?>) applyZSetZipList(in, version, context);
×
602
            case RDB_TYPE_ZSET_LISTPACK:
603
                return (KeyValuePair<?, ?>) applyZSetListPack(in, version, context);
×
604
            case RDB_TYPE_HASH_ZIPLIST:
605
                return (KeyValuePair<?, ?>) applyHashZipList(in, version, context);
×
606
            case RDB_TYPE_HASH_LISTPACK:
607
                return (KeyValuePair<?, ?>) applyHashListPack(in, version, context);
×
608
            case RDB_TYPE_LIST_QUICKLIST:
609
                return (KeyValuePair<?, ?>) applyListQuickList(in, version, context);
×
610
            case RDB_TYPE_LIST_QUICKLIST_2:
611
                return (KeyValuePair<?, ?>) applyListQuickList2(in, version, context);
×
612
            case RDB_TYPE_MODULE:
613
                return (KeyValuePair<?, ?>) applyModule(in, version, context);
×
614
            case RDB_TYPE_MODULE_2:
615
                return (KeyValuePair<?, ?>) applyModule2(in, version, context);
1✔
616
            case RDB_TYPE_STREAM_LISTPACKS:
617
                return (KeyValuePair<?, ?>) applyStreamListPacks(in, version, context);
×
618
            case RDB_TYPE_STREAM_LISTPACKS_2:
619
                return (KeyValuePair<?, ?>) applyStreamListPacks2(in, version, context);
×
620
            case RDB_TYPE_STREAM_LISTPACKS_3:
621
                return (KeyValuePair<?, ?>) applyStreamListPacks3(in, version, context);
×
622
            case RDB_TYPE_HASH_LISTPACK_EX:
NEW
623
                return (KeyValuePair<?, ?>) applyHashListPackEx(in, version, context);
×
624
            case RDB_TYPE_HASH_METADATA:
NEW
625
                return (KeyValuePair<?, ?>) applyHashMetadata(in, version, context);
×
626
            default:
627
                throw new AssertionError("unexpected value type:" + valueType);
×
628
        }
629
    }
630
}
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