Skip to content
Merged
Show file tree
Hide file tree
Changes from 54 commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
e37114b
docs: sync .planning submodule — gap closure phases 106-111
TinDang97 Apr 10, 2026
982ac25
feat: wire metric recording helpers into subsystems (Phase 106)
TinDang97 Apr 10, 2026
d6a8fed
ci: add integration test job for durability and replication (Phase 107)
TinDang97 Apr 10, 2026
9e29b63
ci: harden fuzz and loom CI coverage (Phase 108)
TinDang97 Apr 10, 2026
cc00a32
ci: add lettuce and StackExchange.Redis compatibility tests (Phase 109)
TinDang97 Apr 10, 2026
458dc16
feat: add otel feature flag and log schema docs (Phase 110)
TinDang97 Apr 10, 2026
c9cbbad
docs: sync .planning submodule — gap closure phases 106-110 complete
TinDang97 Apr 10, 2026
9a0b798
docs: sync .planning submodule — v0.1.3 milestone complete
TinDang97 Apr 10, 2026
3f801f9
feat(112-01): add graph core types and dependencies
TinDang97 Apr 10, 2026
f44bbdf
feat(112-01): add MemGraph mutable adjacency list
TinDang97 Apr 10, 2026
fe71f80
feat(112-01): add CSR immutable graph segment
TinDang97 Apr 10, 2026
15451f0
feat(112-01): add GraphSegmentHolder with ArcSwap lock-free reads
TinDang97 Apr 10, 2026
cca5d8d
feat(112-01): add graph compaction with Rabbit Order reordering
TinDang97 Apr 10, 2026
1b6e6e5
feat(112-01): add GraphStore per-shard with lazy initialization
TinDang97 Apr 10, 2026
2fc1297
feat(112-01): integrate graph module into Shard with feature gate
TinDang97 Apr 10, 2026
b9fc9de
docs(112-01): sync .planning submodule -- Graph Storage Foundation co…
TinDang97 Apr 10, 2026
c3d6c8e
feat(113-01): extend TransactionManager with graph write intents
TinDang97 Apr 10, 2026
5422929
feat(113-01): add graph MVCC visibility checks and txn_id field
TinDang97 Apr 10, 2026
6e18a64
feat(113-01): add bounded epoch traversal guard
TinDang97 Apr 10, 2026
f9c308f
feat(113-01): add graph WAL serialization as RESP arrays
TinDang97 Apr 10, 2026
9796580
feat(113-01): add two-pass graph WAL replay
TinDang97 Apr 10, 2026
b0d173b
fix(113-01): fix Arc ownership in graph replay take/put pattern
TinDang97 Apr 10, 2026
7e4b63b
docs(113-01): sync .planning submodule -- Graph MVCC and WAL Durabili…
TinDang97 Apr 10, 2026
663b0a9
feat(114-01): add GRAPH.* command suite with dispatch registration
TinDang97 Apr 10, 2026
ab64282
docs(114-01): sync .planning submodule -- Phase 114 complete
TinDang97 Apr 10, 2026
8586c24
feat(115-01): add graph traversal scoring functions
TinDang97 Apr 10, 2026
ba62d2c
feat(115-01): add BFS/DFS/Dijkstra traversal engine with segment merg…
TinDang97 Apr 10, 2026
3b27bd0
chore(115-01): wire scoring and traversal modules into graph/mod.rs
TinDang97 Apr 10, 2026
411cdc6
docs(115-01): sync .planning submodule -- Phase 115 complete
TinDang97 Apr 10, 2026
88b644c
feat(116-01): add graph index module with LabelIndex, EdgeTypeIndex, …
TinDang97 Apr 10, 2026
8ef1d16
feat(116-01): integrate indexes into CsrSegment and NamedGraph
TinDang97 Apr 10, 2026
6e66ffd
docs(116-01): sync .planning submodule -- Phase 116 complete
TinDang97 Apr 10, 2026
c0a4942
feat(117-01): add Cypher parser with logos lexer, recursive descent, …
TinDang97 Apr 10, 2026
b3e2f06
feat(117-01): wire GRAPH.QUERY, GRAPH.RO_QUERY, GRAPH.EXPLAIN to Cyph…
TinDang97 Apr 10, 2026
3967237
test(117-01): add cypher_parse fuzz target for CI pipeline
TinDang97 Apr 10, 2026
b4a04b4
docs(117-01): sync .planning submodule — Phase 117 Cypher Parser comp…
TinDang97 Apr 10, 2026
1f28b7b
feat(118-01): add hybrid graph+vector query engine
TinDang97 Apr 10, 2026
67ba26e
feat(118-01): wire GRAPH.VSEARCH and GRAPH.HYBRID commands
TinDang97 Apr 10, 2026
7262e82
docs: sync .planning submodule — Phase 118 hybrid graph+vector querie…
TinDang97 Apr 10, 2026
63848b3
feat(119-01): add GraphStats module with incremental degree tracking
TinDang97 Apr 10, 2026
312d148
feat(119-01): integrate GraphStats into NamedGraph and command handlers
TinDang97 Apr 10, 2026
d4a6915
feat(119-01): add cost-based strategy selection and hub detection to …
TinDang97 Apr 10, 2026
78d1dda
docs(119-01): sync .planning submodule — cost-based query planner com…
TinDang97 Apr 10, 2026
0109349
feat(120-01): add ShardMessage::GraphTraverse variant and graph_to_sh…
TinDang97 Apr 10, 2026
2523294
feat(120-01): cross-shard graph traversal coordinator and handler
TinDang97 Apr 10, 2026
946d4c2
docs(120-01): sync .planning submodule — cross-shard graph traversal …
TinDang97 Apr 10, 2026
17d4bd3
feat(121-01): graph persistence and recovery with CRC32 validation
TinDang97 Apr 10, 2026
0d154c0
docs(121-01): sync .planning submodule -- graph persistence and recov…
TinDang97 Apr 10, 2026
23c90e0
feat(122-01): add Criterion benchmarks for graph operations
TinDang97 Apr 10, 2026
75bab3f
fix(122-01): prevent OOM in graph benchmarks with iter_custom batching
TinDang97 Apr 10, 2026
73035ed
docs(122-01): sync .planning submodule for Phase 122 completion
TinDang97 Apr 10, 2026
6092c30
fix: resolve clippy warnings in graph module (io_other_error, is_mult…
TinDang97 Apr 10, 2026
d09d116
fix(122.1-01): wire graph WAL, LSN allocation, recovery, and remove d…
TinDang97 Apr 10, 2026
6ad624c
feat: add graph engine E2E benchmark script (scripts/bench-graph.sh)
TinDang97 Apr 10, 2026
c858ab7
docs: add graph engine integration to CHANGELOG [Unreleased]
TinDang97 Apr 11, 2026
173b1a2
ci: fix durability test target name (durability → durability_tests)
TinDang97 Apr 11, 2026
558be29
perf: pre-allocate BFS result and frontier buffers in GRAPH.NEIGHBORS
TinDang97 Apr 11, 2026
94b43c1
feat: add GRAPH.* support to handler_single + 13 TCP integration tests
TinDang97 Apr 11, 2026
85ec688
bench: add graph E2E throughput benchmark + FalkorDB comparison script
TinDang97 Apr 11, 2026
cfb0d52
test: add deep/wide graph stress benchmarks (worst-case scenarios)
TinDang97 Apr 11, 2026
da5e1af
fix: address review findings — WAL drain, MVCC truncation, O(N²) comp…
TinDang97 Apr 11, 2026
dfb3ec6
feat(123-01): migrate GraphStore from Mutex to RwLock and split dispatch
TinDang97 Apr 11, 2026
655cca6
feat(123-01): update all handler sites to use RwLock read/write split
TinDang97 Apr 11, 2026
36d398b
docs(123-01): update .planning submodule for unlock-read-concurrency …
TinDang97 Apr 11, 2026
cac3b3e
feat(123-02): add Cypher execution engine with all 12 physical operators
TinDang97 Apr 11, 2026
1fe9ec5
feat(123-02): wire Cypher executor into GRAPH.QUERY for data row results
TinDang97 Apr 11, 2026
a8107d6
docs(123-02): update .planning submodule for executor plan completion
TinDang97 Apr 11, 2026
a5ca2b4
feat(124-02): add SIMD-accelerated cosine similarity with NEON/AVX2/s…
TinDang97 Apr 11, 2026
615fe72
feat(124-01): add MmapCsrSegment and CsrStorage enum for zero-copy CS…
TinDang97 Apr 11, 2026
ad1468a
feat(124-02): wire SIMD cosine into hybrid.rs + Criterion benchmark
TinDang97 Apr 11, 2026
7468b8b
docs(124-02): complete SIMD cosine similarity plan
TinDang97 Apr 11, 2026
68cc0c3
feat(124-01): wire CsrStorage into recovery, segment, traversal, and …
TinDang97 Apr 11, 2026
09ce43d
docs(124-01): update planning submodule for 124-01 summary
TinDang97 Apr 11, 2026
f345db3
feat(125-02): add execute_profile with per-operator timing to Cypher …
TinDang97 Apr 11, 2026
57656f8
test(125-02): add failing tests for GRAPH.PROFILE command
TinDang97 Apr 11, 2026
67631b7
feat(125-01): implement GraphConstrainedReRanker with batch BFS re-ra…
TinDang97 Apr 11, 2026
c01b75a
feat(125-02): add GRAPH.PROFILE command handler, dispatch, and metadata
TinDang97 Apr 11, 2026
f37db4e
feat(125-01): wire RERANK mode into GRAPH.HYBRID command
TinDang97 Apr 11, 2026
aca3f3b
docs(125-02): update planning submodule for 125-02 summary
TinDang97 Apr 11, 2026
99d1917
docs(125-01): complete graph-constrained re-ranking plan
TinDang97 Apr 11, 2026
6055bab
feat(126-01): add morsel-driven ParallelBfs with DashSet visited set
TinDang97 Apr 11, 2026
76611a6
feat(126-02): add PhysicalOp::Merge and execute_mut for write-capable…
TinDang97 Apr 11, 2026
5cadcb8
feat(126-02): route GRAPH.QUERY write queries through execute_mut dis…
TinDang97 Apr 11, 2026
46cb18f
bench(126-01): add Criterion benchmark comparing ParallelBfs vs Bound…
TinDang97 Apr 11, 2026
6a8503b
docs(126-02): update .planning submodule for MERGE clause plan comple…
TinDang97 Apr 11, 2026
5ec24aa
docs(126-01): update planning submodule for parallel BFS summary
TinDang97 Apr 11, 2026
aa9f1cf
docs: update .planning submodule for phases 123-126
TinDang97 Apr 11, 2026
39b4f31
feat(127-01): route GRAPH.QUERY write Cypher to write lock path
TinDang97 Apr 11, 2026
620da35
feat(127-02): wire SegmentMergeReader into GRAPH.NEIGHBORS and Cypher…
TinDang97 Apr 11, 2026
f518229
feat(127-02): wire compaction trigger and save_graph_store to shutdown
TinDang97 Apr 11, 2026
cf4a13d
docs(127-02): update .planning submodule for segment merge + compacti…
TinDang97 Apr 11, 2026
7f68094
feat(127-01): generate WAL records in execute_mut for Cypher mutations
TinDang97 Apr 11, 2026
8e85fc9
docs(127-01): update .planning submodule for write dispatch and WAL g…
TinDang97 Apr 11, 2026
5f0f31e
feat(127-03): wire GraphReplayCollector into WAL/AOF replay path
TinDang97 Apr 11, 2026
11996f9
docs(127-03): update .planning submodule for graph WAL replay wiring
TinDang97 Apr 11, 2026
11aa431
fix(127): wire replay_graph_wal into startup — complete INT-03 fix
TinDang97 Apr 11, 2026
b830abf
feat: resolve remaining tech debt — PlanCache, PropertyIndex, Travers…
TinDang97 Apr 11, 2026
50d7f9e
fix: resolve 14 review findings — crash recovery, safety, performance
TinDang97 Apr 11, 2026
c421eef
fix: NeighborIter MVCC visibility bug + GRAPH.DROP + split oversized …
TinDang97 Apr 11, 2026
6c26d3e
fix: resolve deep review findings + 30% BFS perf improvement
TinDang97 Apr 11, 2026
a5c99d2
ci: add concurrency group to cancel superseded PR runs
TinDang97 Apr 11, 2026
9c9cb83
ci: quote YAML run command containing :: (graph:: filter)
TinDang97 Apr 11, 2026
2f56f83
ci: retrigger after enabling public repo runners
TinDang97 Apr 11, 2026
511412f
ci: add concurrency groups to all 7 workflows
TinDang97 Apr 11, 2026
c5aef49
fix: resolve CI failures — SAFETY comments, cargo fmt, bench type fix
TinDang97 Apr 11, 2026
9a2914c
ci: optimize CI from 26 to 10 jobs per PR push
TinDang97 Apr 11, 2026
1b843d0
ci: consolidate to 3 jobs with shared compilation cache
TinDang97 Apr 11, 2026
60393e0
ci: remove performance gate and client compatibility workflows
TinDang97 Apr 11, 2026
0f50579
fix: add tokio/process to runtime-tokio feature + CHANGELOG entry
TinDang97 Apr 11, 2026
7352ca2
fix: CI failures — CHANGELOG shallow clone + blocking tests not ignored
TinDang97 Apr 11, 2026
58daeb7
fix: add #[ignore] to functions_fcall tests (require external server)
TinDang97 Apr 11, 2026
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
14 changes: 14 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,20 @@ jobs:
env:
MOON_NO_URING: "1"

loom:
name: Loom Model Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@1.94.1
- uses: Swatinem/rust-cache@v2
- name: Run loom exhaustive exploration
run: cargo test --no-default-features --features runtime-tokio,jemalloc --test loom_response_slot
timeout-minutes: 5
env:
MOON_NO_URING: "1"
RUSTFLAGS: "--cfg loom"

msrv:
name: MSRV (1.94)
runs-on: ubuntu-latest
Expand Down
117 changes: 117 additions & 0 deletions .github/workflows/compat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -349,3 +349,120 @@ jobs:
JEOF
cd /tmp/jedis-test && javac -cp "jedis.jar:commons-pool2.jar:slf4j-api.jar:gson.jar" CompatTest.java
cd /tmp/jedis-test && java -ea -cp ".:jedis.jar:commons-pool2.jar:slf4j-api.jar:slf4j-simple.jar:gson.jar" CompatTest

lettuce:
name: lettuce (Java)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@1.94.0
- uses: Swatinem/rust-cache@v2
- name: Build Moon (tokio)
run: cargo build --release --no-default-features --features runtime-tokio,jemalloc
env:
MOON_NO_URING: "1"
- name: Start Moon
run: |
./target/release/moon --port 6399 --shards 1 &
sleep 2
env:
MOON_NO_URING: "1"
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- name: Run lettuce smoke test
env:
LETTUCE_VERSION: "6.5.2.RELEASE"
NETTY_VERSION: "4.1.116.Final"
REACTOR_VERSION: "3.7.2"
REACTIVE_STREAMS_VERSION: "1.0.4"
run: |
mkdir -p /tmp/lettuce-test
curl -sL "https://repo1.maven.org/maven2/io/lettuce/lettuce-core/${LETTUCE_VERSION}/lettuce-core-${LETTUCE_VERSION}.jar" -o /tmp/lettuce-test/lettuce-core.jar
curl -sL "https://repo1.maven.org/maven2/io/netty/netty-all/${NETTY_VERSION}/netty-all-${NETTY_VERSION}.jar" -o /tmp/lettuce-test/netty-all.jar
curl -sL "https://repo1.maven.org/maven2/io/projectreactor/reactor-core/${REACTOR_VERSION}/reactor-core-${REACTOR_VERSION}.jar" -o /tmp/lettuce-test/reactor-core.jar
curl -sL "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/${REACTIVE_STREAMS_VERSION}/reactive-streams-${REACTIVE_STREAMS_VERSION}.jar" -o /tmp/lettuce-test/reactive-streams.jar
cat > /tmp/lettuce-test/LettuceTest.java << 'LEOF'
import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;
public class LettuceTest {
public static void main(String[] args) {
RedisClient client = RedisClient.create("redis://127.0.0.1:6399");
try (StatefulRedisConnection<String, String> conn = client.connect()) {
RedisCommands<String, String> cmd = conn.sync();
cmd.set("lettuce_key", "lettuce_value");
String v = cmd.get("lettuce_key");
assert "lettuce_value".equals(v) : "GET failed";
cmd.hset("lettuce_hash", "f1", "v1");
String hv = cmd.hget("lettuce_hash", "f1");
assert "v1".equals(hv) : "HGET failed";
System.out.println("lettuce: ALL TESTS PASSED");
} finally {
client.shutdown();
}
}
}
LEOF
cd /tmp/lettuce-test && javac -cp "lettuce-core.jar:netty-all.jar:reactor-core.jar:reactive-streams.jar" LettuceTest.java
cd /tmp/lettuce-test && java -ea -cp ".:lettuce-core.jar:netty-all.jar:reactor-core.jar:reactive-streams.jar" LettuceTest

stackexchange-redis:
name: StackExchange.Redis (.NET)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@1.94.0
- uses: Swatinem/rust-cache@v2
- name: Build Moon (tokio)
run: cargo build --release --no-default-features --features runtime-tokio,jemalloc
env:
MOON_NO_URING: "1"
- name: Start Moon
run: |
./target/release/moon --port 6399 --shards 1 &
sleep 2
env:
MOON_NO_URING: "1"
- uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'
- name: Run StackExchange.Redis smoke test
run: |
mkdir -p /tmp/se-redis-test
cd /tmp/se-redis-test
dotnet new console -n CompatTest --force
cd CompatTest
dotnet add package StackExchange.Redis
cat > Program.cs << 'CSEOF'
using StackExchange.Redis;

var mux = ConnectionMultiplexer.Connect("127.0.0.1:6399");
var db = mux.GetDatabase();

// SET / GET
db.StringSet("dotnet_key", "dotnet_value");
var v = db.StringGet("dotnet_key");
if (v != "dotnet_value") throw new Exception("GET failed");

// HSET / HGET
db.HashSet("dotnet_hash", "f1", "v1");
var hv = db.HashGet("dotnet_hash", "f1");
if (hv != "v1") throw new Exception("HGET failed");

// Pipeline (batch)
var batch = db.CreateBatch();
var t1 = batch.StringSetAsync("dp1", "pv1");
var t2 = batch.StringSetAsync("dp2", "pv2");
var t3 = batch.StringGetAsync("dp1");
var t4 = batch.StringGetAsync("dp2");
batch.Execute();
Task.WaitAll(t1, t2, t3, t4);
if (t3.Result != "pv1") throw new Exception("batch GET1 failed");
if (t4.Result != "pv2") throw new Exception("batch GET2 failed");

Console.WriteLine("StackExchange.Redis: ALL TESTS PASSED");
mux.Dispose();
CSEOF
dotnet run
8 changes: 6 additions & 2 deletions .github/workflows/fuzz.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@ jobs:
target:
- resp_parse
- resp_parse_differential
- inline_parse
- wal_v3_record
- gossip_deser
- acl_rule
- rdb_load
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@nightly
Expand All @@ -38,8 +42,8 @@ jobs:
name: fuzz-corpus
path: fuzz/corpus/
continue-on-error: true
- name: Run fuzzer (5m, multi-process)
run: cargo +nightly fuzz run "$TARGET" -- -max_total_time=300 -max_len=65536 -fork=2 -ignore_crashes=0
- name: Run fuzzer (15m, multi-process)
run: cargo +nightly fuzz run "$TARGET" -- -max_total_time=900 -max_len=65536 -fork=2 -ignore_crashes=0
env:
MOON_NO_URING: "1"
TARGET: ${{ matrix.target }}
Expand Down
41 changes: 41 additions & 0 deletions .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Integration Tests

on:
push:
branches: [main]
pull_request:
branches: [main]

env:
CARGO_TERM_COLOR: always
MOON_NO_URING: "1"

jobs:
durability:
name: Durability Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@1.94.1
- uses: Swatinem/rust-cache@v2
- name: Build Moon (release)
run: cargo build --release --no-default-features --features runtime-tokio,jemalloc
- name: Run crash matrix tests
run: cargo test --release --no-default-features --features runtime-tokio,jemalloc --test durability
timeout-minutes: 10
- name: Run jepsen-lite tests
run: cargo test --release --no-default-features --features runtime-tokio,jemalloc --test jepsen_lite
timeout-minutes: 10

replication:
name: Replication Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@1.94.1
- uses: Swatinem/rust-cache@v2
- name: Build Moon (release)
run: cargo build --release --no-default-features --features runtime-tokio,jemalloc
- name: Run replication hardening tests
run: cargo test --release --no-default-features --features runtime-tokio,jemalloc --test replication_hardening
timeout-minutes: 10
2 changes: 1 addition & 1 deletion .planning
78 changes: 78 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ http-body-util = "0.1"
tikv-jemallocator = { version = "0.6", optional = true }
monoio = { version = "0.2", optional = true, features = ["sync", "bytes"] }
cudarc = { version = "0.12", optional = true, default-features = false, features = ["cuda-version-from-build-system"] }
slotmap = "1"
boomphf = "0.6"
logos = { version = "0.14", optional = true }

[features]
# Platform-aware defaults:
Expand All @@ -84,6 +87,10 @@ runtime-tokio = ["tokio/rt-multi-thread", "tokio/io-util", "tokio/signal", "toki
runtime-monoio = ["dep:monoio", "dep:monoio-rustls", "dep:aws-lc-rs", "dep:rustls", "rustls/aws_lc_rs", "dep:rustls-pemfile"]
gpu-cuda = ["dep:cudarc"]
simd-avx512 = []
# OpenTelemetry exporter: reserves feature namespace for OTLP trace export.
# When wired, will gate tracing-opentelemetry + opentelemetry-otlp dependencies.
otel = []
graph = ["dep:logos"]

[target.'cfg(target_os = "linux")'.dependencies]
io-uring = "0.7"
Expand Down Expand Up @@ -146,3 +153,8 @@ harness = false
[[bench]]
name = "pubsub_hotpath"
harness = false

[[bench]]
name = "graph_bench"
harness = false
required-features = ["graph"]
Loading
Loading