Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
cleanup stale addresses only every 100 blocks
  • Loading branch information
akundaz committed Sep 3, 2025
commit e6d925f7bb1cddd9a1885c1d94af24dd05906951
2 changes: 1 addition & 1 deletion crates/op-rbuilder/src/builders/flashblocks/payload.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ where
let state_provider = self.client.state_by_block_hash(ctx.parent().hash())?;
let db = StateProviderDatabase::new(&state_provider);

self.address_gas_limiter.refresh();
self.address_gas_limiter.refresh(ctx.block_number());

// 1. execute the pre steps and seal an early block with that
let sequencer_tx_start_time = Instant::now();
Expand Down
2 changes: 1 addition & 1 deletion crates/op-rbuilder/src/builders/standard/payload.rs
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ where

let builder = OpBuilder::new(best);

self.address_gas_limiter.refresh();
self.address_gas_limiter.refresh(ctx.block_number());

let state_provider = self.client.state_by_block_hash(ctx.parent().hash())?;
let db = StateProviderDatabase::new(state_provider);
Expand Down
4 changes: 4 additions & 0 deletions crates/op-rbuilder/src/gas_limiter/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,8 @@ pub struct GasLimiterArgs {
default_value = "1000000"
)]
pub refill_rate_per_block: u64,

/// How many blocks to wait before cleaning up stale buckets for addresses.
#[arg(long = "gas-limiter.cleanup-interval", env, default_value = "100")]
pub cleanup_interval: u64,
}
25 changes: 16 additions & 9 deletions crates/op-rbuilder/src/gas_limiter/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::{sync::Arc, time::Instant};
use std::{cmp::min, sync::Arc, time::Instant};

use alloy_primitives::Address;
use dashmap::DashMap;
Expand Down Expand Up @@ -47,9 +47,9 @@ impl AddressGasLimiter {
}

/// Should be called upon each new block. Refills buckets/Garbage collection
pub fn refresh(&self) {
pub fn refresh(&self, block_number: u64) {
if let Some(inner) = self.inner.as_ref() {
inner.refresh()
inner.refresh(block_number)
}
}
}
Expand Down Expand Up @@ -104,21 +104,28 @@ impl AddressGasLimiterInner {
result.map(|_| ())
}

fn refresh_inner(&self) -> usize {
fn refresh_inner(&self, block_number: u64) -> usize {
let active_addresses = self.address_buckets.len();

self.address_buckets.iter_mut().for_each(|mut bucket| {
bucket.available += self.config.refill_rate_per_block;
bucket.available = min(
bucket.capacity,
bucket.available + self.config.refill_rate_per_block,
)
});
self.address_buckets
.retain(|_, bucket| bucket.available <= bucket.capacity);

// Only clean up stale buckets every `cleanup_interval` blocks
if block_number % self.config.cleanup_interval == 0 {
self.address_buckets
.retain(|_, bucket| bucket.available <= bucket.capacity);
}

active_addresses - self.address_buckets.len()
}

fn refresh(&self) {
fn refresh(&self, block_number: u64) {
let start = Instant::now();
let removed_addresses = self.refresh_inner();
let removed_addresses = self.refresh_inner(block_number);

self.metrics
.record_refresh(removed_addresses, start.elapsed());
Expand Down