• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

iotaledger / iota / 30320534718
69%

Build:
DEFAULT BRANCH: develop
Ran 28 Jul 2026 02:30AM UTC
Jobs 1
Files 1123
Run time 2min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

27 Jul 2026 07:04PM UTC coverage: 68.777% (-0.5%) from 69.308%
30320534718

push

github

web-flow
fix(iota-grpc-server): feed embedded batch errors into the traffic-control error policy (#12131)

# Description of change

The e2e migration of the traffic-control tests off the node JSON-RPC
(#12130) surfaced gaps in the fullnode gRPC traffic control around
**batch APIs**:

1. **Embedded per-item errors never fed the error policy.** Batch APIs
report per-item failures as `google.rpc.Status` values embedded inside
an otherwise *successful* gRPC response. The `TrafficControlLayer`
derives its tally from the transport-level status only, so a client
spamming e.g. invalid transactions produced `Code::Ok` tallies and could
never be error-blocked.
2. **A batch counted as a single request under the spam policy**,
regardless of how many items it carried — so a client could dilute its
request rate simply by batching.

(The first gap was originally misdiagnosed as a headers-vs-trailers
issue; the `handler_errors_feed_the_error_policy` test shows unary
handler errors *are* visible to the layer — tonic returns them as a
trailers-only response, so `grpc-status` is in the HTTP headers. The
real blind spot is the batch response body.)

## Fix

- `TrafficControlLayer` injects a `TallyHandle` (client IP + traffic
controller) into the request extensions.
- Batch handlers report **each item** through the handle: every item
counts as one request for the spam policy and, on a client error, feeds
the error policy. The layer skips its default per-request tally when a
handler has accounted for the items (no double counting).
- Endpoints covered:
- `ExecuteTransactions`, `SimulateTransactions` — unary; tallied per
response item.
- `GetObjects`, `GetTransactions` — server-streaming; tallied per item
as the response stream is consumed. Per-item read failures ride inside
`Ok` responses and are tallied as `Code::Ok` (a client cannot know an
object or transaction was pruned), so they feed the spam policy only. A
stream-level error (e.g. a single item exceeding the request's messag... (continued)

79 of 89 new or added lines in 4 files covered. (88.76%)

3131 existing lines in 88 files now uncovered.

168080 of 244384 relevant lines covered (68.78%)

459535.24 hits per line

Uncovered Changes

Lines Coverage ∆ File
7
81.98
-1.51% crates/iota-grpc-server/src/transaction_execution_service/mod.rs
3
95.77
-4.23% crates/iota-grpc-server/src/ledger_service/mod.rs

Coverage Regressions

Lines Coverage ∆ File
351
0.0
-91.64% crates/iota-genesis-builder/src/stardust/process_outputs.rs
273
67.4
-2.49% crates/iota-core/src/authority/authority_store.rs
252
82.96
-0.09% crates/iota-core/src/authority.rs
207
86.9
-0.11% crates/iota-node/src/lib.rs
173
73.73
-14.91% crates/iota-genesis-builder/src/lib.rs
160
2.78
-74.07% crates/iota-genesis-builder/src/stake.rs
126
79.92
-0.23% crates/iota-types/src/crypto.rs
111
84.28
0.16% crates/iota-transactional-test-runner/src/test_adapter.rs
107
4.72
-84.25% crates/iota-config/src/migration_tx_data.rs
97
78.15
-0.72% crates/iota-keys/src/keystore.rs
83
82.15
0.55% crates/iota-core/src/authority/authority_store_pruner.rs
79
38.18
-0.49% crates/iota/src/keytool.rs
69
0.0
-88.46% crates/iota-genesis-builder/src/stardust/types/address_swap_split_map.rs
62
86.37
-0.5% crates/iota-config/src/node.rs
56
0.0
-49.56% crates/iota-genesis-builder/src/stardust/types/snapshot.rs
54
66.33
1.56% crates/iota-grpc-server/src/merge.rs
51
80.65
-14.96% crates/iota-genesis-builder/src/stardust/migration/migration.rs
43
56.73
-0.1% crates/iota-localnet/src/commands.rs
38
83.86
-0.28% crates/iota-core/src/authority/authority_store_tables.rs
33
2.26
-18.64% crates/iota-stardust-types/src/block/output/mod.rs
32
67.63
-23.02% crates/iota-genesis-builder/src/stardust/migration/verification/basic.rs
32
89.83
0.0% crates/iota-grpc-server/src/types.rs
30
58.26
-0.71% crates/iota-cluster-test/src/cluster.rs
29
77.05
-6.79% crates/iota-config/src/genesis.rs
28
56.92
56.92% crates/iota-core/src/runtime.rs
26
0.0
-68.42% crates/iota-genesis-builder/src/stardust/parse.rs
25
75.44
-1.8% crates/iota-keys/src/key_derive.rs
25
75.48
0.38% crates/test-cluster/src/lib.rs
24
92.7
-4.38% crates/iota-genesis-builder/src/stardust/migration/executor.rs
24
60.0
5.28% crates/iota-swarm-config/src/network_config.rs
24
84.31
-0.02% crates/iota-swarm-config/src/node_config_builder.rs
21
53.01
-12.65% crates/iota-stardust-types/src/block/output/nft.rs
20
0.0
0.0% crates/iota-node/src/main.rs
19
54.55
-34.55% crates/iota-types/src/timelock/timelock.rs
18
53.85
0.0% crates/iota-cluster-test/src/faucet.rs
18
80.0
1.43% crates/iota-grpc-server/src/ledger_service/get_epoch.rs
18
48.91
-9.78% crates/iota-stardust-types/src/block/output/foundry.rs
18
36.36
-54.55% crates/iota-types/src/stardust/output/alias.rs
18
22.22
-66.67% crates/iota-types/src/stardust/output/basic.rs
18
47.62
-42.86% crates/iota-types/src/stardust/output/nft.rs
16
57.58
-24.24% crates/iota-stardust-types/src/block/output/token_scheme/simple.rs
15
46.15
-11.54% crates/iota-stardust-types/src/block/output/basic.rs
14
87.97
-10.53% crates/iota-genesis-builder/src/stardust/types/address_swap_map.rs
13
96.61
0.0% crates/iota-metrics/src/lib.rs
13
55.46
-5.46% crates/iota-stardust-types/src/block/output/alias.rs
13
93.66
-0.51% crates/starfish/core/src/authority_service.rs
11
79.66
-18.64% crates/iota-genesis-common/src/lib.rs
11
88.15
0.5% crates/iota-test-transaction-builder/src/lib.rs
10
64.78
0.23% crates/simulacrum/src/store/in_mem_store.rs
8
48.12
-1.37% crates/iota-sdk/src/apis/read.rs
8
77.27
-2.1% crates/iota-sdk/src/wallet_context.rs
7
51.56
-1.66% crates/iota-keys/src/keypair_file.rs
7
90.06
-0.2% crates/iota-types/src/base_types.rs
7
78.87
-9.86% crates/iota-types/src/gas_coin.rs
6
75.56
-13.33% crates/iota-core/src/starfish_adapter.rs
6
73.53
-17.65% crates/iota-genesis-builder/src/stardust/types/output_header.rs
4
89.3
-0.46% crates/iota-core/src/grpc_indexes.rs
4
75.18
0.0% crates/iota-network/src/randomness/mod.rs
4
0.0
0.0% crates/iota/src/generate_genesis_checkpoint.rs
4
59.35
-3.25% crates/iota-stardust-types/src/block/output/feature/mod.rs
4
66.67
-26.67% crates/iota-stardust-types/src/block/output/unlock_condition/immutable_alias_address.rs
4
97.7
-2.3% crates/iota-types/src/unit_tests/utils.rs
3
90.91
0.0% crates/iota-cluster-test/src/wallet_client.rs
3
77.99
-0.41% crates/iota-core/src/traffic_controller/mod.rs
3
66.67
-14.29% crates/iota-stardust-types/src/block/output/feature/tag.rs
3
37.72
-2.63% crates/iota-stardust-types/src/block/output/native_token.rs
3
65.96
-6.38% crates/iota-stardust-types/src/block/output/output_id.rs
3
56.25
-1.56% crates/iota-stardust-types/src/block/output/unlock_condition/mod.rs
3
0.0
-11.11% crates/iota-stardust-types/src/block/payload/milestone/option/parameters.rs
3
0.0
-6.38% crates/iota-stardust-types/src/block/protocol.rs
3
79.78
-0.66% crates/iota-swarm-config/src/network_config_builder.rs
2
89.35
-0.69% crates/iota-core/src/connection_monitor.rs
2
94.28
-0.12% crates/iota-core/src/consensus_adapter.rs
2
85.86
-0.5% crates/iota-core/src/storage.rs
2
78.69
-3.28% crates/iota-core/src/traffic_controller/nodefw_test_server.rs
2
92.28
-0.15% crates/iota-faucet/src/faucet/simple_faucet.rs
2
97.6
-0.08% crates/starfish/core/src/core.rs
1
86.11
-2.78% crates/iota-cluster-test/src/test_case/native_transfer_test.rs
1
90.99
0.12% crates/iota-core/src/authority/authority_per_epoch_store.rs
1
92.1
-0.11% crates/iota-core/src/epoch/randomness.rs
1
91.58
0.13% crates/iota-core/src/execution_cache/writeback_cache.rs
1
85.32
-0.09% crates/iota-json-rpc/src/read_api.rs
1
89.24
0.0% crates/iota-network/src/discovery/mod.rs
1
0.0
0.0% crates/iota-tool/src/fire_drill.rs
1
47.11
-0.44% crates/iota-types/src/iota_sdk_types_conversions.rs
1
81.85
-0.19% crates/iota-types/src/messages_consensus.rs
1
94.25
-0.07% crates/starfish/core/src/authority_node.rs
1
92.02
-0.38% crates/starfish/core/src/leader_timeout.rs
Jobs
ID Job ID Ran Files Coverage
1 nextest+simtest - 30320534718.1 28 Jul 2026 02:30AM UTC 1123
68.78
GitHub Action Run
Source Files on build 30320534718
  • Tree
  • List 1123
  • Changed 109
  • Source Changed 44
  • Coverage Changed 102
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #30320534718
  • e80fecef on github
  • Prev Build on develop (#30230091073)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc