Release v28.0.0 - #929
Conversation
The train has run its integration legs against stellar/unsafe-stellar-core because the GA docker repo lags the GitHub release by days. Both 28.0.0-3494.a9b861321.jammy and .noble are now published under stellar/stellar-core, so the release legs pin the GA repo. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Promotes Protocol 28 integration tests from the unsafe Stellar Core image repository to the GA repository.
Changes:
- Updates P27 and P28 integration legs to use the GA Core image.
- Keeps existing Core version and Debian package pins unchanged.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
… cut The v28.0.0 section landed with #913, when the release branch pointed at the protocol-next merge. Re-syncing to main brought in #854 (backfill bulk-load) and #928 (dependency bump + slimmer release image), so the section now names them. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
🧪 Performance Evaluation Test #2Commit: ✅ Apply-load ingestion — verdict: ok📈 Ingest load test —
|
| Profile | Ledgers | ms/ledger | p50 / p95 / p99 ms | max ms |
|---|---|---|---|---|
| load-test-ledgers-v27-oz | 1000 | 1195.999 | 1112.906 / 1628.843 / 1905.361 | 3415.092 |
| load-test-ledgers-v27-sac | 1000 | 1096.055 | 1106.051 / 1178.737 / 1233.652 | 1302.892 |
| load-test-ledgers-v27-soroswap | 1000 | 789.852 | 800.728 / 865.722 / 920.589 | 1035.745 |
| Metric | Value |
|---|---|
| Ledgers replayed | 3000 |
| Initial DB ledger count | 120960 |
| Throughput | 0.94 ledgers/sec |
| Elapsed wall-clock | 3190.274s |
| Ingest busy-time | 3081.906s (96.6% utilization) |
| Per-ledger p50 / p95 / p99 | 1049.948 / 1416.523 / 1732.891 ms |
| Golden DB fetch+decompress | 2421s |
| stellar-core | v27.0.0 |
| Workflow run | #31829840856-1 |
✅ Backfill ingestion — verdict: ok
⏳ Backfill ingestion — e29c911f2a72
| Metric | Value |
|---|---|
| Ledgers ingested | 120960 ([63833728 -> 63954687]) |
| Retention window | 120960 |
| Wall-clock (total) | 3h11m27s |
| Ingest phase | 2h41m20s |
| Bulk-load finalize phase | 30m7s |
| Ledgers/sec (ingest) | 12.5 |
✅ Endpoint load test — verdict: ok
🎯 Endpoint load test — e29c911f2a72
Serial blast per endpoint (ramp-up 2m, duration 3m, blaster 5b6e13046218) against the backfilled RPC (ledgers [63834432, 63955391], handoff wait 1593s).
| Endpoint | Target RPS | Requests | Errors | p50 (ms) | p95 (ms) | p99 (ms) | p99.9 (ms) |
|---|---|---|---|---|---|---|---|
| getFeeStats | 15 | 2075 | 0 (0.0%) | 0.8 | 10.7 | 122.8 | 190.8 |
| getHealth | 15 | 2388 | 0 (0.0%) | 0.7 | 10.9 | 112.3 | 195.2 |
| getLatestLedger | 15 | 2301 | 0 (0.0%) | 199.4 | 4526.1 | 6012.9 | 6594.6 |
| getLedgerEntries | 15 | 2075 | 0 (0.0%) | 3.8 | 49.8 | 103.8 | 148.4 |
| getLedgers (limit=1) | 1 | 179 | 0 (0.0%) | 169.9 | 392.7 | 420.1 | 682.0 |
| getNetwork | 15 | 2387 | 0 (0.0%) | 29.5 | 39.2 | 123.8 | 198.1 |
| getTransaction | 15 | 2074 | 0 (0.0%) | 33.6 | 45.2 | 136.6 | 236.5 |
| getTransactions (limit=1) | 1 | 179 | 0 (0.0%) | 68.3 | 81.8 | 87.2 | 423.2 |
| getVersionInfo | 15 | 2377 | 0 (0.0%) | 28.9 | 39.0 | 105.9 | 178.6 |
✅ Go endpoint benchmarks — verdict: ok
Baseline v27.1.1 (7e7128153191) vs candidate e29c911f2a72 — -benchmem -count=10, both refs sequentially on one box.
benchstat: baseline vs candidate
goos: linux
goarch: amd64
pkg: github.com/stellar/stellar-rpc/cmd/stellar-rpc/internal/db
cpu: Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz
│ baseline.txt │ candidate.txt │
│ sec/op │ sec/op vs base │
GetLedgerRange-8 973.2n ± 1% 964.2n ± 2% ~ (p=0.315 n=10)
BatchGetLedgers-8 800.7µ ± 3% 782.5µ ± 3% ~ (p=0.247 n=10)
geomean 27.91µ 27.47µ -1.61%
│ baseline.txt │ candidate.txt │
│ B/op │ B/op vs base │
GetLedgerRange-8 16.00 ± 0% 16.00 ± 0% ~ (p=1.000 n=10) ¹
BatchGetLedgers-8 466.7Ki ± 0% 474.7Ki ± 0% +1.71% (p=0.000 n=10)
geomean 2.700Ki 2.723Ki +0.85%
¹ all samples are equal
│ baseline.txt │ candidate.txt │
│ allocs/op │ allocs/op vs base │
GetLedgerRange-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹
BatchGetLedgers-8 2.914k ± 0% 2.914k ± 0% ~ (p=1.000 n=10) ¹
geomean 108.0 108.0 +0.00%
¹ all samples are equal
pkg: github.com/stellar/stellar-rpc/cmd/stellar-rpc/internal/feewindow
│ baseline.txt │ candidate.txt │
│ sec/op │ sec/op vs base │
ComputeFeeDistribution/computeFeeDistribution-8 8.808µ ± 0% 8.858µ ± 0% +0.57% (p=0.000 n=10)
ComputeFeeDistribution/alternativeComputeFeeDistribution-8 211.5µ ± 4% 215.0µ ± 3% ~ (p=0.143 n=10)
geomean 43.16µ 43.64µ +1.11%
│ baseline.txt │ candidate.txt │
│ B/op │ B/op vs base │
ComputeFeeDistribution/computeFeeDistribution-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹
ComputeFeeDistribution/alternativeComputeFeeDistribution-8 565.4Ki ± 0% 565.4Ki ± 0% ~ (p=1.000 n=10)
geomean ² +0.00% ²
¹ all samples are equal
² summaries must be >0 to compute geomean
│ baseline.txt │ candidate.txt │
│ allocs/op │ allocs/op vs base │
ComputeFeeDistribution/computeFeeDistribution-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹
ComputeFeeDistribution/alternativeComputeFeeDistribution-8 30.00 ± 0% 30.00 ± 0% ~ (p=1.000 n=10) ¹
geomean ² +0.00% ²
¹ all samples are equal
² summaries must be >0 to compute geomean
pkg: github.com/stellar/stellar-rpc/cmd/stellar-rpc/internal/methods
│ baseline.txt │ candidate.txt │
│ sec/op │ sec/op vs base │
GetEventsTopicFilters-8 3.134m ± 8% 2.953m ± 4% ~ (p=0.105 n=10)
GetEvents-8 161.4µ ± ∞ ¹ 158.3µ ± ∞ ¹ ~ (p=1.000 n=1) ²
GetLedgers-8 1.344m ± ∞ ¹ 1.328m ± ∞ ¹ ~ (p=1.000 n=1) ²
JSONTransactions/JSON_format-8 8.973µ ± 6% 9.027µ ± 5% ~ (p=0.986 n=10)
JSONTransactions/XDR_format-8 2.826µ ± 1% 2.805µ ± 1% -0.74% (p=0.002 n=10)
GetProtocolVersion-8 44.66µ ± ∞ ¹ 43.75µ ± ∞ ¹ ~ (p=1.000 n=1) ²
geomean 95.74µ 93.95µ -1.86%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05
│ baseline.txt │ candidate.txt │
│ B/op │ B/op vs base │
GetEventsTopicFilters-8 192.1Ki ± 2% 195.2Ki ± 2% ~ (p=0.089 n=10)
GetEvents-8 42.97Ki ± ∞ ¹ 43.15Ki ± ∞ ¹ ~ (p=1.000 n=1) ²
GetLedgers-8 1.317Mi ± ∞ ¹ 1.324Mi ± ∞ ¹ ~ (p=1.000 n=1) ²
JSONTransactions/JSON_format-8 2.000Ki ± 0% 2.000Ki ± 0% ~ (p=1.000 n=10) ³
JSONTransactions/XDR_format-8 1.336Ki ± 0% 1.336Ki ± 0% ~ (p=1.000 n=10) ³
GetProtocolVersion-8 7.454Ki ± ∞ ¹ 7.453Ki ± ∞ ¹ ~ (p=1.000 n=1) ²
geomean 24.60Ki 24.71Ki +0.44%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05
³ all samples are equal
│ baseline.txt │ candidate.txt │
│ allocs/op │ allocs/op vs base │
GetEventsTopicFilters-8 1.563k ± 3% 1.564k ± 2% ~ (p=0.870 n=10)
GetEvents-8 621.0 ± ∞ ¹ 621.0 ± ∞ ¹ ~ (p=1.000 n=1) ²
GetLedgers-8 5.322k ± ∞ ¹ 5.322k ± ∞ ¹ ~ (p=1.000 n=1) ²
JSONTransactions/JSON_format-8 25.00 ± 0% 25.00 ± 0% ~ (p=1.000 n=10) ²
JSONTransactions/XDR_format-8 23.00 ± 0% 23.00 ± 0% ~ (p=1.000 n=10) ²
GetProtocolVersion-8 120.0 ± ∞ ¹ 120.0 ± ∞ ¹ ~ (p=1.000 n=1) ²
geomean 266.3 266.3 +0.01%
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
pkg: github.com/stellar/stellar-rpc/cmd/stellar-rpc/internal/preflight
│ baseline.txt │ candidate.txt │
│ sec/op │ sec/op vs base │
GetPreflight-8 868.6µ ± 2% 865.9µ ± 1% ~ (p=0.853 n=10)
│ baseline.txt │ candidate.txt │
│ B/op │ B/op vs base │
GetPreflight-8 52.06Ki ± 0% 52.10Ki ± 0% +0.09% (p=0.000 n=10)
│ baseline.txt │ candidate.txt │
│ allocs/op │ allocs/op vs base │
GetPreflight-8 290.0 ± 0% 290.0 ± 0% ~ (p=1.000 n=10)
Raw benchmark logs (s3://stellar-rpc-ci-load-test/runs/31829840856/go-bench/): baseline.txt, benchstat.txt, candidate.txt
Performance Evaluation Test #1
🧪 Performance Evaluation Test #1
Commit: 9758b752f6d8 (release/v28.0.0)
Run: https://github.com/stellar/stellar-rpc/actions/runs/31754373312
✅ Apply-load ingestion — verdict: ok
📈 Ingest load test — 9758b75
| Profile | Ledgers | ms/ledger | p50 / p95 / p99 ms | max ms |
|---|---|---|---|---|
| load-test-ledgers-v27-oz | 1000 | 1199.174 | 1116.850 / 1623.502 / 1914.253 | 3369.250 |
| load-test-ledgers-v27-sac | 1000 | 1099.466 | 1109.913 / 1181.306 / 1241.283 | 1304.051 |
| load-test-ledgers-v27-soroswap | 1000 | 792.884 | 803.586 / 869.375 / 925.111 | 1036.132 |
| Metric | Value |
|---|---|
| Ledgers replayed | 3000 |
| Initial DB ledger count | 120960 |
| Throughput | 0.94 ledgers/sec |
| Elapsed wall-clock | 3189.788s |
| Ingest busy-time | 3091.524s (96.9% utilization) |
| Per-ledger p50 / p95 / p99 | 1052.660 / 1424.180 / 1725.500 ms |
| Golden DB fetch+decompress | 2425s |
| stellar-core | v27.0.0 |
| Workflow run | #31754373312-1 |
✅ Backfill ingestion — verdict: ok
⏳ Backfill ingestion — 9758b752f6d8
| Metric | Value |
|---|---|
| Ledgers ingested | 120960 ([63821440 -> 63942399]) |
| Retention window | 120960 |
| Wall-clock (total) | 3h7m29s |
| Ingest phase | 2h38m24s |
| Bulk-load finalize phase | 29m5s |
| Ledgers/sec (ingest) | 12.7 |
✅ Endpoint load test — verdict: ok
🎯 Endpoint load test — 9758b752f6d8
Serial blast per endpoint (ramp-up 2m, duration 3m, blaster 5b6e13046218) against the backfilled RPC (ledgers [63822143, 63943102], handoff wait 1548s).
| Endpoint | Target RPS | Requests | Errors | p50 (ms) | p95 (ms) | p99 (ms) | p99.9 (ms) |
|---|---|---|---|---|---|---|---|
| getFeeStats | 15 | 2075 | 0 (0.0%) | 0.7 | 6.3 | 118.5 | 185.3 |
| getHealth | 15 | 2387 | 0 (0.0%) | 0.7 | 6.3 | 94.0 | 186.5 |
| getLatestLedger | 15 | 2385 | 0 (0.0%) | 144.1 | 182.5 | 276.0 | 365.8 |
| getLedgerEntries | 15 | 2074 | 0 (0.0%) | 2.0 | 45.7 | 95.2 | 137.6 |
| getLedgers (limit=1) | 1 | 179 | 0 (0.0%) | 168.2 | 373.0 | 393.5 | 431.1 |
| getNetwork | 15 | 2388 | 0 (0.0%) | 25.1 | 33.1 | 65.4 | 148.0 |
| getTransaction | 15 | 2075 | 0 (0.0%) | 30.2 | 40.4 | 97.4 | 182.4 |
| getTransactions (limit=1) | 1 | 180 | 0 (0.0%) | 64.7 | 83.2 | 132.4 | 466.9 |
| getVersionInfo | 15 | 2377 | 0 (0.0%) | 24.0 | 31.4 | 80.1 | 151.7 |
✅ Go endpoint benchmarks — verdict: ok
Baseline v27.1.1 (7e7128153191) vs candidate 9758b752f6d8 — -benchmem -count=10, both refs sequentially on one box.
benchstat: baseline vs candidate
goos: linux
goarch: amd64
pkg: github.com/stellar/stellar-rpc/cmd/stellar-rpc/internal/db
cpu: Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz
│ baseline.txt │ candidate.txt │
│ sec/op │ sec/op vs base │
GetLedgerRange-8 900.7n ± 0% 892.1n ± 1% -0.94% (p=0.029 n=10)
BatchGetLedgers-8 722.8µ ± 0% 715.1µ ± 2% -1.07% (p=0.035 n=10)
geomean 25.51µ 25.26µ -1.01%
│ baseline.txt │ candidate.txt │
│ B/op │ B/op vs base │
GetLedgerRange-8 16.00 ± 0% 16.00 ± 0% ~ (p=1.000 n=10) ¹
BatchGetLedgers-8 466.7Ki ± 0% 474.7Ki ± 0% +1.71% (p=0.000 n=10)
geomean 2.700Ki 2.723Ki +0.85%
¹ all samples are equal
│ baseline.txt │ candidate.txt │
│ allocs/op │ allocs/op vs base │
GetLedgerRange-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹
BatchGetLedgers-8 2.914k ± 0% 2.914k ± 0% ~ (p=1.000 n=10) ¹
geomean 108.0 108.0 +0.00%
¹ all samples are equal
pkg: github.com/stellar/stellar-rpc/cmd/stellar-rpc/internal/feewindow
│ baseline.txt │ candidate.txt │
│ sec/op │ sec/op vs base │
ComputeFeeDistribution/computeFeeDistribution-8 8.419µ ± 0% 8.490µ ± 0% +0.85% (p=0.000 n=10)
ComputeFeeDistribution/alternativeComputeFeeDistribution-8 199.9µ ± 2% 210.1µ ± 4% +5.12% (p=0.002 n=10)
geomean 41.02µ 42.24µ +2.96%
│ baseline.txt │ candidate.txt │
│ B/op │ B/op vs base │
ComputeFeeDistribution/computeFeeDistribution-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹
ComputeFeeDistribution/alternativeComputeFeeDistribution-8 565.4Ki ± 0% 565.4Ki ± 0% ~ (p=0.263 n=10)
geomean ² +0.00% ²
¹ all samples are equal
² summaries must be >0 to compute geomean
│ baseline.txt │ candidate.txt │
│ allocs/op │ allocs/op vs base │
ComputeFeeDistribution/computeFeeDistribution-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹
ComputeFeeDistribution/alternativeComputeFeeDistribution-8 30.00 ± 0% 30.00 ± 0% ~ (p=1.000 n=10) ¹
geomean ² +0.00% ²
¹ all samples are equal
² summaries must be >0 to compute geomean
pkg: github.com/stellar/stellar-rpc/cmd/stellar-rpc/internal/methods
│ baseline.txt │ candidate.txt │
│ sec/op │ sec/op vs base │
GetEventsTopicFilters-8 2.441m ± 0% 2.464m ± 1% +0.94% (p=0.000 n=10)
GetEvents-8 148.8µ ± ∞ ¹ 152.4µ ± ∞ ¹ ~ (p=1.000 n=1) ²
GetLedgers-8 1.256m ± ∞ ¹ 1.246m ± ∞ ¹ ~ (p=1.000 n=1) ²
JSONTransactions/JSON_format-8 8.216µ ± 1% 8.311µ ± 1% +1.16% (p=0.000 n=10)
JSONTransactions/XDR_format-8 2.685µ ± 1% 2.644µ ± 1% -1.51% (p=0.000 n=10)
GetProtocolVersion-8 41.27µ ± ∞ ¹ 41.72µ ± ∞ ¹ ~ (p=1.000 n=1) ²
geomean 86.37µ 86.84µ +0.54%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05
│ baseline.txt │ candidate.txt │
│ B/op │ B/op vs base │
GetEventsTopicFilters-8 185.2Ki ± 0% 188.6Ki ± 0% +1.83% (p=0.000 n=10)
GetEvents-8 42.96Ki ± ∞ ¹ 43.15Ki ± ∞ ¹ ~ (p=1.000 n=1) ²
GetLedgers-8 1.317Mi ± ∞ ¹ 1.324Mi ± ∞ ¹ ~ (p=1.000 n=1) ²
JSONTransactions/JSON_format-8 2.000Ki ± 0% 2.000Ki ± 0% ~ (p=1.000 n=10) ³
JSONTransactions/XDR_format-8 1.336Ki ± 0% 1.336Ki ± 0% ~ (p=1.000 n=10) ³
GetProtocolVersion-8 7.453Ki ± ∞ ¹ 7.453Ki ± ∞ ¹ ~ (p=1.000 n=1) ³
geomean 24.45Ki 24.57Ki +0.47%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05
³ all samples are equal
│ baseline.txt │ candidate.txt │
│ allocs/op │ allocs/op vs base │
GetEventsTopicFilters-8 1.500k ± 0% 1.505k ± 0% +0.33% (p=0.006 n=10)
GetEvents-8 621.0 ± ∞ ¹ 621.0 ± ∞ ¹ ~ (p=1.000 n=1) ²
GetLedgers-8 5.322k ± ∞ ¹ 5.322k ± ∞ ¹ ~ (p=1.000 n=1) ²
JSONTransactions/JSON_format-8 25.00 ± 0% 25.00 ± 0% ~ (p=1.000 n=10) ²
JSONTransactions/XDR_format-8 23.00 ± 0% 23.00 ± 0% ~ (p=1.000 n=10) ²
GetProtocolVersion-8 120.0 ± ∞ ¹ 120.0 ± ∞ ¹ ~ (p=1.000 n=1) ²
geomean 264.5 264.6 +0.06%
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
pkg: github.com/stellar/stellar-rpc/cmd/stellar-rpc/internal/preflight
│ baseline.txt │ candidate.txt │
│ sec/op │ sec/op vs base │
GetPreflight-8 778.2µ ± 1% 774.6µ ± 1% -0.46% (p=0.029 n=10)
│ baseline.txt │ candidate.txt │
│ B/op │ B/op vs base │
GetPreflight-8 52.06Ki ± 0% 52.10Ki ± 0% +0.09% (p=0.000 n=10)
│ baseline.txt │ candidate.txt │
│ allocs/op │ allocs/op vs base │
GetPreflight-8 290.0 ± 0% 290.0 ± 0% ~ (p=1.000 n=10)
Raw benchmark logs (s3://stellar-rpc-ci-load-test/runs/31754373312/go-bench/): baseline.txt, benchstat.txt, candidate.txt
All three Protocol 28 platform repos now ship against the same released SDK tag. v0.7.2 was cut from SDK main because Horizon's release branch was pinning a pseudo-version to get the XDR asset ordering fix; taking the tag here keeps rpc, Horizon and Galexie on identical SDK code for GA. On top of v0.7.0 this brings SEP-23 strkey payload length validation (go-stellar-sdk#5977), protocol-order asset comparison (go-stellar-sdk#5974), the txnbuild liquidity pool ordering guards (go-stellar-sdk#5978), v0.7.1's ingest single-ledger-walk extraction and a transitive go-xdr bump. Unit tests (including the cgo-linked methods, preflight and xdr2json packages) pass locally against the new pin. Note: this supersedes the 28.0.0-204 staging artifacts, which were built at 9758b75 — the RC deb and image need rebuilding from this commit before the staging sign-off counts. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
Protocol 28 GA release for stellar-rpc. Tracking issue: stellar/go-stellar-sdk#5967.
The release branch is synced with
main(fast-forward — it carried no uniquecommits), so the only branch-unique change here is the CI core-image swap:
stellar/unsafe-stellar-core:28.0.0-3494.a9b861321.jammy→stellar/stellar-core:28.0.0-3494.a9b861321.jammyon both integration legs.The train ran on the
unsaferepo because the GA docker repo lags the GitHubrelease;
stellar/stellar-corenow publishes the same build (jammy + noble).The deb pins are unchanged — apt has no unsafe/GA split.
The CHANGELOG's
v28.0.0section already landed onmainvia #913.Merge gate: staging sign-off on the dev-eks deployment (stellar/kube#4823).
Merging this PR is stage 2 of the release — its merge commit is the
v28.0.0tag target.
🤖 Generated with Claude Code