@@ -18,6 +18,8 @@ use either::Either::Left;
1818use enum_as_inner:: EnumAsInner ;
1919use ext_event_worker:: events:: WorkerEventWithMetadata ;
2020use ext_runtime:: SharedMetricSource ;
21+ use ext_runtime:: SharedRateLimitTable ;
22+ use ext_runtime:: TraceRateLimiterConfig ;
2123use ext_workers:: context:: CreateUserWorkerResult ;
2224use ext_workers:: context:: SendRequestResult ;
2325use ext_workers:: context:: Timing ;
@@ -235,6 +237,7 @@ pub struct WorkerPool {
235237 pub flags : Arc < ServerFlags > ,
236238 pub policy : WorkerPoolPolicy ,
237239 pub metric_src : SharedMetricSource ,
240+ pub shared_rate_limit_table : SharedRateLimitTable ,
238241 pub user_workers : HashMap < Uuid , UserWorkerProfile > ,
239242 pub active_workers : HashMap < String , ActiveWorkerRegistry > ,
240243 pub worker_pool_msgs_tx : mpsc:: UnboundedSender < UserWorkerMsgs > ,
@@ -253,11 +256,19 @@ impl WorkerPool {
253256 worker_event_sender : Option < UnboundedSender < WorkerEventWithMetadata > > ,
254257 worker_pool_msgs_tx : mpsc:: UnboundedSender < UserWorkerMsgs > ,
255258 inspector : Option < Inspector > ,
259+ cancel : CancellationToken ,
256260 ) -> Self {
261+ let shared_rate_limit_table = SharedRateLimitTable :: default ( ) ;
262+ shared_rate_limit_table. spawn_cleanup_task (
263+ Duration :: from_secs ( flags. rate_limit_cleanup_interval_sec ) ,
264+ cancel,
265+ ) ;
266+
257267 Self {
258268 flags,
259269 policy,
260270 metric_src,
271+ shared_rate_limit_table,
261272 worker_event_sender,
262273 user_workers : HashMap :: new ( ) ,
263274 active_workers : HashMap :: new ( ) ,
@@ -384,6 +395,7 @@ impl WorkerPool {
384395 let worker_pool_msgs_tx = self . worker_pool_msgs_tx . clone ( ) ;
385396 let events_msg_tx = self . worker_event_sender . clone ( ) ;
386397 let supervisor_policy = self . policy . supervisor_policy ;
398+ let shared_rate_limit_table = self . shared_rate_limit_table . clone ( ) ;
387399
388400 drop ( tokio:: spawn ( async move {
389401 let ( permit, tx) = match wait_fence_fut. await {
@@ -462,6 +474,17 @@ impl WorkerPool {
462474 user_worker_rt_opts. events_msg_tx = events_msg_tx;
463475 user_worker_rt_opts. cancel = Some ( cancel. clone ( ) ) ;
464476
477+ if let ext_runtime:: RateLimiterOpts :: Rules { rules, global_key } =
478+ std:: mem:: take ( & mut user_worker_rt_opts. rate_limiter )
479+ {
480+ user_worker_rt_opts. rate_limiter =
481+ ext_runtime:: RateLimiterOpts :: Configured ( TraceRateLimiterConfig {
482+ table : shared_rate_limit_table,
483+ rules,
484+ global_key : Some ( global_key) ,
485+ } ) ;
486+ }
487+
465488 worker_options. timing = Some ( Timing {
466489 early_drop_rx,
467490 status : status. clone ( ) ,
@@ -792,13 +815,15 @@ pub async fn create_user_worker_pool(
792815 async move {
793816 let token = termination_token. as_ref ( ) ;
794817 let mut termination_requested = false ;
818+ let cleanup_cancel = token. map ( |t| t. inbound . clone ( ) ) . unwrap_or_default ( ) ;
795819 let mut worker_pool = WorkerPool :: new (
796820 flags,
797821 policy,
798822 metric_src_inner,
799823 worker_event_sender,
800824 user_worker_msgs_tx_clone,
801825 inspector,
826+ cleanup_cancel,
802827 ) ;
803828
804829 // Note: Keep this loop non-blocking. Spawn a task to run blocking calls.
0 commit comments