Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
827b7d9
Upgrade docker base ubuntu image to 24.04
satyamz Jun 16, 2026
a60e765
Update docker file to support 24.04
satyamz Jun 16, 2026
717afdd
Protocol 28 (CAP-0083) support
sisuresh Jun 23, 2026
3a3b133
Merge pull request #789 from sisuresh/p28-cap-0083
sisuresh Jun 23, 2026
18b6213
SPIKE: Protocol 28 (CAP-0085)
sisuresh Jul 22, 2026
593c763
rpc: re-pin go-stellar-sdk to merged upstream commit; drop SPIKE allo…
sisuresh Jul 22, 2026
66a50c4
rpc: drop 'next' from soroban-env-host-curr so curr host is protocol 28
sisuresh Jul 23, 2026
20b6a28
rpc: pin P28 integration core to vnext 3444 (0e3d3d955) matching the …
sisuresh Jul 23, 2026
0c06b41
Merge pull request #891 from sisuresh/p28-cap-0085
sisuresh Jul 24, 2026
ef77a26
Merge branch 'main' into upgrade-bas-image
satyamz Jul 28, 2026
9af7da8
Merge pull request #790 from satyamz/upgrade-bas-image
satyamz Jul 28, 2026
f87cf19
Add Go benchmark leg in release performance evaluation suite (#861)
cjonas9 Jul 28, 2026
bdb882c
Add blaster test for endpoint performance evaluation (#855)
cjonas9 Jul 29, 2026
c86fead
Remove the Soroban Tools e2e workflow (#909)
marwen-abid Jul 31, 2026
0fe7119
Protocol 28 GA: crates.io host, stellar-core, SDK P28 pins (#913)
Shaptic Aug 3, 2026
ac7c8af
Merge main into protocol-next ahead of the Protocol 28 GA merge
Shaptic Aug 3, 2026
e6bb90b
Merge pull request #915 from stellar/protocol-next
Shaptic Aug 3, 2026
7ee82fa
Merge remote-tracking branch 'origin/main' into karthik/merge-main-in…
karthikiyer56 Aug 4, 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
39 changes: 0 additions & 39 deletions .github/workflows/e2e.yml

This file was deleted.

47 changes: 43 additions & 4 deletions .github/workflows/ec2-leg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ name: Perf-eval EC2 leg (ephemeral)
# Does not post to the PR -- the coordinator owns human-facing output.
# Box bootstrap: perf-eval/bootstrap-common.sh + the leg script (inputs.leg_script);
# runner-side polling: perf-eval/gather.
# Legs can chain via keep_instance + adopt_run_label + the instance_ip output.

on:
# workflow_call is the only trigger: a leg runs through the coordinator.
Expand Down Expand Up @@ -62,6 +63,20 @@ on:
required: false
type: string
default: ''
keep_instance:
description: 'Leave a passing leg''s box running for a chained successor; the box then owns its shutdown. A failing leg terminates as usual.'
required: false
type: boolean
default: false
adopt_run_label:
description: 'run_label of a prior keep_instance leg whose box this leg also terminates when it passes'
required: false
type: string
default: ''
outputs:
instance_ip:
description: 'Private IPv4 of the launched box, for chained legs'
value: ${{ jobs.ec2-leg.outputs.instance_ip }}
secrets:
AWS_GHA_ROLE_ARN:
description: 'OIDC role ARN to assume for EC2 + S3 access'
Expand All @@ -75,6 +90,8 @@ permissions:
jobs:
ec2-leg:
name: Launch + await ephemeral perf-eval box
outputs:
instance_ip: ${{ steps.launch.outputs.instance_ip }}
# Non-cancelling group keyed on the test commit SHA + leg. An instance can run
# until the box’s self-terminate ceiling, so new runs queue.
concurrency:
Expand Down Expand Up @@ -149,7 +166,7 @@ jobs:
echo '#!/usr/bin/env bash'
echo "export TARGET_SHA=${{ steps.resolve.outputs.sha }} RUN_ID=${{ github.run_id }}-${{ github.run_attempt }}"
echo "export BUCKET=$BUCKET RESULT_KEY=$RESULT_KEY"
echo "export SELF_TERMINATE_MINUTES=$SELF_TERMINATE_MINUTES"
echo "export SELF_TERMINATE_MINUTES=$SELF_TERMINATE_MINUTES BUDGET_MINUTES=${{ inputs.budget_minutes }}"
if [ -n "$EXTRA_ENV" ]; then printf '%s\n' "$EXTRA_ENV"; fi
cat "$PERF_EVAL_DIR/bootstrap-common.sh"
cat "$LEG_SCRIPT"
Expand Down Expand Up @@ -190,6 +207,7 @@ jobs:

INSTANCE_ID=$(printf '%s' "$RUN_INSTANCES_JSON" | jq -r '.Instances[0].InstanceId')
echo "instance_id=$INSTANCE_ID" >> "$GITHUB_OUTPUT"
echo "instance_ip=$(printf '%s' "$RUN_INSTANCES_JSON" | jq -r '.Instances[0].PrivateIpAddress')" >> "$GITHUB_OUTPUT"

- name: Wait for SSM agent to register
env:
Expand Down Expand Up @@ -257,8 +275,29 @@ jobs:
exit 1
fi

# The adopted box is tag-discovered. Adoption fires only on a pass. Note that
# a failed leg leaves the box to its serve ceiling so a re-run can reuse it.
- name: Terminate instance
if: always() && steps.launch.outputs.instance_id != ''
if: always()
env:
INSTANCE_ID: ${{ steps.launch.outputs.instance_id }}
KEEP_INSTANCE: ${{ inputs.keep_instance }}
LEG_PASSED: ${{ steps.results.outputs.passed }}
ADOPT_RUN_LABEL: ${{ inputs.adopt_run_label }}
run: |
aws ec2 terminate-instances \
--instance-ids ${{ steps.launch.outputs.instance_id }} || true
if [ "$KEEP_INSTANCE" = "true" ] && [ "$LEG_PASSED" = "true" ]; then
echo "keep_instance: leaving $INSTANCE_ID running for the chained leg"
elif [ -n "$INSTANCE_ID" ]; then
aws ec2 terminate-instances --instance-ids "$INSTANCE_ID" || true
fi
if [ -n "$ADOPT_RUN_LABEL" ] && [ "$LEG_PASSED" = "true" ]; then
ADOPTED=$(aws ec2 describe-instances \
--filters "Name=tag:run-id,Values=${{ github.run_id }}" \
"Name=tag:Name,Values=perf-eval-$ADOPT_RUN_LABEL" \
"Name=instance-state-name,Values=pending,running" \
--query 'Reservations[].Instances[].InstanceId' --output text || true)
if [ -n "$ADOPTED" ]; then
echo "terminating adopted box(es): $ADOPTED"
aws ec2 terminate-instances --instance-ids $ADOPTED || true
fi
fi
78 changes: 67 additions & 11 deletions .github/workflows/load-test-coordinator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ jobs:
target_sha: ${{ steps.ctx.outputs.target_sha }}
pr_number: ${{ steps.ctx.outputs.pr_number }}
legs: ${{ steps.ctx.outputs.legs }}
matrix_legs: ${{ steps.ctx.outputs.matrix_legs }}
steps:
- uses: actions/checkout@v4
with:
Expand All @@ -62,35 +63,89 @@ jobs:
PR="$(gh pr list --repo "${{ github.repository }}" --state open \
--head "$REF" --json number --jq '.[0].number // ""' 2>/dev/null || true)"
fi
LEGS='[
# go-bench baseline: latest published release, falls back to the highest v* tag.
BASELINE="$(gh api "repos/${{ github.repository }}/releases/latest" --jq .tag_name 2>/dev/null || true)"
if [ -z "$BASELINE" ]; then
BASELINE="$(git ls-remote --tags --refs origin 'v[0-9]*' \
| sed 's|.*refs/tags/||' | sort -V | tail -n 1 || true)"
fi
[ -n "$BASELINE" ] || echo "::warning::no baseline release found; the go-bench leg will fail"
echo "go-bench baseline: ${BASELINE:-<none>}"

# One roster (comment order) drives both the report job and the
# matrix fan-out: entries carrying a script ride the matrix; the
# chained backfill + blaster pair runs as explicit jobs below.
# Unquoted heredoc so $BASELINE expands into the go-bench entry;
LEGS="$(jq -c . <<EOF
[
{"label":"Apply-load ingestion","run_label":"apply-load","script":"cmd/stellar-rpc/internal/rpcv1/integrationtest/infrastructure/perf-eval/ingest-load-test/run-load-test.sh","budget":225},
{"label":"Backfill ingestion","run_label":"backfill","script":"cmd/stellar-rpc/internal/rpcv1/integrationtest/infrastructure/perf-eval/backfill-test/run-backfill.sh","budget":345}
]'
{"label":"Backfill ingestion","run_label":"backfill"},
{"label":"Endpoint load test","run_label":"blaster"},
{"label":"Go endpoint benchmarks","run_label":"go-bench","script":"cmd/stellar-rpc/internal/rpcv1/integrationtest/infrastructure/perf-eval/go-bench/run-go-bench.sh","budget":120,"root_volume_gb":50,"extra_env":"export BASELINE_REF=$BASELINE"}
]
EOF
)"
{
echo "target_sha=$SHA"
echo "pr_number=$PR"
echo "legs=$(jq -c . <<<"$LEGS")"
echo "legs=$LEGS"
echo "matrix_legs=$(jq -c 'map(select(.script))' <<<"$LEGS")"
} >> "$GITHUB_OUTPUT"

# The fan-out: one matrix entry per leg.
# The fan-out: one matrix entry per independent leg.
load-test:
name: ${{ matrix.leg.label }}
needs: plan
strategy:
fail-fast: false # stops one leg's failure from cancelling other legs
matrix:
leg: ${{ fromJSON(needs.plan.outputs.legs) }}
leg: ${{ fromJSON(needs.plan.outputs.matrix_legs) }}
uses: ./.github/workflows/ec2-leg.yml
secrets: inherit
with:
target_ref: ${{ needs.plan.outputs.target_sha }}
run_label: ${{ matrix.leg.run_label }}
leg_script: ${{ matrix.leg.script }}
budget_minutes: ${{ matrix.leg.budget }}
# optional per-leg fields; fallbacks mirror the ec2-leg.yml defaults
root_volume_gb: ${{ matrix.leg.root_volume_gb || 500 }}
extra_env: ${{ matrix.leg.extra_env || '' }}

# Chained pair, serving side (keep box's RPC serving for the blaster leg).
backfill:
name: Backfill ingestion
needs: plan
uses: ./.github/workflows/ec2-leg.yml
secrets: inherit
with:
target_ref: ${{ needs.plan.outputs.target_sha }}
run_label: backfill
leg_script: cmd/stellar-rpc/internal/rpcv1/integrationtest/infrastructure/perf-eval/backfill-test/run-backfill.sh
budget_minutes: 345
keep_instance: true
extra_env: |
export SERVE_AFTER_BACKFILL=true

# Chained pair, blasting side: starts once backfill's leg passes (its box then
# enters catchup), probes the handed-off address until healthy, then blasts.
blaster:
name: Endpoint load test
needs: [plan, backfill]
uses: ./.github/workflows/ec2-leg.yml
secrets: inherit
with:
target_ref: ${{ needs.plan.outputs.target_sha }}
run_label: blaster
leg_script: cmd/stellar-rpc/internal/rpcv1/integrationtest/infrastructure/perf-eval/endpoint-load-test/run-blaster.sh
budget_minutes: 255
root_volume_gb: 50
adopt_run_label: backfill
extra_env: |
export TARGET_RPC=http://${{ needs.backfill.outputs.instance_ip }}:8000

report:
name: Aggregate + report
needs: [plan, load-test]
needs: [plan, load-test, backfill, blaster]
if: ${{ !cancelled() }}
runs-on: ubuntu-latest
timeout-minutes: 10
Expand Down Expand Up @@ -161,13 +216,14 @@ jobs:
fi
fi

# Authoritative gate: reflects the load-test legs, independent of whether
# the comment posted.
- name: Set overall status
if: always()
env:
NEEDS: ${{ toJSON(needs) }}
run: |
if [ "${{ needs.load-test.result }}" != "success" ]; then
echo "::error::one or more legs did not pass (aggregate result: ${{ needs.load-test.result }})"
FAILED=$(jq -r '[to_entries[] | select(.value.result != "success") | .key] | join(", ")' <<<"$NEEDS")
if [ -n "$FAILED" ]; then
echo "::error::jobs did not pass: $FAILED"
exit 1
fi
echo "all load-test legs passed"
24 changes: 14 additions & 10 deletions .github/workflows/stellar-rpc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,21 +81,25 @@ jobs:
CGO_ENABLED: 1
GOARCH: ${{ matrix.go_arch }}

integration-p26-pkg:
name: Integration tests (P26)
uses: ./.github/workflows/integration-tests.yml
with:
protocol_version: '26'
core_deb_version: '26.0.0-3089.8e43a2d3b.jammy'
core_docker_img: 'stellar/stellar-core:26.0.0-3089.8e43a2d3b.jammy'

integration-p27-pkg:
name: Integration tests (P27)
uses: ./.github/workflows/integration-tests.yml
with:
protocol_version: '27'
core_deb_version: '27.0.0-3288.7696c069d.jammy'
core_docker_img: 'stellar/stellar-core:27.0.0-3288.7696c069d.jammy'
core_deb_version: '28.0.0-3486.2332980a1.jammy'
core_docker_img: 'stellar/unsafe-stellar-core:28.0.0-3486.2332980a1.jammy'

integration-p28-pkg:
name: Integration tests (P28)
uses: ./.github/workflows/integration-tests.yml
with:
protocol_version: '28'
# Protocol 28 GA core release. Its src/rust/soroban/p28 submodule is
# rs-soroban-env v28.0.0 (ba37ea5f) — the same release soroban-env-host-curr
# pins from crates.io, keeping simulation cost models identical to
# apply-time metering.
core_deb_version: '28.0.0-3486.2332980a1.jammy'
core_docker_img: 'stellar/unsafe-stellar-core:28.0.0-3486.2332980a1.jammy'

# integration-p25-src:
# name: Integration tests (p25, core from source)
Expand Down
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

## Unreleased

## [v28.0.0](https://github.com/stellar/stellar-rpc/compare/v27.1.1...v28.0.0)

### Added
* XDR has been updated to support Protocol 28 (CAP-0083, CAP-0085) ([#913](https://github.com/stellar/stellar-rpc/pull/913)).
* The preflight hosts have been rotated to soroban-env-host 28.0.1 (27.0.1 for the previous protocol) and integration tests now run against stellar-core 28.0.0 ([#913](https://github.com/stellar/stellar-rpc/pull/913)).

## [v27.1.1](https://github.com/stellar/stellar-rpc/compare/v27.1.0...v27.1.1)

### Fixed
Expand All @@ -19,7 +25,6 @@
* Query performance improvements via caching ([#801](https://github.com/stellar/stellar-rpc/pull/801)).
* `simulateTransaction` now returns the ledger's close time rather than the execution timestamp to accurately reflect simulation state ([#742](https://github.com/stellar/stellar-rpc/pull/742)).


## [v27.0.0](https://github.com/stellar/stellar-rpc/compare/v26.0.1...v27.0.0)

### Breaking Changes
Expand Down
Loading
Loading