Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
6d23f89
server2: give a stored restore a head start over its providers
hwanjjang Nov 7, 2026
e7e67f5
server2: read a narrative office as owned work
hwanjjang Nov 7, 2026
03e885f
server2: start providers when a restart restore is late
hwanjjang Nov 7, 2026
b93e420
docs: describe the restart race, its lanes and fills
hwanjjang Nov 7, 2026
479ceb3
docs: show the restart race in the data design diagram
hwanjjang Nov 7, 2026
88601d0
server2: hold the restart tests' stored reads at a gate (RR2-ci-clock)
hwanjjang Nov 7, 2026
e1526d9
server2: fold each station acquisition as it ends (RR2-page-progress)
hwanjjang Nov 7, 2026
345720b
server2: keep the newest narrative when a raced fetch ends (RR2-narra…
hwanjjang Nov 7, 2026
de68e9e
server2: share one narrative fetch per office (RR2-narrative-singlefl…
hwanjjang Nov 7, 2026
17e16ae
docs: count the restart race's data.go.kr units per quota owner (RR2-…
hwanjjang Nov 7, 2026
2651e22
Merge the #2872 test fixes into the restart race
hwanjjang Nov 7, 2026
8405cad
server2: never answer an older narrative after the TTL (RR2-narrative…
hwanjjang Nov 7, 2026
ab0aba1
Merge the #2872 fallback-order test into the restart race
hwanjjang Nov 7, 2026
17e6a41
Merge the #2872 response-first writer fix into the restart race
hwanjjang Nov 7, 2026
fd0c7f4
Merge the #2872 writer join fix into the restart race
hwanjjang Nov 7, 2026
80bc152
server2: list the life families together in the needed-first read (P3)
hwanjjang Nov 7, 2026
0d98504
server2: restore today's life records with reads in flight (NEEDED-FI…
hwanjjang Nov 7, 2026
7f35848
server2: run restarted life processes on four S3 permits in tests
hwanjjang Nov 7, 2026
3669ee0
server2: leave descriptors to the restore in a wide lookup (RR2-wide-…
hwanjjang Nov 7, 2026
5da3c5a
server2: read a wide lookup's pages as the restore reaches them (RR2-…
hwanjjang Nov 7, 2026
c5df6a1
Merge the restart observe (with master) into the restart race
hwanjjang Nov 7, 2026
e8ac594
Merge master into feat/2614-kma-restart-race
hwanjjang Nov 9, 2026
1b787e1
server2: give CI's debug test threads 8 MiB of stack
hwanjjang Nov 9, 2026
fc5f8cd
Merge master into feat/2614-kma-restart-race
hwanjjang Nov 9, 2026
54e84c5
Merge master into feat/2614-kma-restart-race
hwanjjang Nov 9, 2026
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
2 changes: 1 addition & 1 deletion docs/architecture/diagrams/server2-kma-data-design.html
Original file line number Diff line number Diff line change
Expand Up @@ -5431,7 +5431,7 @@ <h1>KMA response-first contract and qualification</h1>
<rect x="474.475" y="1693" width="163.79999999999998" height="18" rx="3" class="c-mask"/>
<text x="556.375" y="1703" class="t-muted" font-size="11" text-anchor="middle">Read and bounded repair</text>
</g>
<text data-detail="context" x="319.25" y="1731" class="t-muted" font-size="7"><tspan x="319.25" dy="0">Zone state, KASI and station</tspan><tspan x="319.25" dy="11">pages restore from stored folds;</tspan><tspan x="319.25" dy="11">a restore holds a request at most</tspan><tspan x="319.25" dy="11">500 ms.</tspan></text>
<text data-detail="context" x="319.25" y="1731" class="t-muted" font-size="7"><tspan x="319.25" dy="0">Stored folds restore first; at</tspan><tspan x="319.25" dy="11">700 ms providers fill what is</tspan><tspan x="319.25" dy="11">still missing. Other reads use</tspan><tspan x="319.25" dy="11">the bulk lane.</tspan></text>
</g>

<g data-edge-from="owner" data-edge-to="provider" data-edge-label="If gap: qualified reacquisition" data-edge-key="22" data-edge-id="reacquire">
Expand Down
2 changes: 1 addition & 1 deletion docs/architecture/diagrams/server2-kma-data-design.json
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@
"to": "s3",
"y": 1713,
"label": "Read and bounded repair",
"note": "Zone state, KASI and station pages restore from stored folds; a restore holds a request at most 500 ms."
"note": "Stored folds restore first; at 700 ms providers fill what is still missing. Other reads use the bulk lane."
},
{
"id": "reacquire",
Expand Down
8 changes: 7 additions & 1 deletion docs/architecture/server2-kma-data-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,9 @@ process timer (below), and no request decodes the GIFs. The station page product
(`station-pages`, one per KST day) holds the parsed AWS hourly and city pages any folding process
keeps; a restarted process reads it, compares it with the day catalogs and restores only the
pages it lacks, falling back to the raw pages when it cannot be used
([restart read](server2.md#s15b-2-restart-read-and-station-page-products-2026-11-07)). The observed response also
([restart read](server2.md#s15b-2-restart-read-and-station-page-products-2026-11-07)); a
restore that misses its 700 ms head start is raced by the page acquisitions
([restart race](server2.md#s15b-2-restart-race-providers-when-a-restore-is-late-2026-11-07)). The observed response also
uses the release's land zones (`data/kma_forecast_land_zones.csv`) until a forecast-zone list is
stored, so its first answer can request mid temperatures. Measurements are in the
[speed evidence](../evidence/research/kma-speed-options-2026-11-04.md#result-of-the-change).
Expand All @@ -521,6 +523,10 @@ The observed request stops waiting for everything it started 2.5 s after it reac

Two kinds of owned work no longer hold a request. The warning collector offers its zone state once fetched, before its publications; a request answers from that memory, and the push feed still sees only durable rows. No request acquires or decodes an AirKorea forecast image, because the GIFs and their decoding take longer than the bound (AK 2026-11-06): the process acquires the images and stores the decoded hourly forecast at startup and every ten minutes, independent of requests, and a request only reads the newest product. Measurements are in the [speed evidence](../evidence/research/kma-speed-options-2026-11-04.md#with-one-bound-on-the-request).

### Restores with a head start

After a restart a part S3 holds is not an allowed omission (AK 2026-11-07), so a stored restore no longer holds back the providers of the same data. Each restore of the station pages, the ASOS history, the life datasets, the narrative and the warning state starts with the request and has a 700 ms head start. A restore not done then is raced: the owned acquisitions of what memory lacks start alongside it, as on an empty S3, and the answer takes whichever delivers by its bound; a restore done by then leaves them to what S3 lacks, so a fast restore adds no provider call. The ASOS history takes its station from the default station list before any station fold, the life read restores today's partitions before the rest of its 14-day window, and the narrative read is owned work that a waiter's timeout does not cancel. Of the 8-day hourly window a raced restore acquires only the hours of today and yesterday the day catalogs do not list; older days come from S3 alone, and a listed or held hour is never fetched again (a later page would replace the ongoing one). Reads and writes no request waits for (the rest of the restart read, full reads of reduced pages, day products, image production, the KASI pass) use the bulk lane of the S3 admission; the reads a request waits for, its warning-state read included, use the request lane. Grid forecasts are not raced. The calls this adds and the tests are in the [restart race](server2.md#s15b-2-restart-race-providers-when-a-restore-is-late-2026-11-07).

## Wire, storage and assembly format boundaries

The [API manual](../reference/external-apis/kma.md) defines current operations,
Expand Down
Loading
Loading