Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
images
images
data
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,4 @@ hs_err_pid*

# log
/log/
data
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM maven:3.8-openjdk-11-slim AS builder
FROM maven:3.8.7-openjdk-18-slim AS builder

WORKDIR /app
COPY . /app
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Apr 08 19:42:06 IDT 2025
redis-replicator-3.8.1-modif.jar>=
redis-replicator-3.8.1-modif.pom>=
Binary file not shown.

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions deps/com/moilioncircle/redis-replicator/maven-metadata-local.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.moilioncircle</groupId>
<artifactId>redis-replicator</artifactId>
<versioning>
<release>3.8.1</release>
<versions>
<version>3.8.1</version>
</versions>
<lastUpdated>20250408160242</lastUpdated>
</versioning>
</metadata>
Binary file added dump.rdb
Binary file not shown.
17 changes: 13 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
-->

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.moilioncircle</groupId>
Expand Down Expand Up @@ -66,18 +66,27 @@
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<repositories>
<repository>
<id>project.local</id>
<name>project</name>
<url>file:${project.basedir}/deps</url>
</repository>
</repositories>

<dependencies>
<dependency>
<groupId>com.moilioncircle</groupId>
<artifactId>redis-replicator</artifactId>
<version>3.11.0</version>
<version>3.8.1-modif</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>com.moilioncircle</groupId>
<artifactId>redis-rdb-cli-api</artifactId>
Expand Down Expand Up @@ -215,4 +224,4 @@
</plugin>
</plugins>
</build>
</project>
</project>
37 changes: 37 additions & 0 deletions src/main/java/com/moilioncircle/redis/rdb/cli/glossary/Action.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
Expand All @@ -42,6 +44,9 @@
import com.moilioncircle.redis.replicator.Replicator;
import com.moilioncircle.redis.replicator.io.CRCOutputStream;
import com.moilioncircle.redis.replicator.io.RedisInputStream;
import com.moilioncircle.redis.replicator.rdb.BaseRdbEncoder;
import com.moilioncircle.redis.replicator.rdb.BaseRdbParser;
import com.moilioncircle.redis.replicator.util.ByteArray;
import com.moilioncircle.redis.replicator.util.Tuples;
import com.moilioncircle.redis.replicator.util.type.Tuple2;

Expand All @@ -61,13 +66,15 @@ public List<Tuple2<Replicator, String>> dress(Configure configure, Args.RdtArgs
if (isEmpty(arg.merge)) return list;
CRCOutputStream out = Outputs.newCRCOutput(arg.output, configure.getOutputBufferSize());
int version = 0;
long totalUsedMem = 0;
for (File file : arg.merge) {
RedisURI uri = XUris.fromFile(file);
if (uri.getFileType() == null || uri.getFileType() != RDB) {
throw new UnsupportedOperationException("Invalid options: '--merge <file>...' must be rdb file.");
}

version = maxVersion(version, file);
totalUsedMem += scanUsedMem(file);

Replicator r = new XRedisReplicator(uri, configure, DefaultReplFilter.RDB);
r.setRdbVisitor(new MergeRdbVisitor(r, configure, arg, () -> out));
Expand All @@ -84,6 +91,9 @@ public List<Tuple2<Replicator, String>> dress(Configure configure, Args.RdtArgs
// header & version
out.write("REDIS".getBytes());
out.write(Strings.lappend(version, 4, '0').getBytes());
if (totalUsedMem > 0) {
writeUsedMemAux(out, totalUsedMem);
}
return list;
case SPLIT:
Replicator r = new XRedisReplicator(arg.split, configure, DefaultReplFilter.RDB);
Expand All @@ -103,6 +113,33 @@ public List<Tuple2<Replicator, String>> dress(Configure configure, Args.RdtArgs
}
}

private long scanUsedMem(File file) {
try (RedisInputStream in = new RedisInputStream(new FileInputStream(file))) {
in.skip(9); // skip "REDIS" magic (5 bytes) + version (4 bytes)
BaseRdbParser parser = new BaseRdbParser(in);
while (true) {
int opcode = in.read();
if (opcode != 0xFA) break; // not an aux field opcode
byte[] key = parser.rdbLoadEncodedStringObject().first();
byte[] value = parser.rdbLoadEncodedStringObject().first();
if ("used-mem".equals(new String(key, StandardCharsets.UTF_8))) {
return Long.parseLong(new String(value, StandardCharsets.UTF_8));
}
}
} catch (Exception ignore) {
}
return 0L;
}

private void writeUsedMemAux(OutputStream out, long usedMem) throws IOException {
BaseRdbEncoder encoder = new BaseRdbEncoder();
byte[] keyBytes = "used-mem".getBytes();
byte[] valueBytes = Long.toString(usedMem).getBytes();
out.write(0xFA); // RDB_OPCODE_AUX
encoder.rdbSavePlainStringObject(new ByteArray(keyBytes), out);
encoder.rdbSavePlainStringObject(new ByteArray(valueBytes), out);
}

private int maxVersion(int version, File file) throws IOException {
try (RedisInputStream in = new RedisInputStream(new FileInputStream(file))) {
in.skip(5); // skip REDIS
Expand Down
Loading