Skip to content
Merged
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
47 changes: 47 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -167,3 +167,50 @@ jobs:
status=$?
kill "$broker" 2>/dev/null || true
exit $status

# External-toolchain interop: an independent, third-party AMQP 1.0 client
# stack (Apache Qpid JMS, pure Java) exercising ramqp-broker — the JMS leg of
# broker.md Phase 10, alongside the Rust fe2o3-amqp leg in bench-compare. The
# runner fetches qpid-jms, compiles the client, and runs the #[ignore]d
# jms_interop test (which starts a loopback broker in-process).
interop-jms:
name: Interop (Qpid JMS -> ramqp-broker)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'
- name: Qpid JMS interop
run: ramqp-broker/tests/interop/jms/run.sh

# External-toolchain interop: Apache Qpid Proton (Python, the C-based AMQP 1.0
# engine) exercising ramqp-broker — a third independent stack after fe2o3-amqp
# (Rust) and Qpid JMS (Java). Installs proton on the runner; run.sh takes the
# host path.
interop-proton:
name: Interop (Qpid Proton -> ramqp-broker)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install python3-qpid-proton
run: sudo apt-get update -qq && sudo apt-get install -y -qq python3-qpid-proton
- name: Qpid Proton interop
run: ramqp-broker/tests/interop/proton/run.sh

# Process-level split-brain: a 3-node quorum cluster across Linux network
# namespaces, iptables-partitioned into majority/minority, asserting the
# majority stays available, the minority refuses (never silently accepts),
# and no committed message is lost on heal. Needs root (netns + iptables);
# the script self-elevates via sudo.
partition:
name: Partition (netns split-brain)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Network-partition test
run: ramqp-broker/tests/partition/run.sh
33 changes: 29 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@ name: Release
# (Settings -> Secrets and variables -> Actions). Create the token at
# https://crates.io/settings/tokens with the "publish-update" scope.
#
# Publish ORDER matters (see RELEASING.md): `ramqp` depends on `ramqp-core`
# by version, so core must land on crates.io first. `ramqp-broker` is not
# published yet (pre-alpha); `bench-compare` is publish = false.
# Publish ORDER matters (see RELEASING.md): `ramqp` and `ramqp-broker` both
# depend on `ramqp-core` by version, so core must land on crates.io first.
# `bench-compare` is publish = false.
#
# NOTE: the token needs the "publish-new" scope for a crate's FIRST-ever
# publish (publish-update alone fails on a new crate name).

on:
push:
Expand Down Expand Up @@ -55,7 +58,29 @@ jobs:
done
echo "index never showed ramqp-core $core_version"; exit 1
- name: Publish ramqp
run: cargo publish -p ramqp --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
# Skips cleanly if this version of ramqp is already published
# (e.g. a broker-only release retagging the same client version).
run: |
if cargo publish -p ramqp --token ${{ secrets.CARGO_REGISTRY_TOKEN }} 2>err.log; then
echo "ramqp published"
elif grep -q "already exists" err.log; then
echo "ramqp version already on crates.io; continuing"
else
cat err.log; exit 1
fi
- name: Publish ramqp-broker
# Same tolerance: a client-only release may retag the same broker
# version. The broker's registry dependency is only ramqp-core (the
# `ramqp` dev-dependency is path-only and stripped at packaging), so
# the core index wait above is the only ordering it needs.
run: |
if cargo publish -p ramqp-broker --token ${{ secrets.CARGO_REGISTRY_TOKEN }} 2>err.log; then
echo "ramqp-broker published"
elif grep -q "already exists" err.log; then
echo "ramqp-broker version already on crates.io; continuing"
else
cat err.log; exit 1
fi

release:
name: Create GitHub Release
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,6 @@ ramqp-core/fuzz/coverage/
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

# Generated by bench-compare/tuned/run.sh (provisional numbers live in the README)
bench-compare/tuned/results.md
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,29 @@ All notable changes to ramqp will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.8.2] - unreleased

### Added
- **`ramqp-broker` publishes to crates.io, first release 0.9.0.** The broker
(transient + Raft-replicated quorum + redb-durable queues, clustering with
leader routing, policies, transactions, management endpoint) ships as a
library crate and the `ramqp-brokerd` daemon (`cargo install ramqp-broker`).
Its config types (`BrokerConfig`, `QueuePolicy`, `OverflowBehavior`,
`ClusterMemberConfig`) are now `#[non_exhaustive]` — construct via
`Default`/`new` and set fields — so future knobs arrive without build
breaks. Pre-1.0: the Rust API may still change additively across 0.x.

### Fixed
- **`ramqp-core` (0.2.5): a session now keys links by (name, role), not name
alone.** AMQP 1.0 §2.6.1 identifies a link by container-id + name + *role*, so
a peer may open a sender and a receiver that share a link name on one session.
The engine previously keyed by name only, so the second same-named attach was
misrouted and dropped — breaking Apache Qpid Proton, whose default link names
are derived from the address (identical for both directions). Found by the new
broker↔proton interop leg; regression-tested in `ramqp-core`. The `ramqp`
client is unaffected in practice (it generates unique link names), but ships
the corrected engine.

## [0.8.1] - 2026-07-13

### Security
Expand Down
Loading
Loading