• Stefy Lanza (nextime / spora )'s avatar
    a pool may not ask for more threads than the process is allowed (v0.4.18) · 4478272e
    Stefy Lanza (nextime / spora ) authored
    A 5,000-document run leased 48 warm pods and then read 278 pages ON THE
    ORCHESTRATOR -- a box with no GPU -- while every one of those cards sat
    idle. Each page logged "the pod-side pipeline could not run (can't start
    new thread)". Zero documents were read on the pods.
    
    The container's task budget was 2048 (podman's --pids-limit default) and
    the pod pool had sized itself 2048 from ocr.max_concurrency: 4096. It
    reached 1992 threads; the next one could not exist. Nothing had looked for
    a limit, so nothing reported one.
    
    Three separable mistakes, all three fixed:
    
      * `thread_pool.task_budget()` reads what the process is actually allowed
        -- cgroup v2 pids.max walked up to the root (a limit on any ancestor
        binds as hard as one on the leaf), minus pids.current because the other
        processes in the cgroup already spend it, and RLIMIT_NPROC -- and
        `pool_sizes()` fits inside it, keeping 256 tasks in reserve so a
        rasteriser worker, an isolated-venv engine or a `podman exec` to look at
        the box can still fork. The general pool is protected ahead of the pod
        pool: an install that cannot answer /healthz cannot be diagnosed. On the
        numbers above it now sizes 256 + 1506 instead of asking for 2304.
    
      * A lease took a POD-POOL thread per in-flight page, so the page width an
        install wants decided how many thread stacks it needs. A lease is a
        bounded wait (POD_LEASE_ATTEMPT_S), so a separate 256-thread lease pool
        serves thousands of pages by cycling. It also stops a cold start filling
        every thread with leases waiting for pods, leaving none to carry the
        pages those pods were for.
    
      * "Cannot create a thread" was treated as "the pods cannot run the
        pipeline", and the fallback for that is the local pipeline -- which needs
        MORE of this box than the path that just failed for want of it. Local
        exhaustion now answers 503 naming both ways out (the task budget, or
        ocr.max_concurrency) and leaves the pages for the cards.
    
    AND THE TEARDOWN, from the same run: the client's own release sweep answered
    500 five times in three seconds, because terminating a pod that was already
    gone raised. By the time a fleet teardown reaches its last pod some are
    always gone -- reaped for idle, shed by a scale-down, or released by a retry
    of the same call -- so a teardown that was working looked like one that had
    failed. Already gone is the goal, not a failure: it answers 200 with
    `already_gone: true`, while a real failure still raises so a pod left
    billing is never reported as stopped.
    
    Also: a 400 on an upload path now logs why. A malformed or truncated
    multipart body is rejected before any handler runs, so 19 of 137 batches
    failed in that run with no record anywhere but the access line -- not the
    filename, not the size, not even whether it was the body or a field.
    Co-Authored-By: 's avatarClaude Opus 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01KnfkxBpcZ1v6ypRFFyhrVM
    4478272e
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_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_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_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_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_off_the_loop.py Loading commit data...
test_ocr_max_pages.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_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_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_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_client_scale.py Loading commit data...
test_runpod_fleet_status.py Loading commit data...
test_runpod_grow_reason.py Loading commit data...
test_runpod_mixed_fleet.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_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_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_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_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...