-
-
Notifications
You must be signed in to change notification settings - Fork 0
feat: add geocoder build pipeline with incremental patching #235
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
zackpollard
wants to merge
560
commits into
main
Choose a base branch
from
feat/geocoder
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from 130 commits
Commits
Show all changes
560 commits
Select commit
Hold shift + click to select a range
0758748
fix: keep postal polys in admin_polygons.bin (cell index ID stability)
zackpollard 475c43e
fix: add centroid postcode validation filter
zackpollard a4f6213
feat: build-time postcode validation for centroid index
zackpollard 7346eb1
feat: accumulate TIGER postcodes into centroid index
zackpollard 238cb3e
feat: add addr_postcodes.bin as optional per-addr postcode file
zackpollard 1798199
chore: run s3 speed test on pokedex-general
zackpollard 2ce760b
feat: per-way postcode fallback to nearest centroid (get_nearest_post…
zackpollard da3ae01
feat: per-country postcode validation matching nominatim's clean_post…
zackpollard 1bb5c12
fix: per-country postcode centroid accumulation
zackpollard 3d4f226
fix: remove centroid fallback from way sweep (uses non-per-country data)
zackpollard 708115b
feat: ingest GeoNames external postcode centroids (4.3M postcodes)
zackpollard 8c2aedf
fix: use --external-postcodes flag name in workflow
zackpollard b85e62e
fix: include TIGER + GeoNames entries in per-country centroid output
zackpollard 1f08d52
fix: disable housenumber refinement — wrong numbers worse than missing
zackpollard 783244a
analysis: housenumber refinement correct but net neutral
zackpollard e8a0661
feat: re-enable named footways + resolve addr:street to way name:en
zackpollard b99c106
feat: building radius boost for addr_point primary selection
zackpollard 28e8235
fix: only fill street_id when addr:street missing, don't replace
zackpollard baebf49
feat: token-matched addr:street → way name:en resolution
zackpollard ca22204
feat: polygon overlay in test portal + map click auto-select
zackpollard 1caf32b
feat: per-continent full builds + zstd transport compression
zackpollard 5082bb5
feat: zstd --ultra -22 --long=27 with full parallel compression
zackpollard 77c82af
feat: zstd -T0 per file with 4 parallel workers for 80-thread runners
zackpollard ae13980
feat: gate city/town/village place fallback on municipality containment
zackpollard 4ab566d
feat: inherit postcodes from boundary=census polygons at build time
zackpollard e8bf654
fix: bump zstd worker count to NPROC/2 for full core utilization
zackpollard 82729f9
fix: zstd -22 -T1 with NPROC parallel workers, drop --long
zackpollard 47bb553
fix: build display_name from all populated fields in rank_address order
zackpollard 1e350b6
fix: handle stale .bin files when decompressing yesterday's build
zackpollard 2e807eb
fix: defer old-output decompression to patch step to avoid disk exhau…
zackpollard 796c2d8
fix: skip apply-replication-diffs when force_fresh=true
zackpollard ab8bc00
revert: un-skip apply-diffs; reduce zstd workers to 5×T0
zackpollard 10a56a1
fix: exclude stale .bin files from old-output cache download
zackpollard 24a4462
fix: drop stale-.bin pre-removal in patch step (set -e unsafe)
zackpollard 2f2c03d
perf: switch zstd from --ultra -22 to -19
zackpollard 251f401
ci: log per-file patch mismatches + upload on failure for debugging
zackpollard cf0b152
fix: deterministic cell_to_admin + postcode centroid ordering
zackpollard 5fd8646
feat: patch secondary files via full-replacement sections
zackpollard c0a83ed
fix: emit empty-file raw sections so patch creates 0-byte verify outputs
zackpollard 224d59f
fix: addr_points parent_way_id corruption + child_merge 32-bit overflow
zackpollard 9a8ab5f
feat: switch is_included_highway to Nominatim allow-list
zackpollard 9a53157
fix: place nodes take priority over admin boundaries for sub-city fields
zackpollard bd2efd8
feat: implement find_linked_place step 4 (name-match fallback)
zackpollard 139a315
fix: country-gate nearest postcode centroid lookup
zackpollard 352d6fd
feat: enable housenumber refinement when street wins primary
zackpollard 596406d
fix: tighten find_linked_place step 4 to exact name match
zackpollard d8de512
revert: housenumber refinement when street wins primary
zackpollard aaf050b
feat: polygon geometry for building addr_points
zackpollard f5765f8
perf: flat float storage for thread-local building addr polygons
zackpollard 8a80743
fix: primary-feature parity for polygon addr_points
zackpollard 3e863e4
fix: remove query-time postal-boundary PIP from postcode chain
zackpollard 8035dd7
feat: POI postcode inheritance from postal boundaries
zackpollard ffa4049
feat: office=government POI ingestion with relation addr emission
zackpollard ec5f846
feat: housenumber refinement when street wins primary
zackpollard cb9466b
feat: nominatim fuzzy-area gate for place nodes
zackpollard 4bbceb3
feat: prefer admin over place node for sub-city address fields
zackpollard 85f6256
feat: index unnamed rank-30 POIs for nominatim primary parity
zackpollard 533fff1
feat: per-way postcode inheritance via vertex-majority vote
zackpollard 85e2ab6
feat: hybrid chain-walk admin resolution for coarse ranks
zackpollard e870c03
docs: name-suffix normalization is a no-op (Option 6)
zackpollard c7d0125
feat: city-state country-as-city fallback
zackpollard 21a81b3
fix: skip string pool remap for unnamed POIs with NO_DATA name_id
zackpollard 4581735
fix: guard get_string calls against NO_DATA name_id on unnamed POIs
zackpollard 0b49ffe
feat: distinguish highway-class polygon POIs from rank-30 POIs
zackpollard a6fe1a7
ci: bump EXPECTED_BUILD_VERSION to 10 for patch chain
zackpollard b4fb806
fix: emit addr_vertices.bin in patch (was missing since build_version=9)
zackpollard b5c5b8e
ci: upload checksums.sha256 to cache too
zackpollard eabaf33
feat: UX-focused POI primary-selection improvements
zackpollard 6c2691a
feat: POI parent_poly_id for chain-containment filter
zackpollard e625fa5
feat: POI ranking tuning for landmark-first places[] surface
zackpollard 775d5af
feat: area-ascending tie-break for contained POI ordering
zackpollard e260ab1
feat: surface contained landmarks in address via OSM-class fields
zackpollard 0d0c6d3
feat: expand PoiCategory to cover every common OSM tag value
zackpollard a98c57a
feat(test-portal): opt-in Nominatim comparison + dynamic field breakdown
zackpollard aa1ffd0
feat: woods/landuse categories + single landmark field
zackpollard 105f57d
feat: dedup point-POIs by category; drop zone-landuse from landmarks
zackpollard 29fb9a8
fix: relax places[] dedup + expand landmark class mapper
zackpollard 5121515
feat(test-portal): add copy-coordinates button on each result card
zackpollard 4e0bc57
feat: split strings.bin into 5 per-consumer tier files
zackpollard 29094db
fix: partition strings into tiers for continent subsets too
zackpollard 2f387dc
feat(geocoder): add TS + WASM ports for in-process reverse-geocoding
zackpollard 983834b
feat(geocoder): full feature parity for both ports
zackpollard f443858
refactor(geocoder): split server into lib + bin so wasm-port can shar…
zackpollard ca450ba
feat(geocoder): FileBytes enum + JsChunked source infrastructure
zackpollard f08bcc3
feat(geocoder): wire chunked-on-demand through query_geo + find_addr_…
zackpollard a184bac
feat(geocoder): chunked-on-demand for ts-port — lifts JS 4 GiB Buffer…
zackpollard 7451c91
feat(geocoder): chunk-aware admin_vertices + poi_vertices, throughput…
zackpollard b39b134
feat(geocoder): make every file consumer chunk-aware (0 MB inline floor)
zackpollard 7a28bc2
chore(geocoder): tune chunked LRU page cap to 32 pages (2 MiB/file)
zackpollard 007da45
feat(geocoder): per-polygon vertex quantization (u16/u32 deltas)
zackpollard 95319ec
feat(geocoder): inline polygon header + addr_vertices quantization
zackpollard 0a46ca8
chore(geocoder): bump build_version to 15 (vertex quantization format)
zackpollard cb91b62
fix(geocoder-diff): emit admin/poi vertices as raw blocks
zackpollard 096ac9c
fix(geocoder-diff): emit tiered string marker before explicit-remap
zackpollard 44d36c1
ci(geocoder-build): set pipefail on build-index so silent crashes pro…
zackpollard ece2bae
fix(builder): drop oversized vertex-bytes pre-reserve
zackpollard 179bd0c
fix(builder): propagate addr_vertices through continent filter
zackpollard 0545749
test-portal: q2.5 default + add second test server (uncapped) for com…
zackpollard d38a7de
feat(geocoder): admin-minimal tier, configurations.json migration, mu…
zackpollard d1f0232
fix(geocoder): patch chain bootstrap + 3-state polygons toggle
zackpollard 7c76d83
fix(geocoder-diff): emit cross-tier string remaps in explicit section
zackpollard 3a4b1ff
fix(geocoder-diff): byte-block delta for admin_vertices.bin
zackpollard 53a7102
fix(geocoder): fall back to <region>/full/ for strings_*.bin
zackpollard c81ef6b
feat(geocoder-diff): byte-block delta for poi_vertices.bin
zackpollard aa54b91
fix(ci): timeout the geonames + wikidata downloads
zackpollard de05f9f
fix(geocoder-diff): cheap fallback path for poi-only invocations
zackpollard 8944969
fix(geocoder-diff): postcode_id remap + skip POI_PARENT_REMAP for non…
zackpollard 1ffb29d
fix(geocoder-diff): generalize parent-id remap to addr_points + place…
zackpollard 1a58f17
feat(geocoder-build): IdAllocator scaffolding for persistent dense IDs
zackpollard 501283b
feat(geocoder-build): emit street_ways.osm_ids.bin sidecar
zackpollard 1df2a9f
feat(geocoder-build): strategy-2 stable IDs for street_ways
zackpollard 71059c3
feat(geocoder-build): strategy-2 stable IDs for admin_polygons
zackpollard e70306b
feat(ci): wire strategy-2 sidecar lifecycle through CI
zackpollard b57e57b
feat(geocoder-build): scaffold sidecar fields for remaining record types
zackpollard 99b6e1c
feat(geocoder-build): plumb osm_id through addr/place/poi/interp crea…
zackpollard a018285
feat(geocoder-build): apply_strategy2_* for addr/place/poi/interp
zackpollard 7b77ef9
feat(geocoder-build): emit strategy-2 sidecars for all 6 record types
zackpollard 61196c0
chore(geocoder-build): bump build_version 16 → 17 for strategy-2
zackpollard a146065
feat(geocoder-build): preserve osm_ids through continent_filter
zackpollard e7abccb
feat(geocoder-server): tombstone-aware record accessors
zackpollard f1d3267
feat(geocoder-build): strategy-2 stable IDs for postcode_centroids
zackpollard a9eaea9
fix(geocoder-build): emit canonical full-set POI sidecar for strategy-2
zackpollard 328e5a0
revert: build_version stays at 16, strategy-2 sidecars are additive
zackpollard f702006
perf(geocoder-build): identity-remap fast path skips shadow alloc
zackpollard 738c427
perf(geocoder-build): drop IdAllocator.claimed_ and free prev_to_idx_…
zackpollard fb47623
chore(ci): log MemAvailable + build-index RSS every 30s during step 9
zackpollard 9658619
fix(geocoder-build): log strategy2-pois stats before take_slots()
zackpollard d322ee9
perf(geocoder-build): cap continent parallelism at 2, stream memwatch…
zackpollard 3fd9d61
chore(ci): push memwatch samples to S3 every 30s
zackpollard e28f84b
chore(ci): move memwatch upload to public Tigris bucket
zackpollard 1fbaf54
perf(geocoder-build): release dense node index after way parsing
zackpollard e2e0632
fix(geocoder-diff,patch): order POI_PARENT_REMAP first + admin_polygo…
zackpollard 56220b2
fix(geocoder-build): rebuild street_nodes/interp_nodes in way order a…
zackpollard 55ca34f
perf(geocoder-diff,patch): sparse position-delta for FULL_REPLACE files
zackpollard aa54f52
fix(geocoder-diff): keep str_remap alive until after emit_sparse_delta
zackpollard 8c1e39d
chore(geocoder-diff): log sparse-delta run-length stats
zackpollard 5453880
fix(geocoder-diff): use osm_id sidecar as secondary-match key
zackpollard bc83158
Revert "fix(geocoder-diff): use osm_id sidecar as secondary-match key"
zackpollard 948cdfb
perf(geocoder-patch): delta-encode ENTRY_CORRECTION
zackpollard 8b15bfe
fix(geocoder-diff): use osm_id sidecar as secondary-match key
zackpollard 7dc21d3
Revert "fix(geocoder-diff): use osm_id sidecar as secondary-match key"
zackpollard e2f3c0e
Revert "perf(geocoder-patch): delta-encode ENTRY_CORRECTION"
zackpollard 8b485f9
docs: handoff for geocoder patch-size reduction session
zackpollard c1f7101
perf(geocoder): byte-block merge for addr_vertices via content-hash
zackpollard e02ca59
fix(geocoder): emit addr_points vertex_offset fixups for byte-block m…
zackpollard 8daca37
chore(ci): capture per-variant diff logs as artifact
zackpollard 60f1532
perf(geocoder-diff): remove emit_sparse_delta FULL_REPLACE fallback
zackpollard 587613c
fix(geocoder-build): correct admin_polygons sidecar prev_dir path
zackpollard 63ebed3
docs: update handoff with oceania results + admin path fix findings
zackpollard c8c3b3c
fix(geocoder-build): sort addr_osm_ids before strategy-2 for determin…
zackpollard 4c12577
fix(geocoder-build): reorder _osm_ids in lockstep with deterministic …
zackpollard 0c4ab0c
docs: update handoff with build-determinism breakthrough
zackpollard ec44b40
fix(geocoder-build): reorder interp_osm_ids in lockstep with sort
zackpollard 7976e2c
fix(geocoder-build): reorder place_osm_ids + poi_osm_ids in lockstep …
zackpollard f189bdb
docs: planet validation results — 477 MiB compressed (8x reduction)
zackpollard 6a20b9d
fix(geocoder-build): osm_id tiebreakers in sort cmps for full determi…
zackpollard 627ae7e
fix(geocoder-build): iterate sort order in osm_ids dedup for ways/pois
zackpollard 7fd6af3
docs: 92 MiB planet patch — 41x reduction achieved
zackpollard 1cf9f0b
docs: validate real day-over-day chain — 3 days oceania, 26/26 each
zackpollard 6718dd6
docs: multi-day chain test + per-preset patch sizes
zackpollard 9f50684
docs: clarify that .osm_ids sidecars are never in published bundle
zackpollard a527e24
docs: explicit structural reality of fresh vs chained builds
zackpollard 6b19bc6
chore(geocoder-build): add per-structure memory profiling at peak
zackpollard c6de2e1
perf(geocoder-build): shrink_to_fit big parsed containers post-release
zackpollard 6d563f3
perf(geocoder-build): release dense node index BEFORE admin assembly
zackpollard a670268
ci(geocoder): daily schedule + Tigris/cache retention + crash-retry w…
zackpollard cc1b091
ci(geocoder): upload osm_ids sidecars to public bucket too
zackpollard 8b71059
fix(geocoder): correct strategy-2 remap of POI/cell reference fields
zackpollard 104a22e
ci(geocoder): harden watchdog ref + cleanup guards (review fixes)
zackpollard 981ca7f
Merge fix/strategy2-remap-bugs: correct strategy-2 POI/cell remaps
zackpollard d413c3d
test(geocoder): add grid_query differential harness for read-path val…
zackpollard 95a30e7
fix(geocoder-build): keep quality admin_polygons.bin index-aligned wi…
zackpollard bab4684
perf(geocoder-diff): coalesce runs in child/vertex byte-stream merges
zackpollard f723164
Merge perf/coalesce-merge-runs: coalesce byte-stream merge runs
zackpollard 09dd518
fix(geocoder-build): give closed-way admin polygons a stable osm_id (…
zackpollard c67c60b
fix(geocoder-build): reorder admin_osm_ids in lockstep with vertex-co…
zackpollard b0d8c4d
fix(geocoder-build): deterministic tie-break for addr parent_way_id (…
zackpollard 7aaa614
fix(geocoder-diff): skip full-replace of byte-identical raw files
zackpollard 9865c13
fix(geocoder-build): unique stable id for relation-emitted addr point…
zackpollard 64fc8c6
fix(geocoder-build): deterministic admin tie-break for parent selecti…
zackpollard 97b37e0
fix(geocoder-diff): skip sparse-delta of byte-identical files too
zackpollard def0d66
fix(geocoder-build): deterministic place-type map merge for admin lin…
zackpollard 1c055ef
fix(geocoder-diff): skip merge-encoding of byte-identical files
zackpollard 81b9c21
fix(geocoder-build): deterministic place-node link tie-break for admi…
zackpollard cbb3ba4
fix(geocoder-diff): skip vertex/way offset fixup for byte-identical f…
zackpollard 731c4ef
merge fix/admin-closedway-stable-id: #105/#117 determinism + diff-siz…
zackpollard dc9ec64
fix(geocoder-build): close planet determinism gaps found in branch re…
zackpollard 81b6941
refactor(geocoder-diff): centralize copy-old marker + harden patch apply
zackpollard cb56533
test(geocoder-build): add dependency-free unit test suite + code revi…
zackpollard 2efa34e
test(geocoder-server): add unit tests for pure helpers (6 -> 48 tests)
zackpollard 16eec17
refactor(geocoder-build): hoist duplicated CellItemPair comparator
zackpollard 8190e6f
fix(geocoder-server): remove alignment UB in decode_polygon_verts F32…
zackpollard 48a47d3
refactor(geocoder-build): lift classify_poi to a file-scope free func…
zackpollard baa5ab6
docs(geocoder): record applied refactors + human-supervised remainder…
zackpollard 0b654c3
refactor(geocoder-build): name magic constants + guard external-tool …
zackpollard b2efa90
docs(geocoder): mark byte-safe MEDIUM polish items as done in review
zackpollard 05b22b9
refactor(geocoder-build): hoist float_bits + drop re-inlined cell_ite…
zackpollard 683fda6
docs(geocoder): correct verified review findings + record float_bits …
zackpollard 0fb5020
refactor(geocoder-server): byte-safe cleanups in the query/http/auth …
zackpollard 8d10ad7
refactor(geocoder-build): byte-safe cleanups in builder core
zackpollard 7cd9c24
refactor(geocoder-build): byte-safe cleanups in the diff/patch tools
zackpollard bb91527
docs(geocoder): record batch-A byte-safe cleanups + the caught mmap r…
zackpollard fa72bf8
fix(geocoder-server): correct three Nominatim divergences in the read…
zackpollard cd4db9c
docs(geocoder): record nominatim-bug verdicts (3 fixed, 1 not-a-bug, …
zackpollard dfd3014
docs(geocoder): postcode investigation — rural gap root-caused, build…
zackpollard 93611b3
fix(geocoder-server): canonicalize US ZIP+4 to 5-digit base on output
zackpollard 002c5e4
docs(geocoder): record US ZIP+4 shipped server-side; builder approach…
zackpollard 49ad4d3
refactor(geocoder-build): use FNV1A_* named constants in cell_index p…
zackpollard c82c706
refactor(geocoder-build): extract 4 self-contained main() phases to f…
zackpollard 687565b
refactor(geocoder-build): hoist parallel_sort_and_build to file scope
zackpollard d54969c
refactor(geocoder-build): extract place-node containment + find_linke…
zackpollard c9fc761
refactor(geocoder-build): extract 3 POI parent-precompute phases
zackpollard 5c1393c
docs(geocoder): record main() decomposition progress (9 phases, -25%)
zackpollard 338dbc5
refactor(geocoder-build): extract the S2/POI cell-computation section…
zackpollard b48e82e
refactor(geocoder-build): sub-extract S2-ways-interp + POI-s2-cells p…
zackpollard 3e2325a
docs(geocoder): record completed S2-section restructure (main() -29%)
zackpollard daf75c9
refactor(geocoder-build): extract write/rebuild/det-ordering from main()
zackpollard 08ce490
refactor(geocoder-server): extract resolve_admin + collect_landmark f…
zackpollard 7f07857
refactor(geocoder-build): dedup apply_strategy2 finalize into a helper
zackpollard 4b996a7
refactor(geocoder-server): remove dead non-fb lookup twins + unused i…
zackpollard c78e479
refactor(geocoder-build): remove dead code + add cell-overflow detection
zackpollard 5b1e016
fix(geocoder-server): guard query_geo street files instead of unwrap
zackpollard f0ee997
refactor(geocoder-build): dedup ring canonicalization into a helper
zackpollard cdda56d
refactor(geocoder-build): dedup PBF string-table extraction
zackpollard c2c90e2
chore(geocoder-ui): stop tracking generated configurations.json
zackpollard f19fe46
fix(geocoder-build): fail the build on cell entry-count overflow
zackpollard 6d0d061
refactor(geocoder-build): dedup poi_parent sweeps into shared helpers
zackpollard a6fb415
fix(geocoder-server): reject half-present index file groups at load
zackpollard 535d254
fix(geocoder-server): route postcode through the actual primary winner
zackpollard bf62004
feat(geocoder): tiger per-segment zip postcodes (rural-us fix)
zackpollard f8ec4e4
docs(geocoder): record shipped b-1/b-2/b-4/tiger fixes; mark determin…
zackpollard dc072db
fix(geocoder-build): review batch — races, hardening, dead code
zackpollard acf2677
fix(geocoder-build): wikidata sitelink parse, ring backtrack leak, co…
zackpollard bca3df4
fix(ci): geocoder pipeline guards from the PR-branch review
zackpollard 48da3a8
fix(geocoder-server): review batch — downloads, panics, bounds, limits
zackpollard 50820ca
test(geocoder-build): REQUIRE macro, parity lock-ins, doc corrections
zackpollard 60ee343
docs(geocoder): record the full pr-branch review round
zackpollard 967dd9b
fix(geocoder-server): honor interior cell flags only for the query's …
zackpollard d56ff4a
fix(geocoder-build): deterministic geonames country codes for postcod…
zackpollard e518d80
fix(geocoder-build): match nominatim place linking and hide linked nodes
zackpollard 556fcc4
fix(geocoder-server): nominatim parity for maritime, region and place…
zackpollard 96bd524
chore(geocoder-server): add pc_debug postcode debugging example
zackpollard d109013
fix(geocoder-diff): guard merge re-anchoring against duplicate-conten…
zackpollard 1076497
feat(geocoder-server): constrained-memory readiness for immich embedding
zackpollard 6cf78cf
docs(geocoder): memory footprint guidance + container healthcheck
zackpollard 2b3931f
feat(geocoder-server): GEOCODER_ALLOW_ANONYMOUS for private-network s…
zackpollard 729a6a8
docs(geocoder): immich integration plan
zackpollard 5321add
docs(geocoder): rework immich plan around in-process embedding
zackpollard f7fc6d2
docs(geocoder): fix stale sidecar wording in plan intro
zackpollard 0331125
feat(geocoder-node): napi-rs binding prototype for in-process immich …
zackpollard File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,194 @@ | ||
| name: Profile Patch Pipeline | ||
|
|
||
| concurrency: | ||
| group: geocoder-profile | ||
| cancel-in-progress: true | ||
|
|
||
| on: | ||
| push: | ||
| paths: | ||
| - '.github/workflows/geocoder-profile.yml' | ||
| workflow_dispatch: | ||
|
|
||
| env: | ||
| S3_BUCKET: geoshenanigans-reverse-geocoding | ||
| S3_ENDPOINT: https://t3.storage.dev | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| profile: | ||
| runs-on: pokedex-giant | ||
| timeout-minutes: 120 | ||
| steps: | ||
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 | ||
| with: | ||
| persist-credentials: false | ||
|
|
||
| - name: Install tools | ||
| run: | | ||
| sudo apt-get update -qq | ||
| sudo apt-get install -y -qq cmake g++ libz-dev libzstd-dev \ | ||
| libbz2-dev libexpat1-dev libosmium2-dev jq time | ||
| curl -sL "https://github.com/peak/s5cmd/releases/download/v2.3.0/s5cmd_2.3.0_Linux-64bit.tar.gz" \ | ||
| -o /tmp/s5cmd.tar.gz | ||
| sudo tar xzf /tmp/s5cmd.tar.gz -C /usr/local/bin s5cmd | ||
|
|
||
| - name: Configure credentials | ||
| run: | | ||
| echo "::add-mask::$AWS_ACCESS_KEY_ID" | ||
| echo "::add-mask::$AWS_SECRET_ACCESS_KEY" | ||
| echo "CACHE_AWS_KEY=$AWS_ACCESS_KEY_ID" >> "$GITHUB_ENV" | ||
| echo "CACHE_AWS_SECRET=$AWS_SECRET_ACCESS_KEY" >> "$GITHUB_ENV" | ||
| echo "AWS_ACCESS_KEY_ID=$KEY" >> "$GITHUB_ENV" | ||
| echo "AWS_SECRET_ACCESS_KEY=$SECRET" >> "$GITHUB_ENV" | ||
| env: | ||
| KEY: ${{ secrets.TIGRIS_WRITE_KEY_ID }} | ||
|
|
||
| SECRET: ${{ secrets.TIGRIS_WRITE_ACCESS_KEY }} | ||
|
|
||
|
|
||
| - name: Build tools | ||
| run: | | ||
| cd geocoder/builder && mkdir -p build && cd build | ||
| cmake .. -DCMAKE_BUILD_TYPE=Release | ||
| make -j$(nproc) geocoder-diff geocoder-patch | ||
| echo "$PWD" >> "$GITHUB_PATH" | ||
|
|
||
| - name: Download two builds from Tigris | ||
| run: | | ||
| S5="s5cmd --endpoint-url $S3_ENDPOINT" | ||
| echo "Downloading 2026-04-04 build..." | ||
| START=$(date +%s) | ||
| $S5 cp "s3://$S3_BUCKET/geocoder/builds/2026-04-04/*" /tmp/build-old/ | ||
| echo "Old: $(find /tmp/build-old -type f | wc -l) files in $(($(date +%s)-START))s" | ||
|
|
||
| echo "Downloading 2026-04-05 build..." | ||
| START=$(date +%s) | ||
| $S5 cp "s3://$S3_BUCKET/geocoder/builds/2026-04-05/*" /tmp/build-new/ | ||
| echo "New: $(find /tmp/build-new -type f | wc -l) files in $(($(date +%s)-START))s" | ||
|
|
||
| - name: Profile each variant | ||
| run: | | ||
| OLD="/tmp/build-old" | ||
| NEW="/tmp/build-new" | ||
| WORKDIR="/tmp/profile" | ||
| mkdir -p "$WORKDIR" | ||
|
|
||
| echo "CPUs: $(nproc)" | ||
| echo "Memory: $(free -h | awk '/Mem:/{print $2}')" | ||
| echo "Cgroup mem: $(cat /sys/fs/cgroup/memory.max 2>/dev/null | numfmt --to=iec 2>/dev/null || echo unknown)" | ||
| echo "" | ||
|
|
||
| VARIANTS=$(cd "$NEW" && find . -name "*.bin" -exec dirname {} \; | sort -u | sed 's|^\./||') | ||
|
|
||
| # Header | ||
| echo "## Patch Profile Results" >> "$GITHUB_STEP_SUMMARY" | ||
| echo "" >> "$GITHUB_STEP_SUMMARY" | ||
| echo "| Variant | Files | Diff (s) | Diff Mem (MB) | Patch Size (KB) | Patch (s) | Patch Mem (MB) | Verify (s) | Total (s) |" >> "$GITHUB_STEP_SUMMARY" | ||
| echo "|---------|-------|----------|---------------|-----------------|-----------|----------------|------------|-----------|" >> "$GITHUB_STEP_SUMMARY" | ||
|
|
||
| for variant in $VARIANTS; do | ||
| N_NEW=$(ls "$NEW/$variant/"*.bin 2>/dev/null | wc -l) | ||
| N_OLD=$(ls "$OLD/$variant/"*.bin 2>/dev/null | wc -l) | ||
| [ "$N_NEW" -lt 2 ] && continue | ||
| [ "$N_OLD" -ne "$N_NEW" ] && continue | ||
|
|
||
| SAFE=$(echo "$variant" | tr '/' '_') | ||
| PATCH="$WORKDIR/${SAFE}.gcpatch" | ||
| VERIFY="$WORKDIR/verify-${SAFE}" | ||
| mkdir -p "$VERIFY" | ||
|
|
||
| TOTAL_START=$(date +%s%N) | ||
|
|
||
| # Diff | ||
| DIFF_START=$(date +%s%N) | ||
| /usr/bin/time -v geocoder-diff "$OLD/$variant/" "$NEW/$variant/" -o "$PATCH" 2>"$WORKDIR/t-diff" >/dev/null | ||
| DIFF_END=$(date +%s%N) | ||
| DIFF_S=$(echo "scale=1; ($DIFF_END - $DIFF_START) / 1000000000" | bc) | ||
| DIFF_MEM=$(grep "Maximum resident" "$WORKDIR/t-diff" | awk '{print int($NF/1024)}') | ||
| PATCH_KB=$(( $(stat -c%s "$PATCH" 2>/dev/null || echo 0) / 1024 )) | ||
|
|
||
| # Patch | ||
| PATCH_START=$(date +%s%N) | ||
| /usr/bin/time -v geocoder-patch "$OLD/$variant/" "$PATCH" -o "$VERIFY/" 2>"$WORKDIR/t-patch" >/dev/null | ||
| PATCH_END=$(date +%s%N) | ||
| PATCH_S=$(echo "scale=1; ($PATCH_END - $PATCH_START) / 1000000000" | bc) | ||
| PATCH_MEM=$(grep "Maximum resident" "$WORKDIR/t-patch" | awk '{print int($NF/1024)}') | ||
|
|
||
| # Verify | ||
| VERIFY_START=$(date +%s%N) | ||
| MATCH=0 | ||
| for f in "$NEW/$variant/"*.bin; do | ||
| b=$(basename "$f") | ||
| cmp -s "$VERIFY/$b" "$NEW/$variant/$b" && MATCH=$((MATCH + 1)) | ||
| done | ||
| VERIFY_END=$(date +%s%N) | ||
| VERIFY_S=$(echo "scale=1; ($VERIFY_END - $VERIFY_START) / 1000000000" | bc) | ||
|
|
||
| TOTAL_END=$(date +%s%N) | ||
| TOTAL_S=$(echo "scale=1; ($TOTAL_END - $TOTAL_START) / 1000000000" | bc) | ||
|
|
||
| STATUS="✓" | ||
| [ "$MATCH" -ne "$N_NEW" ] && STATUS="✗" | ||
|
|
||
| echo "$variant: diff=${DIFF_S}s(${DIFF_MEM}MB) patch=${PATCH_S}s(${PATCH_MEM}MB) verify=${VERIFY_S}s total=${TOTAL_S}s ${STATUS}" | ||
| echo "| $variant | $N_NEW | $DIFF_S | $DIFF_MEM | $PATCH_KB | $PATCH_S | $PATCH_MEM | $VERIFY_S | $TOTAL_S |" >> "$GITHUB_STEP_SUMMARY" | ||
|
|
||
| rm -f "$PATCH" | ||
| rm -rf "$VERIFY" | ||
| done | ||
|
|
||
| echo "" >> "$GITHUB_STEP_SUMMARY" | ||
|
|
||
| - name: Profile parallel runs | ||
| run: | | ||
| OLD="/tmp/build-old" | ||
| NEW="/tmp/build-new" | ||
| WORKDIR="/tmp/profile-parallel" | ||
|
|
||
| VARIANTS=$(cd "$NEW" && find . -name "*.bin" -exec dirname {} \; | sort -u | sed 's|^\./||') | ||
|
|
||
| echo "## Parallel Profile" >> "$GITHUB_STEP_SUMMARY" | ||
| echo "" >> "$GITHUB_STEP_SUMMARY" | ||
|
|
||
| for PARALLEL in 1 4 8 16 32 64; do | ||
| rm -rf "$WORKDIR" && mkdir -p "$WORKDIR" | ||
| echo "Testing $PARALLEL parallel jobs..." | ||
| START=$(date +%s) | ||
| PEAK_MEM=0 | ||
| JOBS=0 | ||
|
|
||
| for variant in $VARIANTS; do | ||
| N_NEW=$(ls "$NEW/$variant/"*.bin 2>/dev/null | wc -l) | ||
| N_OLD=$(ls "$OLD/$variant/"*.bin 2>/dev/null | wc -l) | ||
| [ "$N_NEW" -lt 2 ] && continue | ||
| [ "$N_OLD" -ne "$N_NEW" ] && continue | ||
|
|
||
| ( | ||
| SAFE=$(echo "$variant" | tr '/' '_') | ||
| PATCH="$WORKDIR/${SAFE}.gcpatch" | ||
| VERIFY="$WORKDIR/verify-${SAFE}" | ||
| mkdir -p "$VERIFY" | ||
| geocoder-diff "$OLD/$variant/" "$NEW/$variant/" -o "$PATCH" 2>/dev/null | ||
| geocoder-patch "$OLD/$variant/" "$PATCH" -o "$VERIFY/" 2>/dev/null | ||
| MATCH=0 | ||
| for f in "$NEW/$variant/"*.bin; do | ||
| b=$(basename "$f") | ||
| cmp -s "$VERIFY/$b" "$NEW/$variant/$b" && MATCH=$((MATCH + 1)) | ||
| done | ||
| rm -f "$PATCH" | ||
| rm -rf "$VERIFY" | ||
| ) & | ||
|
|
||
| JOBS=$((JOBS + 1)) | ||
| if [ $JOBS -ge $PARALLEL ]; then | ||
| wait -n 2>/dev/null || true | ||
| JOBS=$((JOBS - 1)) | ||
| fi | ||
| done | ||
| wait | ||
| END=$(date +%s) | ||
| ELAPSED=$((END - START)) | ||
| echo " parallel=$PARALLEL: ${ELAPSED}s" | ||
| echo "| $PARALLEL parallel | ${ELAPSED}s |" >> "$GITHUB_STEP_SUMMARY" | ||
| done | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| build/ | ||
| target/ | ||
| server/target/ | ||
| test-output/ | ||
| *.osm.pbf | ||
| .git/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| build/ | ||
| target/ | ||
| test-output/ | ||
| *.osm.pbf |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| # Stage 1: Build C++ indexer | ||
| FROM debian:bookworm-slim AS builder-cpp | ||
|
|
||
| RUN apt-get update && apt-get install -y --no-install-recommends \ | ||
| build-essential cmake \ | ||
| libosmium2-dev libprotozero-dev \ | ||
| libs2-dev \ | ||
| zlib1g-dev libbz2-dev libexpat1-dev liblz4-dev \ | ||
| && rm -rf /var/lib/apt/lists/* | ||
|
|
||
| WORKDIR /src | ||
| COPY builder/ builder/ | ||
| RUN mkdir build && cd build && cmake ../builder && make -j$(nproc) | ||
|
|
||
| # Stage 2: Build Rust server | ||
| FROM rust:bookworm AS builder-rust | ||
|
|
||
| RUN apt-get update && apt-get install -y --no-install-recommends \ | ||
| cmake \ | ||
| && rm -rf /var/lib/apt/lists/* | ||
|
|
||
| WORKDIR /src | ||
| COPY server/ server/ | ||
| RUN cargo build --release --manifest-path server/Cargo.toml | ||
|
|
||
| # Stage 3: Runtime | ||
| FROM debian:bookworm-slim | ||
|
|
||
| RUN apt-get update && apt-get install -y --no-install-recommends \ | ||
| libs2-0 \ | ||
| zlib1g libbz2-1.0 libexpat1 liblz4-1 \ | ||
| curl ca-certificates \ | ||
| && rm -rf /var/lib/apt/lists/* | ||
|
|
||
| COPY --from=builder-cpp /src/build/build-index /usr/local/bin/ | ||
| COPY --from=builder-rust /src/server/target/release/query-server /usr/local/bin/ | ||
| COPY entrypoint.sh /usr/local/bin/ | ||
|
|
||
| RUN chmod +x /usr/local/bin/entrypoint.sh | ||
|
|
||
| ENTRYPOINT ["entrypoint.sh"] | ||
| CMD ["auto"] |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Check warning
Code scanning / zizmor
action's hash pin has mismatched or missing version comment: points to commit df4cb1c069e1 Warning