prop/test/microwaveprop/workers
Graham McIntire b6b5945002
feat(radar): batch per NEXRAD frame instead of per contact
CommonVolumeRadarWorker was enqueuing one job per contact — every
job fetched + decoded the ~5 MB n0q PNG for its own 5-min frame.
At current backlog depth that's 17,588 contacts across just 1,747
distinct 5-min frames, i.e. ~10 contacts per frame paying for the
same PNG decode over and over.

New RadarFrameWorker takes a batch of contact_ids sharing one frame,
fetches + decodes the frame ONCE, then walks the in-memory pixel
buffer per contact. build_radar_jobs/1 in ContactWeatherEnqueueWorker
now groups the input contacts by their rounded 5-min timestamp and
emits one RadarFrameWorker job per frame instead of one
CommonVolumeRadarWorker per contact.

process_frame/4 is public so the same code path is used both by
perform/1 (production fetch) and tests (pre-decoded pixel buffer);
keeps the happy-path test hermetic without hand-crafting a PNG.

CommonVolumeRadarWorker stays in the tree — still used from the
single-contact submit path where batching is pointless and the
aggregate_stats/5 pure helper is a dependency of the new batched
worker.

Expected impact on the backfill: ~10x fewer fetch + decode cycles,
so the 17k queued-contact backlog drains in minutes instead of ~50.
2026-04-20 12:12:52 -05:00
..
admin_task_worker_test.exs fix(admin_task_worker): unknown feature now returns error instead of falling through 2026-04-16 14:58:55 -05:00
backfill_enqueue_worker_test.exs Remove 500-limit on BackfillEnqueueWorker cron 2026-04-16 12:46:56 -05:00
canadian_sounding_fetch_worker_test.exs Ingest Canadian radiosondes via UWYO + plans for RDPS/HRDPS 2026-04-13 09:14:34 -05:00
common_volume_radar_worker_test.exs feat(rainscatter): classify QSO propagation mechanism from common-volume radar 2026-04-17 15:57:59 -05:00
contact_import_worker_test.exs fix(import): handle Radio.create_contact :duplicate return in worker 2026-04-17 09:54:17 -05:00
contact_position_backfill_worker_test.exs test: override stale distance_km when filling a missing pos 2026-04-16 14:09:45 -05:00
contact_weather_enqueue_worker_test.exs feat(hrrr): route per-QSO enrichment through hrrr_fetch_tasks (Stream C Elixir) 2026-04-19 18:22:22 -05:00
gefs_fetch_worker_test.exs feat(gefs): score extended-horizon grid and seed cron 2026-04-18 14:41:41 -05:00
hrrr_native_grid_worker_test.exs refactor: normalize pos1/pos2 JSONB key to 'lon' everywhere 2026-04-17 09:10:32 -05:00
iemre_fetch_worker_test.exs Store stub records on empty weather fetches to prevent infinite backfill retries 2026-04-06 16:10:39 -05:00
ionosphere_fetch_worker_test.exs Ionosphere: GIRO ionosonde ingestion (foF2/foEs/hmF2/MUFD) 2026-04-15 14:37:43 -05:00
mechanism_classify_worker_test.exs perf+fix: parallelize path HRRR queries; fix meteor-shower year boundary 2026-04-18 12:08:42 -05:00
narr_fetch_worker_test.exs Rename ERA5 → NARR across the codebase 2026-04-16 09:22:23 -05:00
nexrad_worker_test.exs refactor: normalize pos1/pos2 JSONB key to 'lon' everywhere 2026-04-17 09:10:32 -05:00
propagation_grid_worker_test.exs feat(propagation): Phase 3 Stream A cutover — Rust owns f00..f18 2026-04-19 18:13:41 -05:00
propagation_prune_worker_test.exs Drop propagation_scores table, ScoresFile is the only store 2026-04-14 15:13:01 -05:00
radar_frame_worker_test.exs feat(radar): batch per NEXRAD frame instead of per contact 2026-04-20 12:12:52 -05:00
rtma_fetch_worker_test.exs test: cover rtma_client + rtma_fetch_worker, add Req.Test seam 2026-04-16 14:58:54 -05:00
solar_index_worker_test.exs Add type filter to backfill enqueue 2026-04-06 11:42:26 -05:00
space_weather_fetch_worker_test.exs SpaceWeather: SWPC JSON ingestion (Kp, F10.7, GOES X-ray) 2026-04-15 14:55:24 -05:00
terrain_profile_worker_test.exs Rename qsos table to contacts, qso_id to contact_id 2026-04-02 15:52:19 -05:00
weather_fetch_worker_test.exs Store stub records on empty weather fetches to prevent infinite backfill retries 2026-04-06 16:10:39 -05:00