Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
eca4113
feat: add ix-tests integration test harness
thlorenz Apr 22, 2026
7cb42b6
feat: implement gRPC ping RPC and add test
thlorenz Apr 22, 2026
d7dca98
feat: add scenario layout, accounts, artifacts, and runner
thlorenz Apr 22, 2026
77ac4a8
chore: add ix-tests grpc-service config files
thlorenz Apr 22, 2026
5973b71
feat: add service process controller with ping readiness probe
thlorenz Apr 22, 2026
38391bd
feat: add gRPC test client and observation log
thlorenz Apr 22, 2026
e43b0b0
feat: add validator driver and keypair-backed accounts
thlorenz Apr 22, 2026
c088b33
feat: add ix checkpoint runner
thlorenz Apr 22, 2026
4b8445c
feat: add ix single basic scenario
thlorenz Apr 22, 2026
88515b3
feat: add ix single load scenario
thlorenz Apr 22, 2026
2dbea64
feat: add ix dual concurrent scenario
thlorenz Apr 22, 2026
48d2c80
feat: add ix dual restart scenario
thlorenz Apr 22, 2026
5431e2b
feat: persist ix failure artifacts
thlorenz Apr 22, 2026
2112eb5
docs: add ix test root workflows
thlorenz Apr 22, 2026
efaa669
Merge branch 'master' into ix-tests
thlorenz Apr 27, 2026
a499959
chore: fixes + log improvs in ix-tests
thlorenz Apr 28, 2026
70f37a7
chore: log update lamports
thlorenz Apr 28, 2026
fdb3fb5
chore: improve b58 conversions
thlorenz Apr 28, 2026
63bbcf0
refactor(ix-tests): satisfy checkpoints from required only
thlorenz Apr 28, 2026
f3e6c4c
refactor: remove allowed field from ClientCheckpoint
thlorenz Apr 28, 2026
654597a
fix(ix-tests): consume matched required entries incrementally
thlorenz Apr 28, 2026
da78bbe
chore: simplify rust
thlorenz Apr 28, 2026
da71800
chore: minor fixes in ix-tests
thlorenz Apr 28, 2026
554d5a8
chore: simplify checkpoint asserts
thlorenz Apr 28, 2026
3df8168
chore: task to reset kafka/ksql state
thlorenz Apr 28, 2026
75fd402
chore: shorter wait times
thlorenz Apr 28, 2026
e26f199
chore: dumping logs on error
thlorenz Apr 28, 2026
2210038
chore: fix geyser plugin launch
thlorenz May 1, 2026
d384b78
feat: add rpc_url to ValidatorConfig
thlorenz May 1, 2026
f7331d2
feat: add ServiceReadiness primitive
thlorenz May 1, 2026
5aec64f
feat: gate Ping on ServiceReadiness
thlorenz May 1, 2026
59ac0aa
feat: add startup preflight probes
thlorenz May 1, 2026
881541a
feat: orchestrate preflight and readiness in App::run
thlorenz May 1, 2026
30cb19b
refactor: distinguish preflight-pending from connection errors
thlorenz May 1, 2026
32475cd
chore: convenience make tasks
thlorenz May 1, 2026
6353c8c
chore: increase checkpoint timeout
thlorenz May 1, 2026
d22a136
refactor: encode ix-test service ownership
thlorenz May 1, 2026
5ed0026
feat: attach to ready external grpc-service
thlorenz May 1, 2026
3200a68
feat: add single triage scenario
thlorenz May 1, 2026
6c835de
feat: wire single triage scenario
thlorenz May 1, 2026
a2adbc2
feat: add triage logging
thlorenz May 1, 2026
8be8b76
feat: scope grpc service configs per run
thlorenz May 3, 2026
6242cda
feat: generate run-scoped grpc service configs
thlorenz May 3, 2026
4d4910b
feat: add grpc-service cooperative shutdown
thlorenz May 3, 2026
69ea2a0
feat: request graceful ix-test service shutdown
thlorenz May 3, 2026
583a05b
feat: gate grpc readiness on kafka assignment
thlorenz May 3, 2026
263a272
feat(grpc-service): add startup delay observability logs
thlorenz May 3, 2026
328592d
feat(kafka-setup): tune local kafka rebalance timing
thlorenz May 3, 2026
20fc740
fix: align grpc probe and bind ports
thlorenz May 5, 2026
45fb673
fix: abort receive task on shutdown
thlorenz May 5, 2026
22ab4d7
fix: toml issues
thlorenz May 5, 2026
1d80a3b
feat: switch ix-tests to random keypairs per run
thlorenz May 5, 2026
0aff553
chore: add tracing::info! logging for generated NamedAccount pubkey m…
thlorenz May 5, 2026
c05a7e3
chore: fix single basic scenario assert
thlorenz May 5, 2026
6c02ca6
fix: accounts need to be rent exempt
thlorenz May 11, 2026
83532bd
chore: parallel airdrops
thlorenz May 11, 2026
ae878d2
fix: report failed tx status
thlorenz May 11, 2026
a0028ba
chore: confirm sig improvements
thlorenz May 11, 2026
aa96827
fix: relax load checkpoint matching
thlorenz May 11, 2026
8b7ee7e
fix: name dual restart balances
thlorenz May 11, 2026
bd5533a
fix(grpc-service): remove redundant app shutdown binding
thlorenz May 14, 2026
aaea6b0
Avoid readiness setup for Kafka preflight probe
thlorenz May 14, 2026
7dc2820
fix: remove extra artifact path indirection
thlorenz May 14, 2026
037ddda
fix(ix-tests): handle invalid stream pubkeys gracefully
thlorenz May 14, 2026
b001494
fix: preserve ix-test failure errors
thlorenz May 14, 2026
3bf5d5f
fix: lock observation update once
thlorenz May 14, 2026
4b43470
fix: ensure single-load service shutdown
thlorenz May 14, 2026
bc81a7d
fix: always stop single triage service
thlorenz May 14, 2026
80e84d9
docs: document service handle ownership
thlorenz May 14, 2026
1d7576f
fix: confirm payer airdrop
thlorenz May 14, 2026
2c290fc
fix: terminate matching ksql queries
thlorenz May 14, 2026
94bedcb
fix: normalize KSQL table casing
thlorenz May 14, 2026
8641b6e
chore: format client update parsing
thlorenz May 14, 2026
eb78cfe
fix: avoid blocking kafka preflight
thlorenz May 14, 2026
03b8a5b
fix: guard observation snapshot bounds
thlorenz May 14, 2026
aa2d907
fix: preserve single-load failure clients
thlorenz May 14, 2026
0b5ba53
fix: preserve single-triage failure clients
thlorenz May 14, 2026
dc0990b
fix: keep readiness timeout error primary
thlorenz May 14, 2026
31dcb63
fix: bound readiness probe attempts
thlorenz May 14, 2026
13e3201
fix: use uppercased reset stream check
thlorenz May 14, 2026
416007e
fix: match ksql object names exactly
thlorenz May 14, 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
41 changes: 41 additions & 0 deletions Cargo.lock

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

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[workspace]
members = ["event-proto", "grpc-service", "geyser-plugin"]
members = ["event-proto", "grpc-service", "geyser-plugin", "ix-tests"]
resolver = "2"
20 changes: 20 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ CLIENT_REST ?= http://127.0.0.1:3030
kafka-ready \
kafka-ui \
kafka-ui-down \
ix-tests-build \
ix-tests-run \
ix-tests-scenario \
grpc-service-run \
grpc-service-build \
grpc-service-client \
Expand All @@ -27,6 +30,9 @@ help:
@echo " kafka-ready - Start the stack and initialize stream/table/schema"
@echo " kafka-ui - Start Redpanda Console"
@echo " kafka-ui-down - Stop Redpanda Console"
@echo " ix-tests-build - Build the gRPC service binary and the ix-tests harness"
@echo " ix-tests-run - Run the full local integration suite"
@echo " ix-tests-scenario - Run one integration scenario (SCENARIO=...)"
@echo " grpc-service-run - Run the gRPC service"
@echo " grpc-service-build - Build the gRPC service package"
@echo " grpc-service-client - Run the example gRPC client"
Expand Down Expand Up @@ -61,6 +67,20 @@ kafka-ui:
kafka-ui-down:
$(MAKE) -C kafka-setup ui-down

kafka-reset-state:
$(MAKE) -C kafka-setup reset-state

ix-tests-build:
cargo build -p magigblock-grpc-service
cargo build -p ix-tests

ix-tests-run:
cargo run -p ix-tests -- --config ix-tests/configs/suite.toml --scenario all

ix-tests-scenario:
@test -n "$(SCENARIO)" || (echo "Provide SCENARIO=..." >&2; exit 1)
cargo run -p ix-tests -- --config ix-tests/configs/suite.toml --scenario "$(SCENARIO)"

grpc-service-run:
$(MAKE) -C grpc-service run

Expand Down
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ This repo contains the MagicBlock account update pipeline:
- `event-proto/`: shared Rust crate `magigblock-event-proto`
- `grpc-service/`: Rust crate `magigblock-grpc-service`
- `geyser-plugin/`: Solana Geyser plugin crate
- `ix-tests/`: local end-to-end gRPC integration harness
- `kafka-setup/`: minimal Kafka/ksqlDB local environment
- `Makefile`: top-level operator entrypoint

Expand All @@ -36,10 +37,15 @@ cargo test --workspace -- --test-threads=16
- `make kafka-ready`
- `make kafka-ui`
- `make kafka-ui-down`
- `make ix-tests-build`
- `make ix-tests-run`
- `make ix-tests-scenario SCENARIO=single-basic`
- `make grpc-service-run`
- `make grpc-service-build`
- `make grpc-service-client`
- `make grpc-service-client-add-sub PUBKEY=<base58-pubkey>`
- `make grpc-service-client-remove-sub PUBKEY=<base58-pubkey>`
- `make geyser-plugin-build`
- `make geyser-plugin-launch`

The integration suite assumes Kafka/ksqlDB and the validator-with-plugin are already up. Scenarios are isolated and can be run individually. Failure artifacts are written under `target/ix-tests/failures/`.
28 changes: 20 additions & 8 deletions geyser-plugin/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
.PHONY: help build build-plugin launch init-config clean

MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
PLUGIN_EXT := so
Expand All @@ -18,14 +20,6 @@ help:
@echo " make launch - Launch solana-test-validator with the plugin (depends on build-plugin)"
@echo " make clean - Remove compiled artifacts"

init-config:
@echo "Creating $(PLUGIN_CONFIG)..."
@perl -0pe 's#(?<!\.\./)target/release/libsolana_accountsdb_plugin_kafka\.(?:dylib|so)#$(PLUGIN_PATH)#g' configs/plugin-config.example.toml > "$(PLUGIN_CONFIG)"
@echo "Creating $(VALIDATOR_CONFIG)..."
@perl -0pe 's#(?<!\.\./)target/release/libsolana_accountsdb_plugin_kafka\.(?:dylib|so)#$(PLUGIN_PATH)#g; s#plugin-config\.toml#$(PLUGIN_CONFIG)#g' configs/plugin-config.example.json > "$(VALIDATOR_CONFIG)"
@echo "✓ Created $(PLUGIN_CONFIG)"
@echo "✓ Created $(VALIDATOR_CONFIG)"

build-plugin:
@echo "Building plugin for $(UNAME_S)..."
cargo build --release
Expand All @@ -46,8 +40,26 @@ launch: build-plugin
exit 1; \
fi; \
fi
cd "$(MAKEFILE_DIR)" && \
solana-test-validator --log --reset --geyser-plugin-config "$(VALIDATOR_CONFIG)"

init-config:
@echo "Creating $(VALIDATOR_CONFIG) and $(PLUGIN_CONFIG) for $(UNAME_S) (.$(PLUGIN_EXT))..."
@if [ -f "$(VALIDATOR_CONFIG)" ]; then \
echo "Error: $(VALIDATOR_CONFIG) already exists, refusing to overwrite"; \
exit 1; \
fi
@if [ -f "$(PLUGIN_CONFIG)" ]; then \
echo "Error: $(PLUGIN_CONFIG) already exists, refusing to overwrite"; \
exit 1; \
fi
@sed -e 's|path-to-plugin-library|$(PLUGIN_PATH)|' \
-e 's|plugin-config.toml|$(PLUGIN_CONFIG)|' \
./configs/plugin-config.example.json > "$(VALIDATOR_CONFIG)"
@cp ./configs/plugin-config.example.toml "$(PLUGIN_CONFIG)"
@echo "Created $(VALIDATOR_CONFIG) (libpath: $(PLUGIN_PATH))"
@echo "Created $(PLUGIN_CONFIG)"

clean:
cargo clean
@echo "Cleaned build artifacts"
Expand Down
2 changes: 1 addition & 1 deletion geyser-plugin/configs/plugin-config.example.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"libpath": "../target/release/libsolana_accountsdb_plugin_kafka.so",
"libpath": "path-to-plugin-library",
"config_file": "plugin-config.toml"
}
3 changes: 2 additions & 1 deletion geyser-plugin/src/account_update_publisher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,9 @@ fn publish_raw_account_update(
) -> PluginResult<()> {
if let Ok(key) = <[u8; 32]>::try_from(event.pubkey.as_slice()) {
debug!(
"Matched account update {} in slot {}",
"Matched account update {} lamports {} in slot {}",
Pubkey::new_from_array(key),
event.lamports,
event.slot
);
}
Expand Down
1 change: 1 addition & 0 deletions grpc-service/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ serde_json = "1.0"
toml = "0.9.12"
tokio = { version = "1.47", features = ["macros", "rt-multi-thread", "signal"] }
tokio-stream = { version = "0.1", features = ["net"] }
tokio-util = { version = "0.7", features = ["rt"] }
tonic = { version = "0.12", features = ["transport"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
Expand Down
Loading