• Stefy Lanza (nextime / spora )'s avatar
    absorb whatever a client offers: discovered pod width, and 429 (v0.4.38) · 77e8f758
    Stefy Lanza (nextime / spora ) authored
    A client must be able to send too much. The server's job is to carry what
    it can and say so about the rest -- not to depend on the client having
    been told the right number, which is what the previous fix amounted to.
    
    TWO THINGS WERE MISSING.
    
    1. NOTHING BOUNDED WHAT ONE POD WAS SENT. `max_inflight_per_pod`
       defaults to 0, meaning unlimited, so out of the box every page handed
       to the pool is dispatched. A client offering more than a pod can serve
       therefore does not queue in the orchestrator, where the queue would be
       counted, reported as demand and bounded -- it queues in the POD'S
       LISTEN BACKLOG, and an overflowing backlog makes a healthy pod refuse
       connections. That is what cost eight A40s yesterday.
    
       The right width is a property of the pod, the model and the card, not
       of the install, so the pod is asked rather than configured. A refusal
       halves what we send that pod, FROM THE IN-FLIGHT COUNT AT THE REFUSAL
       -- its observed breaking point, not a guess -- and successes walk it
       back up one slot at a time (multiplicative decrease, additive
       increase: overshooting costs refused connections and a misdiagnosed
       fleet, undershooting costs a little latency). Floored at 4, never
       above the operator's own ceiling, per pod so one overloaded pod does
       not throttle the fleet, and inert on an install where no pod ever
       refuses. Live numbers: 64 configured, 58 in flight at the refusal,
       width becomes 29 -- the pods were measured serving 29-32.
    
    2. A FULL QUEUE ANSWERED SLOWER INSTEAD OF SAYING NO. The queue itself is
       deliberate: when a pod finishes a page there must already be another
       ready to hand it, or the fleet idles between dispatches and is paid
       for the gap. So the server carries `ocr.max_concurrency` in flight
       PLUS `ocr.max_queued_pages` waiting (0 = follow max_concurrency) --
       and past that answers 429 with Retry-After and the numbers a client
       needs to size its window (X-OCR-Page-Width, X-OCR-Queue-Limit).
    
       Before, a client offering several times the capacity got no error at
       all: it got replies that took longer and longer, which reads as "the
       pages are getting slower" rather than "stop sending", so it sent more.
       Measured 2026-10-19: 522 pages offered against a fleet carrying ~250,
       mean page latency 238s against a 19s service time, nothing in any
       reply saying the server was over capacity.
    
       Refused BEFORE the upload is read. The client hears at once instead of
       after transferring a document the server will not look at, and the
       server stops buffering megabytes it is about to discard -- in-flight
       memory here is concurrent requests times upload size, the product that
       has OOM-killed this endpoint before.
    
    Every page now takes its slot through one counted path, which is what
    makes the queue depth knowable. Writing that exposed a real defect in
    what it replaced: `self._sem or asyncio.Semaphore(4)` built a FRESH
    semaphore per page, so an unconfigured manager bounded nothing at all --
    forty pages of one document ran at once against what every line of code
    called a limit of four. Caught by the existing pod-pipeline gate test.
    
    38 tests. Full suite 3817 passed, 15 pre-existing failures unchanged.
    Co-Authored-By: 's avatarClaude Opus 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01KnfkxBpcZ1v6ypRFFyhrVM
    77e8f758
Name
Last commit
Last update
..
conftest.py Loading commit data...
ocr_lane_stub_worker.py Loading commit data...
test_admin_auth.py Loading commit data...
test_admin_forward_auth.py Loading commit data...
test_admin_remote_ui.py Loading commit data...
test_admission_gate_derived.py Loading commit data...
test_admission_gate_warning.py Loading commit data...
test_adoption_matches_image_and_card.py Loading commit data...
test_audio_ml_backends.py Loading commit data...
test_audio_ml_endpoints.py Loading commit data...
test_autoupgrade.py Loading commit data...
test_autoupgrade_force_options.py Loading commit data...
test_autoupgrade_midnight_force.py Loading commit data...
test_autoupgrade_recovers_a_down_server.py Loading commit data...
test_autoupgrade_sees_training.py Loading commit data...
test_broker_config.py Loading commit data...
test_broker_dispatch.py Loading commit data...
test_broker_protocol.py Loading commit data...
test_broker_shutdown.py Loading commit data...
test_broker_streaming.py Loading commit data...
test_burst_placement.py Loading commit data...
test_character_studio_fetch.py Loading commit data...
test_chat_passthrough.py Loading commit data...
test_chunking.py Loading commit data...
test_cluster.py Loading commit data...
test_compose.py Loading commit data...
test_control_plane_never_starves.py Loading commit data...
test_embed_long_input.py Loading commit data...
test_embedding_capability.py Loading commit data...
test_embedding_repo_file_detection.py Loading commit data...
test_field_report_fixes.py Loading commit data...
test_forward_auth_peer_trust.py Loading commit data...
test_front_api_auth.py Loading commit data...
test_front_forward_pool_ceiling.py Loading commit data...
test_front_inflight_leak.py Loading commit data...
test_front_ocr_swap_gate.py Loading commit data...
test_image_has_c_compiler.py Loading commit data...
test_ledger_out_of_band.py Loading commit data...
test_live_hourly_counts_booting_pods.py Loading commit data...
test_longcat_avatar_layout.py Loading commit data...
test_longcat_bsa.py Loading commit data...
test_longcat_cancellable.py Loading commit data...
test_longcat_checkpoint_resolve.py Loading commit data...
test_longcat_component_quant.py Loading commit data...
test_longcat_config_ui.py Loading commit data...
test_longcat_external_training.py Loading commit data...
test_longcat_int8_load.py Loading commit data...
test_longcat_lora.py Loading commit data...
test_longcat_orchestration.py Loading commit data...
test_longcat_packaging.py Loading commit data...
test_longcat_placement.py Loading commit data...
test_longcat_progress.py Loading commit data...
test_longcat_prompt_cache.py Loading commit data...
test_longcat_quantize.py Loading commit data...
test_longcat_scale.py Loading commit data...
test_longcat_tasks.py Loading commit data...
test_longcat_variants.py Loading commit data...
test_longcat_vendored_source.py Loading commit data...
test_longcat_venv_env.py Loading commit data...
test_longcat_vram_estimate.py Loading commit data...
test_longcat_worker.py Loading commit data...
test_loop_watch.py Loading commit data...
test_manual_multimodal_test_client.py Loading commit data...
test_model_scan_cache.py Loading commit data...
test_models_context_window.py Loading commit data...
test_no_blocking_calls_on_the_loop.py Loading commit data...
test_ocr_accent_repair.py Loading commit data...
test_ocr_accent_token_ids.py Loading commit data...
test_ocr_accent_visibility.py Loading commit data...
test_ocr_blank_page.py Loading commit data...
test_ocr_chandra.py Loading commit data...
test_ocr_confidence.py Loading commit data...
test_ocr_degraded_retry.py Loading commit data...
test_ocr_detector_venv.py Loading commit data...
test_ocr_dual_mode.py Loading commit data...
test_ocr_fanout.py Loading commit data...
test_ocr_language.py Loading commit data...
test_ocr_lease_leak_on_cancel.py Loading commit data...
test_ocr_lease_off_the_loop.py Loading commit data...
test_ocr_max_pages.py Loading commit data...
test_ocr_max_tokens_floor.py Loading commit data...
test_ocr_olmocr.py Loading commit data...
test_ocr_page_image.py Loading commit data...
test_ocr_pod_async_transport.py Loading commit data...
test_ocr_pod_env_round_trip.py Loading commit data...
test_ocr_pod_pipeline_gate.py Loading commit data...
test_ocr_pod_pipeline_policy.py Loading commit data...
test_ocr_pod_pool_width.py Loading commit data...
test_ocr_queue_full_is_429.py Loading commit data...
test_ocr_raster_pool.py Loading commit data...
test_ocr_request_budgets.py Loading commit data...
test_ocr_resident_budget.py Loading commit data...
test_ocr_resume_engines.py Loading commit data...
test_ocr_resume_shared.py Loading commit data...
test_ocr_served_model.py Loading commit data...
test_ocr_surya_confidence.py Loading commit data...
test_ocr_token_trace.py Loading commit data...
test_ocr_unreadable_and_dpi.py Loading commit data...
test_ocr_vram_share_and_fallback.py Loading commit data...
test_ocr_window_published.py Loading commit data...
test_ocr_worker_lanes.py Loading commit data...
test_olmocr_pod_tls.py Loading commit data...
test_oom_priority.py Loading commit data...
test_placement_declines.py Loading commit data...
test_pod_http_pool.py Loading commit data...
test_pod_log_drain.py Loading commit data...
test_pod_loopback_tls.py Loading commit data...
test_pod_pool_fleet_ceiling.py Loading commit data...
test_pod_seed_model_type.py Loading commit data...
test_pod_teach_on_unknown_model.py Loading commit data...
test_pod_token_adoption_race.py Loading commit data...
test_pool_growth_adopts.py Loading commit data...
test_proxy_logprobs.py Loading commit data...
test_remote_execution.py Loading commit data...
test_remote_gateway_gate.py Loading commit data...
test_remote_pinned_never_loads_locally.py Loading commit data...
test_runpod_adaptive_pod_width.py Loading commit data...
test_runpod_capacity_cache.py Loading commit data...
test_runpod_card_memo.py Loading commit data...
test_runpod_client_pod_ceiling.py Loading commit data...
test_runpod_client_scale.py Loading commit data...
test_runpod_fleet_status.py Loading commit data...
test_runpod_grow_reason.py Loading commit data...
test_runpod_inflight_reclaim.py Loading commit data...
test_runpod_mixed_fleet.py Loading commit data...
test_runpod_no_duplicate_pods.py Loading commit data...
test_runpod_nonblocking_lease.py Loading commit data...
test_runpod_ocr_remotization.py Loading commit data...
test_runpod_placement.py Loading commit data...
test_runpod_pod_extra_args.py Loading commit data...
test_runpod_reaper_grace.py Loading commit data...
test_runpod_refusal_is_not_death.py Loading commit data...
test_runpod_regional_volumes.py Loading commit data...
test_runpod_registry_heartbeat.py Loading commit data...
test_runpod_release_and_boot_cancel.py Loading commit data...
test_runpod_request_gpu_choice.py Loading commit data...
test_runpod_restart_orphans.py Loading commit data...
test_runpod_restart_reclaim.py Loading commit data...
test_runpod_scale_down.py Loading commit data...
test_runpod_scale_out.py Loading commit data...
test_runpod_schedule_region_spend.py Loading commit data...
test_runpod_status_never_hangs.py Loading commit data...
test_runpod_transient_api.py Loading commit data...
test_runpod_warm_floor_parallel.py Loading commit data...
test_runpod_warm_floor_rerent.py Loading commit data...
test_runpod_warm_floor_respects_max_pods.py Loading commit data...
test_runpod_warmup.py Loading commit data...
test_shared_pool_adapter_identity.py Loading commit data...
test_studio_composed_surfaces.py Loading commit data...
test_surya_item_cap.py Loading commit data...
test_surya_loop_reported.py Loading commit data...
test_surya_retry_budget.py Loading commit data...
test_surya_runpod_fixes.py Loading commit data...
test_surya_thread_boundary.py Loading commit data...
test_system_reload_endpoint.py Loading commit data...
test_task_budget_and_teardown.py Loading commit data...
test_text_lora_to_pod.py Loading commit data...
test_thread_pool_sizing.py Loading commit data...
test_township_api_key.py Loading commit data...
test_township_clip_geometry.py Loading commit data...
test_township_longcat.py Loading commit data...
test_township_page_js.py Loading commit data...
test_township_templates.py Loading commit data...
test_township_video_dataset.py Loading commit data...
test_upgrade_launcher.py Loading commit data...
test_video_as_b64_scope.py Loading commit data...
test_video_geometry.py Loading commit data...
test_vllm_served_names_sections.py Loading commit data...
test_vllm_share_self_tuning.py Loading commit data...
test_vram_releasers.py Loading commit data...
test_weight_stores.py Loading commit data...
test_whisper_server_local_models.py Loading commit data...