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

leonchen83 / redis-replicator / #2171

06 Jun 2025 05:39AM UTC coverage: 71.185% (-0.2%) from 71.406%
#2171

push

chenby
redis 8.0

8 of 33 new or added lines in 7 files covered. (24.24%)

5 existing lines in 2 files now uncovered.

6638 of 9325 relevant lines covered (71.18%)

0.71 hits per line

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

82.17
/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.Slot;
73
import com.moilioncircle.redis.replicator.rdb.datatype.Stream;
74
import com.moilioncircle.redis.replicator.rdb.datatype.ZSetEntry;
75
import com.moilioncircle.redis.replicator.rdb.module.ModuleParser;
76
import com.moilioncircle.redis.replicator.rdb.skip.SkipRdbParser;
77
import com.moilioncircle.redis.replicator.util.ByteArrayMap;
78
import com.moilioncircle.redis.replicator.util.Strings;
79

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

474
        List<byte[]> list = valueVisitor.applyListQuickList(in, version);
1✔
475
        o14.setValueRdbType(RDB_TYPE_LIST_QUICKLIST);
1✔
476
        o14.setValue(list);
1✔
477
        o14.setKey(key);
1✔
478
        return context.valueOf(o14);
1✔
479
    }
480
    
481
    @Override
482
    public Event applyListQuickList2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
483
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
484
        KeyValuePair<byte[], List<byte[]>> o18 = new KeyStringValueList();
1✔
485
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
486
        
487
        List<byte[]> list = valueVisitor.applyListQuickList2(in, version);
1✔
488
        o18.setValueRdbType(RDB_TYPE_LIST_QUICKLIST_2);
1✔
489
        o18.setValue(list);
1✔
490
        o18.setKey(key);
1✔
491
        return context.valueOf(o18);
1✔
492
    }
493
    
494
    @Override
495
    public Event applyModule(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
496
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
497
        KeyValuePair<byte[], Module> o6 = new KeyStringValueModule();
1✔
498
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
499

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

507
    @Override
508
    public Event applyModule2(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
509
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
510
        KeyValuePair<byte[], Module> o7 = new KeyStringValueModule();
1✔
511
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
512

513
        Module module = valueVisitor.applyModule2(in, version);
1✔
514
        o7.setValueRdbType(RDB_TYPE_MODULE_2);
1✔
515
        o7.setValue(module);
1✔
516
        o7.setKey(key);
1✔
517
        return context.valueOf(o7);
1✔
518
    }
519

520
    @Override
521
    @SuppressWarnings("resource")
522
    public Event applyStreamListPacks(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
523
        BaseRdbParser parser = new BaseRdbParser(in);
1✔
524
        KeyValuePair<byte[], Stream> o15 = new KeyStringValueStream();
1✔
525
        byte[] key = parser.rdbLoadEncodedStringObject().first();
1✔
526

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

576
    protected ModuleParser<? extends Module> lookupModuleParser(String moduleName, int moduleVersion) {
577
        return replicator.getModuleParser(moduleName, moduleVersion);
×
578
    }
579

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