Skip to content
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

Move NumberFormat to thread-local variable #387

Merged
merged 4 commits into from
Nov 22, 2022

Conversation

erik
Copy link
Contributor

@erik erik commented Nov 18, 2022

The NumberFormat class isn't thread safe (StackOverflow, Docs), and sharing one instance across threads allowed for races which resulted in otherwise valid OSM tags not being parsed correctly.

This surfaced as some rather strange exceptions during Planetiler runs that I wasn't able to reproduce when running each input individually. For example, both of these exceptions were not reproducible in unit tests:

java.lang.NumberFormatException: For input string: ""
java.lang.NumberFormatException: For input string: "1."

Given that it's a race condition, I'm not sure how to write a proper test for this, but this change reliably fixes the issue for me during local runs, and the existing tests for Parse should at least confirm that there aren't regressions.

The NumberFormat class isn't thread safe, and sharing one instance
across threads allowed for races which resulted in otherwise valid OSM
tags not being parsed correctly.
@github-actions
Copy link

github-actions bot commented Nov 18, 2022

Base c73c835 This Branch 04ed8f7
0:01:44 DEB [mbtiles] - Tile stats:
0:01:44 DEB [mbtiles] - z0 avg:7.9k max:7.9k
0:01:44 DEB [mbtiles] - z1 avg:4k max:4k
0:01:44 DEB [mbtiles] - z2 avg:9.4k max:9.4k
0:01:44 DEB [mbtiles] - z3 avg:4k max:6.4k
0:01:44 DEB [mbtiles] - z4 avg:1.6k max:4.6k
0:01:44 DEB [mbtiles] - z5 avg:1.4k max:8.2k
0:01:44 DEB [mbtiles] - z6 avg:980 max:22k
0:01:44 DEB [mbtiles] - z7 avg:754 max:55k
0:01:44 DEB [mbtiles] - z8 avg:396 max:112k
0:01:44 DEB [mbtiles] - z9 avg:270 max:278k
0:01:44 DEB [mbtiles] - z10 avg:154 max:233k
0:01:44 DEB [mbtiles] - z11 avg:103 max:132k
0:01:44 DEB [mbtiles] - z12 avg:83 max:119k
0:01:44 DEB [mbtiles] - z13 avg:71 max:109k
0:01:44 DEB [mbtiles] - z14 avg:67 max:282k
0:01:44 DEB [mbtiles] - all avg:70 max:0
0:01:44 DEB [mbtiles] -  # features: 5,304,942
0:01:44 DEB [mbtiles] -     # tiles: 4,115,454
0:01:44 INF [mbtiles] - Finished in 24s cpu:48s avg:2
0:01:44 INF [mbtiles] -   read    1x(2% 0.5s wait:23s)
0:01:44 INF [mbtiles] -   encode  2x(59% 14s)
0:01:44 INF [mbtiles] -   write   1x(16% 4s wait:19s)
0:01:44 INF - Finished in 1m45s cpu:3m gc:3s avg:1.7
0:01:44 INF - FINISHED!
0:01:44 INF - 
0:01:44 INF - ----------------------------------------
0:01:44 INF - 	overall          1m45s cpu:3m gc:3s avg:1.7
0:01:44 INF - 	lake_centerlines 2s cpu:4s avg:1.9
0:01:44 INF - 	  read     1x(84% 2s)
0:01:44 INF - 	  process  2x(12% 0.2s wait:2s)
0:01:44 INF - 	  write    1x(0% 0s wait:2s)
0:01:44 INF - 	water_polygons   24s cpu:42s gc:2s avg:1.8
0:01:44 INF - 	  read     1x(62% 15s wait:2s)
0:01:44 INF - 	  process  2x(29% 7s wait:11s)
0:01:44 INF - 	  write    1x(2% 0.5s wait:23s)
0:01:44 INF - 	natural_earth    12s cpu:14s avg:1.1
0:01:44 INF - 	  read     1x(61% 7s sys:1s done:4s)
0:01:44 INF - 	  process  2x(13% 2s wait:8s done:4s)
0:01:44 INF - 	  write    1x(0% 0s wait:8s done:4s)
0:01:44 INF - 	osm_pass1        3s cpu:6s avg:1.7
0:01:44 INF - 	  read     1x(2% 0.1s wait:3s)
0:01:44 INF - 	  parse    1x(66% 2s)
0:01:44 INF - 	  process  1x(45% 2s wait:1s)
0:01:44 INF - 	osm_pass2        28s cpu:55s avg:2
0:01:44 INF - 	  read     1x(0% 0s wait:14s done:14s)
0:01:44 INF - 	  process  2x(77% 22s)
0:01:44 INF - 	  write    1x(1% 0.3s wait:28s)
0:01:44 INF - 	boundaries       0s cpu:0.1s avg:1.5
0:01:44 INF - 	sort             2s cpu:3s avg:1.3
0:01:44 INF - 	  worker  1x(78% 2s)
0:01:44 INF - 	mbtiles          24s cpu:48s avg:2
0:01:44 INF - 	  read    1x(2% 0.5s wait:23s)
0:01:44 INF - 	  encode  2x(59% 14s)
0:01:44 INF - 	  write   1x(16% 4s wait:19s)
0:01:44 INF - ----------------------------------------
0:01:44 INF - 	features	271MB
0:01:44 INF - 	mbtiles	108MB
-rw-r--r-- 1 runner docker 62M Nov 21 20:29 run.jar
0:01:39 DEB [mbtiles] - Tile stats:
0:01:39 DEB [mbtiles] - z0 avg:7.9k max:7.9k
0:01:39 DEB [mbtiles] - z1 avg:4k max:4k
0:01:39 DEB [mbtiles] - z2 avg:9.4k max:9.4k
0:01:39 DEB [mbtiles] - z3 avg:4k max:6.4k
0:01:39 DEB [mbtiles] - z4 avg:1.6k max:4.6k
0:01:39 DEB [mbtiles] - z5 avg:1.4k max:8.2k
0:01:39 DEB [mbtiles] - z6 avg:980 max:22k
0:01:39 DEB [mbtiles] - z7 avg:754 max:55k
0:01:39 DEB [mbtiles] - z8 avg:396 max:112k
0:01:39 DEB [mbtiles] - z9 avg:270 max:278k
0:01:39 DEB [mbtiles] - z10 avg:154 max:233k
0:01:39 DEB [mbtiles] - z11 avg:103 max:132k
0:01:39 DEB [mbtiles] - z12 avg:83 max:119k
0:01:39 DEB [mbtiles] - z13 avg:71 max:109k
0:01:39 DEB [mbtiles] - z14 avg:67 max:282k
0:01:39 DEB [mbtiles] - all avg:70 max:0
0:01:39 DEB [mbtiles] -  # features: 5,304,942
0:01:39 DEB [mbtiles] -     # tiles: 4,115,454
0:01:39 INF [mbtiles] - Finished in 23s cpu:46s gc:1s avg:2
0:01:39 INF [mbtiles] -   read    1x(2% 0.5s wait:22s)
0:01:39 INF [mbtiles] -   encode  2x(60% 14s)
0:01:39 INF [mbtiles] -   write   1x(16% 4s wait:18s)
0:01:39 INF - Finished in 1m39s cpu:2m56s gc:3s avg:1.8
0:01:39 INF - FINISHED!
0:01:39 INF - 
0:01:39 INF - ----------------------------------------
0:01:39 INF - 	overall          1m39s cpu:2m56s gc:3s avg:1.8
0:01:39 INF - 	lake_centerlines 2s cpu:3s avg:1.9
0:01:39 INF - 	  read     1x(80% 2s)
0:01:39 INF - 	  process  2x(13% 0.2s wait:2s)
0:01:39 INF - 	  write    1x(0% 0s wait:2s)
0:01:39 INF - 	water_polygons   23s cpu:41s gc:2s avg:1.8
0:01:39 INF - 	  read     1x(61% 14s wait:2s)
0:01:39 INF - 	  process  2x(29% 7s wait:10s)
0:01:39 INF - 	  write    1x(2% 0.5s wait:23s)
0:01:39 INF - 	natural_earth    9s cpu:14s avg:1.6
0:01:39 INF - 	  read     1x(90% 8s sys:1s)
0:01:39 INF - 	  process  2x(20% 2s wait:7s)
0:01:39 INF - 	  write    1x(0% 0s wait:8s)
0:01:39 INF - 	osm_pass1        3s cpu:5s avg:1.8
0:01:39 INF - 	  read     1x(2% 0.1s wait:3s)
0:01:39 INF - 	  parse    1x(74% 2s)
0:01:39 INF - 	  process  1x(42% 1s wait:1s)
0:01:39 INF - 	osm_pass2        28s cpu:55s avg:2
0:01:39 INF - 	  read     1x(0% 0s wait:14s done:14s)
0:01:39 INF - 	  process  2x(76% 21s)
0:01:39 INF - 	  write    1x(1% 0.3s wait:28s)
0:01:39 INF - 	boundaries       0s cpu:0.1s avg:1.7
0:01:39 INF - 	sort             1s cpu:2s avg:1.5
0:01:39 INF - 	  worker  1x(88% 1s)
0:01:39 INF - 	mbtiles          23s cpu:46s gc:1s avg:2
0:01:39 INF - 	  read    1x(2% 0.5s wait:22s)
0:01:39 INF - 	  encode  2x(60% 14s)
0:01:39 INF - 	  write   1x(16% 4s wait:18s)
0:01:39 INF - ----------------------------------------
0:01:39 INF - 	features	271MB
0:01:39 INF - 	mbtiles	108MB
-rw-r--r-- 1 runner docker 62M Nov 21 20:27 run.jar

https://github.com/onthegomap/planetiler/actions/runs/3517874164

ℹ️ Base Logs c73c835
0:00:00 DEB - argument: config=null (path to config file)
0:00:00 DEB - argument: area=rhode island (name of the extract to download if osm_url/osm_path not specified (i.e. 'monaco' 'rhode island' 'australia' or 'planet'))
0:00:00 INF - argument: stats=use in-memory stats
0:00:00 DEB - argument: madvise=true (default value for whether to use linux madvise(random) to improve memory-mapped read performance for temporary storage)
0:00:00 DEB - argument: storage=mmap (default storage type for temporary data, one of [ram, mmap, direct])
0:00:00 DEB - argument: threads=2 (num threads)
0:00:00 DEB - argument: write_threads=1 (number of threads to use when writing temp features)
0:00:00 DEB - argument: process_threads=2 (number of threads to use when processing input features)
0:00:00 DEB - argument: bounds=Env[-74.07 : -17.84, 21.34 : 43.55] (bounds)
0:00:00 DEB - argument: polygon=null (a .poly file that limits output to tiles intersecting the shape)
0:00:00 DEB - argument: minzoom=0 (minimum zoom level)
0:00:00 DEB - argument: maxzoom=14 (maximum zoom level up to 15)
0:00:00 DEB - argument: render_maxzoom=14 (maximum rendering zoom level up to 15)
0:00:00 DEB - argument: feature_read_threads=1 (number of threads to use when reading features at tile write time)
0:00:00 DEB - argument: loginterval=10 seconds (time between logs)
0:00:00 DEB - argument: skip_mbtiles_index_creation=false (skip adding index to mbtiles file)
0:00:00 DEB - argument: optimize_db=false (Vacuum analyze mbtiles after writing)
0:00:00 DEB - argument: emit_tiles_in_order=true (emit tiles in index order)
0:00:00 DEB - argument: force=false (overwriting output file and ignore disk/RAM warnings)
0:00:00 DEB - argument: gzip_temp=false (gzip temporary feature storage (uses more CPU, but less disk space))
0:00:00 DEB - argument: mmap_temp=true (use memory-mapped IO for temp feature files)
0:00:00 DEB - argument: sort_max_readers=6 (maximum number of concurrent read threads to use when sorting chunks)
0:00:00 DEB - argument: sort_max_writers=6 (maximum number of concurrent write threads to use when sorting chunks)
0:00:00 DEB - argument: nodemap_type=sparsearray (type of node location map, one of [noop, sortedtable, sparsearray, array])
0:00:00 DEB - argument: nodemap_storage=mmap (storage for node location map, one of [ram, mmap, direct])
0:00:00 DEB - argument: nodemap_madvise=true (use linux madvise(random) for node locations)
0:00:00 DEB - argument: multipolygon_geometry_storage=mmap (storage for multipolygon geometries, one of [ram, mmap, direct])
0:00:00 DEB - argument: multipolygon_geometry_madvise=true (use linux madvise(random) for temporary multipolygon geometry storage)
0:00:00 DEB - argument: http_user_agent=Planetiler downloader (https://github.com/onthegomap/planetiler) (User-Agent header to set when downloading files over HTTP)
0:00:00 DEB - argument: http_timeout=30 seconds (Timeout to use when downloading files over HTTP)
0:00:00 DEB - argument: http_retries=1 (Retries to use when downloading files over HTTP)
0:00:00 DEB - argument: download_chunk_size_mb=100 (Size of file chunks to download in parallel in megabytes)
0:00:00 DEB - argument: download_threads=1 (Number of parallel threads to use when downloading each file)
0:00:00 DEB - argument: min_feature_size_at_max_zoom=0.0625 (Default value for the minimum size in tile pixels of features to emit at the maximum zoom level to allow for overzooming)
0:00:00 DEB - argument: min_feature_size=1.0 (Default value for the minimum size in tile pixels of features to emit below the maximum zoom level)
0:00:00 DEB - argument: simplify_tolerance_at_max_zoom=0.0625 (Default value for the tile pixel tolerance to use when simplifying features at the maximum zoom level to allow for overzooming)
0:00:00 DEB - argument: simplify_tolerance=0.1 (Default value for the tile pixel tolerance to use when simplifying features below the maximum zoom level)
0:00:00 DEB - argument: osm_lazy_reads=true (Read OSM blocks from disk in worker threads)
0:00:00 DEB - argument: compact_db=true (Reduce the DB size by separating and deduping the tile data)
0:00:00 DEB - argument: skip_filled_tiles=false (Skip writing tiles containing only polygon fills to the output)
0:00:00 DEB - argument: tile_warning_size_mb=1.0 (Maximum size in megabytes of a tile to emit a warning about)
0:00:00 DEB - argument: tmpdir=data/tmp (temp directory)
0:00:00 DEB - argument: only_download=false (download source data then exit)
0:00:00 DEB - argument: download=false (download sources)
0:00:00 DEB - argument: temp_nodes=data/tmp/node.db (temp node db location)
0:00:00 DEB - argument: temp_multipolygons=data/tmp/multipolygon.db (temp multipolygon db location)
0:00:00 DEB - argument: temp_features=data/tmp/feature.db (temp feature db location)
0:00:00 DEB - argument: osm_parse_node_bounds=false (parse bounds from OSM nodes instead of header)
0:00:00 DEB - argument: only_fetch_wikidata=false (fetch wikidata translations then quit)
0:00:00 DEB - argument: fetch_wikidata=false (fetch wikidata translations then continue)
0:00:00 DEB - argument: use_wikidata=true (use wikidata translations)
0:00:00 DEB - argument: wikidata_cache=data/sources/wikidata_names.json (wikidata cache file)
0:00:00 DEB - argument: lake_centerlines_path=data/sources/lake_centerline.shp.zip (lake_centerlines shapefile path)
0:00:00 DEB - argument: free_lake_centerlines_after_read=false (delete lake_centerlines input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: water_polygons_path=data/sources/water-polygons-split-3857.zip (water_polygons shapefile path)
0:00:00 DEB - argument: free_water_polygons_after_read=false (delete water_polygons input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: natural_earth_path=data/sources/natural_earth_vector.sqlite.zip (natural_earth sqlite db path)
0:00:00 DEB - argument: free_natural_earth_after_read=false (delete natural_earth input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: osm_path=data/sources/rhode_island.osm.pbf (osm OSM input file path)
0:00:00 DEB - argument: free_osm_after_read=false (delete osm input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: mbtiles=data/out.mbtiles (mbtiles output file)
0:00:00 DEB - argument: transliterate=true (attempt to transliterate latin names)
0:00:00 DEB - argument: languages=am,ar,az,be,bg,br,bs,ca,co,cs,cy,da,de,el,en,eo,es,et,eu,fi,fr,fy,ga,gd,he,hi,hr,hu,hy,id,is,it,ja,ja_kana,ja_rm,ja-Latn,ja-Hira,ka,kk,kn,ko,ko-Latn,ku,la,lb,lt,lv,mk,mt,ml,nl,no,oc,pl,pt,rm,ro,ru,sk,sl,sq,sr,sr-Latn,sv,ta,te,th,tr,uk,zh (languages to use)
0:00:00 DEB - argument: only_layers= (Include only certain layers)
0:00:00 DEB - argument: exclude_layers= (Exclude certain layers)
0:00:00 DEB - argument: boundary_country_names=true (boundary layer: add left/right codes of neighboring countries)
0:00:00 DEB - argument: transportation_z13_paths=false (transportation(_name) layer: show all paths on z13)
0:00:00 DEB - argument: building_merge_z13=true (building layer: merge nearby buildings at z13)
0:00:00 DEB - argument: transportation_name_brunnel=false (transportation_name layer: set to false to omit brunnel and help merge long highways)
0:00:00 DEB - argument: transportation_name_size_for_shield=false (transportation_name layer: allow road names on shorter segments (ie. they will have a shield))
0:00:00 DEB - argument: transportation_name_limit_merge=false (transportation_name layer: limit merge so we don't combine different relations to help merge long highways)
0:00:00 DEB - argument: transportation_name_minor_refs=false (transportation_name layer: include name and refs from minor road networks if not present on a way)
0:00:00 DEB - argument: mbtiles_name=OpenMapTiles ('name' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org ('description' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_attribution=<a href="https://www.openmaptiles.org/" target="_blank">&copy; OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a> ('attribution' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_version=3.13.1 ('version' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_type=baselayer ('type' attribute for mbtiles metadata)
0:00:00 DEB - argument: help=false (show arguments then exit)
0:00:00 INF - Building OpenMapTilesProfile profile into data/out.mbtiles in these phases:
0:00:00 INF -   lake_centerlines: Process features in data/sources/lake_centerline.shp.zip
0:00:00 INF -   water_polygons: Process features in data/sources/water-polygons-split-3857.zip
0:00:00 INF -   natural_earth: Process features in data/sources/natural_earth_vector.sqlite.zip
0:00:00 INF -   osm_pass1: Pre-process OpenStreetMap input (store node locations then relation members)
0:00:00 INF -   osm_pass2: Process OpenStreetMap nodes, ways, then relations
0:00:00 INF -   sort: Sort rendered features by tile ID
0:00:00 INF -   mbtiles: Encode each tile and write to data/out.mbtiles
0:00:00 INF - no wikidata translations found, run with --fetch-wikidata to download
0:00:00 DEB - ✓ 196M storage on / (/dev/root) requested for read phase disk, 30G available
0:00:00 DEB -  - 44M used for temporary node location cache
0:00:00 DEB -  - 6.6M used for temporary multipolygon geometry cache
0:00:00 DEB -  - 145M used for temporary feature storage
0:00:00 DEB - ✓ 218M storage on / (/dev/root) requested for write phase disk, 30G available
0:00:00 DEB -  - 145M used for temporary feature storage
0:00:00 DEB -  - 72M used for mbtiles output
0:00:00 DEB - ✓ 313M JVM heap requested for read phase, 4.2G available
0:00:00 DEB -  - 300M used for sparsearray node location in-memory index
0:00:00 DEB -  - 13M used for temporary profile storage
0:00:00 DEB - ✓ 50M storage on / (/dev/root) requested for read phase, 30G available
0:00:00 DEB -  - 44M used for sparsearray node location cache
0:00:00 DEB -  - 6.6M used for multipolygon way geometries
0:00:00 DEB - ✓ 50M temporary files and 2.9G of free memory for OS to cache them
0:00:00 INF - Using merge sort feature map, chunk size=1431mb max workers=2
0:00:01 INF - dataFileCache open start
0:00:01 INF [lake_centerlines] - 
0:00:01 INF [lake_centerlines] - Starting...
0:00:03 INF [lake_centerlines] -  read: [  59k 100%  32k/s ] write: [    0    0/s ] 0    
    cpus: 1.9 gc:  3% heap: 160M/4.2G direct: 237k postGC: 75M
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:03 INF [lake_centerlines] - Finished in 2s cpu:4s avg:1.9
0:00:03 INF [lake_centerlines] -   read     1x(84% 2s)
0:00:03 INF [lake_centerlines] -   process  2x(12% 0.2s wait:2s)
0:00:03 INF [lake_centerlines] -   write    1x(0% 0s wait:2s)
0:00:03 INF [water_polygons] - 
0:00:03 INF [water_polygons] - Starting...
0:00:13 INF [water_polygons] -  read: [ 2.2k  15%  221/s ] write: [  52k 5.1k/s ] 1.4G 
    cpus: 1.9 gc: 11% heap: 1.6G/4.2G direct: 51M postGC: 1.1G
    read(59%) ->   (34/1k) -> process(40% 17%) -> (585/53k) -> write( 0%)
0:00:23 INF [water_polygons] -  read: [ 5.9k  41%  370/s ] write: [ 322k  26k/s ] 1.4G 
    cpus: 1.6 gc:  5% heap: 3G/4.2G direct: 51M postGC: 1.4G
    read(74%) ->    (0/1k) -> process(23% 27%) ->  (1k/53k) -> write( 0%)
0:00:27 INF [water_polygons] -  read: [  14k 100% 2.2k/s ] write: [ 4.3M   1M/s ] 186M 
    cpus: 1.7 gc: 13% heap: 2.9G/4.2G direct: 51M postGC: 1.7G
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:27 INF [water_polygons] - Finished in 24s cpu:42s gc:2s avg:1.8
0:00:27 INF [water_polygons] -   read     1x(62% 15s wait:2s)
0:00:27 INF [water_polygons] -   process  2x(29% 7s wait:11s)
0:00:27 INF [water_polygons] -   write    1x(2% 0.5s wait:23s)
0:00:27 INF [natural_earth] - unzipping /home/runner/work/planetiler/planetiler/data/sources/natural_earth_vector.sqlite.zip to data/tmp/natearth.sqlite
0:00:34 INF [natural_earth] - 
0:00:34 INF [natural_earth] - Starting...
0:00:46 INF [natural_earth] -  read: [ 349k 100%  41k/s ] write: [  181   21/s ] 186M 
    cpus: 1.5 gc:  1% heap: 1.7G/4.2G direct: 51M postGC: 1.7G
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:46 INF [natural_earth] - Finished in 12s cpu:14s avg:1.1
0:00:46 INF [natural_earth] -   read     1x(61% 7s sys:1s done:4s)
0:00:46 INF [natural_earth] -   process  2x(13% 2s wait:8s done:4s)
0:00:46 INF [natural_earth] -   write    1x(0% 0s wait:8s done:4s)
0:00:47 INF [osm_pass1] - 
0:00:47 INF [osm_pass1] - Starting...
0:00:49 INF [osm_pass1:process] - Finished nodes: 4,624,282 (1.8M/s) in 3s cpu:4s avg:1.7
0:00:50 INF [osm_pass1:process] - Finished ways: 336,740 (486k/s) in 0.7s cpu:1s avg:2
0:00:50 INF [osm_pass1:process] - Finished relations: 7,908 (73k/s) in 0.1s cpu:0.2s avg:2
0:00:50 INF [osm_pass1] -  nodes: [ 4.6M 1.3M/s ] 428M  ways: [ 336k  98k/s ] rels: [ 7.9k 2.3k/s ] blocks: [  623  183/s ]
    cpus: 1.7 gc:  1% heap: 909M/4.2G direct: 51M postGC: 853M hppc: 464k
    read( -%) ->     (0/4) -> parse( -%) ->     (0/4) -> process( -%)
0:00:50 DEB [osm_pass1] - Processed 623 blocks:
0:00:50 DEB [osm_pass1] -   nodes: 4,624,282 (1.8M/s) in 3s cpu:4s avg:1.7
0:00:50 DEB [osm_pass1] -   ways: 336,740 (486k/s) in 0.7s cpu:1s avg:2
0:00:50 DEB [osm_pass1] -   relations: 7,908 (73k/s) in 0.1s cpu:0.2s avg:2
0:00:50 INF [osm_pass1] - Finished in 3s cpu:6s avg:1.7
0:00:50 INF [osm_pass1] -   read     1x(2% 0.1s wait:3s)
0:00:50 INF [osm_pass1] -   parse    1x(66% 2s)
0:00:50 INF [osm_pass1] -   process  1x(45% 2s wait:1s)
0:00:50 INF [osm_pass2] - 
0:00:50 INF [osm_pass2] - Starting...
0:00:52 DEB [osm_pass2:process] - Sorting long long multimap...
0:00:52 INF [osm_pass2:process] - Finished nodes: 4,624,282 (2.1M/s) in 2s cpu:4s avg:2
0:00:52 DEB [osm_pass2:process] - Sorted long long multimap 0s cpu:0s avg:2.4
0:00:52 WAR [osm_pass2:process] - No GB polygon for inferring route network types
0:01:00 INF [osm_pass2] -  nodes: [ 4.6M 100% 462k/s ] 428M  ways: [ 219k  65%  21k/s ] rels: [    0   0%    0/s ] features: [   5M  70k/s ] 1.6G  blocks: [  606  97%   60/s ]
    cpus: 2 gc:  0% heap: 2.3G/4.2G direct: 51M postGC: 866M relInfo: 423k mpGeoms: 2.4M 
    read( 0%) ->   (11/13) -> process(65% 67%) -> (939/53k) -> write( 2%)
0:01:07 INF [osm_pass2:process] - Finished ways: 336,740 (22k/s) in 15s cpu:29s avg:2
0:01:10 INF [osm_pass2] -  nodes: [ 4.6M 100%    0/s ] 428M  ways: [ 336k 100%  11k/s ] rels: [ 3.1k  40%  318/s ] features: [ 5.2M  25k/s ] 1.6G  blocks: [  622 100%    1/s ]
    cpus: 2 gc:  1% heap: 3.3G/4.2G direct: 51M postGC: 873M relInfo: 423k mpGeoms: 19M  
    read( -%) ->    (0/13) -> process(83% 81%) -> (785/53k) -> write( 1%)
0:01:15 INF [osm_pass2:process] - Finished relations: 7,908 (960/s) in 8s cpu:16s avg:2
0:01:18 INF [osm_pass2] -  nodes: [ 4.6M 100%    0/s ] 428M  ways: [ 336k 100%    0/s ] rels: [ 7.9k 100%  596/s ] features: [ 5.3M 2.9k/s ] 271M  blocks: [  623 100%   <1/s ]
    cpus: 2 gc:  1% heap: 1G/4.2G direct: 51M postGC: 863M relInfo: 423k mpGeoms: 19M  
    read( -%) ->    (0/13) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:01:18 DEB [osm_pass2] - Processed 623 blocks:
0:01:18 DEB [osm_pass2] -   nodes: 4,624,282 (2.1M/s) in 2s cpu:4s avg:2
0:01:18 DEB [osm_pass2] -   ways: 336,740 (22k/s) in 15s cpu:29s avg:2
0:01:18 DEB [osm_pass2] -   relations: 7,908 (960/s) in 8s cpu:16s avg:2
0:01:18 INF [osm_pass2] - Finished in 28s cpu:55s avg:2
0:01:18 INF [osm_pass2] -   read     1x(0% 0s wait:14s done:14s)
0:01:18 INF [osm_pass2] -   process  2x(77% 22s)
0:01:18 INF [osm_pass2] -   write    1x(1% 0.3s wait:28s)
0:01:18 INF [boundaries] - 
0:01:18 INF [boundaries] - Starting...
0:01:18 INF [boundaries] - Creating polygons for 1 boundaries
0:01:18 WAR [boundaries] - Unable to form closed polygon for OSM relation 148838 (likely missing edges)
0:01:18 INF [boundaries] - Finished creating 0 country polygons
0:01:18 INF [boundaries] - Finished in 0s cpu:0.1s avg:1.5
0:01:18 INF - Deleting node.db to make room for output file
0:01:18 INF [sort] - 
0:01:18 INF [sort] - Starting...
0:01:18 INF [sort] - Grouped 8 chunks into 1
0:01:20 INF [sort] -  chunks: [   1 /   1 100% ] 271M 
    cpus: 1.3 gc:  0% heap: 1.5G/4.2G direct: 51M postGC: 863M
    ->     (0/3) -> worker( -%)
0:01:20 INF [sort] - Finished in 2s cpu:3s avg:1.3
0:01:20 INF [sort] -   worker  1x(78% 2s)
0:01:20 INF - read:0s write:0s sort:0s
0:01:20 INF [mbtiles] - 
0:01:20 INF [mbtiles] - Starting...
0:01:20 DEB [mbtiles:write] - Execute mbtiles: create table metadata (name text, value text);
0:01:20 DEB [mbtiles:write] - Execute mbtiles: create unique index name on metadata (name);
0:01:20 DEB [mbtiles:write] - Execute mbtiles: create table tiles_shallow (
  zoom_level integer,
  tile_column integer,
  tile_row integer,
  tile_data_id integer

  , primary key(zoom_level,tile_column,tile_row)

) without rowid

0:01:20 DEB [mbtiles:write] - Execute mbtiles: create table tiles_data (
  tile_data_id integer primary key,
  tile_data blob
)

0:01:20 DEB [mbtiles:write] - Execute mbtiles: create view tiles AS
select
  tiles_shallow.zoom_level as zoom_level,
  tiles_shallow.tile_column as tile_column,
  tiles_shallow.tile_row as tile_row,
  tiles_data.tile_data as tile_data
from tiles_shallow
join tiles_data on tiles_shallow.tile_data_id = tiles_data.tile_data_id

0:01:20 DEB [mbtiles:write] - Set mbtiles metadata: name=OpenMapTiles
0:01:20 DEB [mbtiles:write] - Set mbtiles metadata: format=pbf
0:01:20 DEB [mbtiles:write] - Set mbtiles metadata: description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org
0:01:20 DEB [mbtiles:write] - Set mbtiles metadata: attribution=<a href="https://www.openmaptiles.org/" target="_blank">&copy; OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a>
0:01:20 DEB [mbtiles:write] - Set mbtiles metadata: version=3.13.1
0:01:20 DEB [mbtiles:write] - Set mbtiles metadata: type=baselayer
0:01:20 DEB [mbtiles:write] - Set mbtiles metadata: bounds=-74.07,21.34,-17.84,43.55
0:01:20 DEB [mbtiles:write] - Set mbtiles metadata: center=-45.955,32.445,3
0:01:20 DEB [mbtiles:write] - Set mbtiles metadata: minzoom=0
0:01:20 DEB [mbtiles:write] - Set mbtiles metadata: maxzoom=14
0:01:21 DEB [mbtiles:write] - Set mbtiles metadata: json={"vector_layers":[{"id":"aerodrome_label","fields":{"name_int":"String","iata":"String","ele_ft":"Number","name_de":"String","name":"String","icao":"String","name:en":"String","class":"String","name_en":"String","name:latin":"String","ele":"Number"},"minzoom":10,"maxzoom":14},{"id":"aeroway","fields":{"ref":"String","class":"String"},"minzoom":10,"maxzoom":14},{"id":"boundary","fields":{"disputed":"Number","admin_level":"Number","maritime":"Number"},"minzoom":0,"maxzoom":14},{"id":"building","fields":{"colour":"String","render_height":"Number","render_min_height":"Number","hide_3d":"Boolean"},"minzoom":13,"maxzoom":14},{"id":"housenumber","fields":{"housenumber":"String"},"minzoom":14,"maxzoom":14},{"id":"landcover","fields":{"subclass":"String","class":"String","_numpoints":"Number"},"minzoom":7,"maxzoom":14},{"id":"landuse","fields":{"class":"String"},"minzoom":4,"maxzoom":14},{"id":"mountain_peak","fields":{"name_int":"String","customary_ft":"Number","ele_ft":"Number","name_de":"Str... 2302 more characters
0:01:22 INF [mbtiles:write] - Starting z0
0:01:22 INF [mbtiles:write] - Finished z0 in 0s cpu:0s avg:0, now starting z1
0:01:22 INF [mbtiles:write] - Finished z1 in 0s cpu:0s avg:0, now starting z2
0:01:22 INF [mbtiles:write] - Finished z2 in 0s cpu:0s avg:0, now starting z3
0:01:22 INF [mbtiles:write] - Finished z3 in 0s cpu:0s avg:0, now starting z4
0:01:22 INF [mbtiles:write] - Finished z4 in 0s cpu:0s avg:0, now starting z5
0:01:22 INF [mbtiles:write] - Finished z5 in 0s cpu:0s avg:0, now starting z6
0:01:22 INF [mbtiles:write] - Finished z6 in 0s cpu:0s avg:0, now starting z7
0:01:23 INF [mbtiles:write] - Finished z7 in 0.7s cpu:1s avg:2, now starting z8
0:01:24 INF [mbtiles:write] - Finished z8 in 2s cpu:3s avg:2, now starting z9
0:01:25 INF [mbtiles:write] - Finished z9 in 0.6s cpu:1s avg:2, now starting z10
0:01:26 INF [mbtiles:write] - Finished z10 in 0.9s cpu:2s avg:2, now starting z11
0:01:27 INF [mbtiles:write] - Finished z11 in 1s cpu:2s avg:2, now starting z12
0:01:29 INF [mbtiles:write] - Finished z12 in 2s cpu:5s avg:2, now starting z13
0:01:30 INF [mbtiles] -  features: [ 563k  11%  56k/s ] 271M  tiles: [ 288k  28k/s ] 13M  
    cpus: 2 gc:  3% heap: 1.7G/4.2G direct: 51M postGC: 1.4G
    read( 1%) -> (214/217) -> encode(63% 59%) -> (215/216) -> write( 4%)
    last tile: 13/2465/3061 (z13 4%) https://www.openstreetmap.org/#map=13/41.34382/-71.67480
0:01:39 INF [mbtiles:write] - Finished z13 in 10s cpu:21s avg:2, now starting z14
0:01:40 INF [mbtiles] -  features: [   2M  38% 144k/s ] 271M  tiles: [ 1.1M  86k/s ] 42M  
    cpus: 2 gc:  2% heap: 3.3G/4.2G direct: 51M postGC: 1.4G
    read( 1%) -> (213/217) -> encode(66% 63%) -> (215/216) -> write( 8%)
    last tile: 14/4939/6093 (z14 5%) https://www.openstreetmap.org/#map=14/41.82046/-71.47705
0:01:44 DEB [mbtiles:write] - Shallow tiles written: 4,115,454
0:01:44 DEB [mbtiles:write] - Tile data written: 21,293 (99% omitted)
0:01:44 DEB [mbtiles:write] - Unique tile hashes: 11,274
0:01:44 INF [mbtiles:write] - Finished z14 in 5s cpu:9s avg:1.9
0:01:44 INF [mbtiles] -  features: [ 5.3M 100% 845k/s ] 271M  tiles: [ 4.1M 758k/s ] 108M 
    cpus: 1.9 gc:  3% heap: 2.9G/4.2G direct: 51M postGC: 1.4G
    read( -%) ->   (0/217) -> encode( -%  -%) ->   (0/216) -> write( -%)
    last tile: 14/7380/5985 (z14 100%) https://www.openstreetmap.org/#map=14/43.56447/-17.84180
0:01:44 DEB [mbtiles] - Tile stats:
0:01:44 DEB [mbtiles] - z0 avg:7.9k max:7.9k
0:01:44 DEB [mbtiles] - z1 avg:4k max:4k
0:01:44 DEB [mbtiles] - z2 avg:9.4k max:9.4k
0:01:44 DEB [mbtiles] - z3 avg:4k max:6.4k
0:01:44 DEB [mbtiles] - z4 avg:1.6k max:4.6k
0:01:44 DEB [mbtiles] - z5 avg:1.4k max:8.2k
0:01:44 DEB [mbtiles] - z6 avg:980 max:22k
0:01:44 DEB [mbtiles] - z7 avg:754 max:55k
0:01:44 DEB [mbtiles] - z8 avg:396 max:112k
0:01:44 DEB [mbtiles] - z9 avg:270 max:278k
0:01:44 DEB [mbtiles] - z10 avg:154 max:233k
0:01:44 DEB [mbtiles] - z11 avg:103 max:132k
0:01:44 DEB [mbtiles] - z12 avg:83 max:119k
0:01:44 DEB [mbtiles] - z13 avg:71 max:109k
0:01:44 DEB [mbtiles] - z14 avg:67 max:282k
0:01:44 DEB [mbtiles] - all avg:70 max:0
0:01:44 DEB [mbtiles] -  # features: 5,304,942
0:01:44 DEB [mbtiles] -     # tiles: 4,115,454
0:01:44 INF [mbtiles] - Finished in 24s cpu:48s avg:2
0:01:44 INF [mbtiles] -   read    1x(2% 0.5s wait:23s)
0:01:44 INF [mbtiles] -   encode  2x(59% 14s)
0:01:44 INF [mbtiles] -   write   1x(16% 4s wait:19s)
0:01:44 INF - Finished in 1m45s cpu:3m gc:3s avg:1.7
0:01:44 INF - FINISHED!
0:01:44 INF - 
0:01:44 INF - ----------------------------------------
0:01:44 INF - 	overall          1m45s cpu:3m gc:3s avg:1.7
0:01:44 INF - 	lake_centerlines 2s cpu:4s avg:1.9
0:01:44 INF - 	  read     1x(84% 2s)
0:01:44 INF - 	  process  2x(12% 0.2s wait:2s)
0:01:44 INF - 	  write    1x(0% 0s wait:2s)
0:01:44 INF - 	water_polygons   24s cpu:42s gc:2s avg:1.8
0:01:44 INF - 	  read     1x(62% 15s wait:2s)
0:01:44 INF - 	  process  2x(29% 7s wait:11s)
0:01:44 INF - 	  write    1x(2% 0.5s wait:23s)
0:01:44 INF - 	natural_earth    12s cpu:14s avg:1.1
0:01:44 INF - 	  read     1x(61% 7s sys:1s done:4s)
0:01:44 INF - 	  process  2x(13% 2s wait:8s done:4s)
0:01:44 INF - 	  write    1x(0% 0s wait:8s done:4s)
0:01:44 INF - 	osm_pass1        3s cpu:6s avg:1.7
0:01:44 INF - 	  read     1x(2% 0.1s wait:3s)
0:01:44 INF - 	  parse    1x(66% 2s)
0:01:44 INF - 	  process  1x(45% 2s wait:1s)
0:01:44 INF - 	osm_pass2        28s cpu:55s avg:2
0:01:44 INF - 	  read     1x(0% 0s wait:14s done:14s)
0:01:44 INF - 	  process  2x(77% 22s)
0:01:44 INF - 	  write    1x(1% 0.3s wait:28s)
0:01:44 INF - 	boundaries       0s cpu:0.1s avg:1.5
0:01:44 INF - 	sort             2s cpu:3s avg:1.3
0:01:44 INF - 	  worker  1x(78% 2s)
0:01:44 INF - 	mbtiles          24s cpu:48s avg:2
0:01:44 INF - 	  read    1x(2% 0.5s wait:23s)
0:01:44 INF - 	  encode  2x(59% 14s)
0:01:44 INF - 	  write   1x(16% 4s wait:19s)
0:01:44 INF - ----------------------------------------
0:01:44 INF - 	features	271MB
0:01:44 INF - 	mbtiles	108MB
-rw-r--r-- 1 runner docker 62M Nov 21 20:29 run.jar
ℹ️ This Branch Logs 04ed8f7
0:00:00 DEB - argument: config=null (path to config file)
0:00:00 DEB - argument: area=rhode island (name of the extract to download if osm_url/osm_path not specified (i.e. 'monaco' 'rhode island' 'australia' or 'planet'))
0:00:00 INF - argument: stats=use in-memory stats
0:00:00 DEB - argument: madvise=true (default value for whether to use linux madvise(random) to improve memory-mapped read performance for temporary storage)
0:00:00 DEB - argument: storage=mmap (default storage type for temporary data, one of [ram, mmap, direct])
0:00:00 DEB - argument: threads=2 (num threads)
0:00:00 DEB - argument: write_threads=1 (number of threads to use when writing temp features)
0:00:00 DEB - argument: process_threads=2 (number of threads to use when processing input features)
0:00:00 DEB - argument: bounds=Env[-74.07 : -17.84, 21.34 : 43.55] (bounds)
0:00:00 DEB - argument: polygon=null (a .poly file that limits output to tiles intersecting the shape)
0:00:00 DEB - argument: minzoom=0 (minimum zoom level)
0:00:00 DEB - argument: maxzoom=14 (maximum zoom level up to 15)
0:00:00 DEB - argument: render_maxzoom=14 (maximum rendering zoom level up to 15)
0:00:00 DEB - argument: feature_read_threads=1 (number of threads to use when reading features at tile write time)
0:00:00 DEB - argument: loginterval=10 seconds (time between logs)
0:00:00 DEB - argument: skip_mbtiles_index_creation=false (skip adding index to mbtiles file)
0:00:00 DEB - argument: optimize_db=false (Vacuum analyze mbtiles after writing)
0:00:00 DEB - argument: emit_tiles_in_order=true (emit tiles in index order)
0:00:00 DEB - argument: force=false (overwriting output file and ignore disk/RAM warnings)
0:00:00 DEB - argument: gzip_temp=false (gzip temporary feature storage (uses more CPU, but less disk space))
0:00:00 DEB - argument: mmap_temp=true (use memory-mapped IO for temp feature files)
0:00:00 DEB - argument: sort_max_readers=6 (maximum number of concurrent read threads to use when sorting chunks)
0:00:00 DEB - argument: sort_max_writers=6 (maximum number of concurrent write threads to use when sorting chunks)
0:00:00 DEB - argument: nodemap_type=sparsearray (type of node location map, one of [noop, sortedtable, sparsearray, array])
0:00:00 DEB - argument: nodemap_storage=mmap (storage for node location map, one of [ram, mmap, direct])
0:00:00 DEB - argument: nodemap_madvise=true (use linux madvise(random) for node locations)
0:00:00 DEB - argument: multipolygon_geometry_storage=mmap (storage for multipolygon geometries, one of [ram, mmap, direct])
0:00:00 DEB - argument: multipolygon_geometry_madvise=true (use linux madvise(random) for temporary multipolygon geometry storage)
0:00:00 DEB - argument: http_user_agent=Planetiler downloader (https://github.com/onthegomap/planetiler) (User-Agent header to set when downloading files over HTTP)
0:00:00 DEB - argument: http_timeout=30 seconds (Timeout to use when downloading files over HTTP)
0:00:00 DEB - argument: http_retries=1 (Retries to use when downloading files over HTTP)
0:00:00 DEB - argument: download_chunk_size_mb=100 (Size of file chunks to download in parallel in megabytes)
0:00:00 DEB - argument: download_threads=1 (Number of parallel threads to use when downloading each file)
0:00:00 DEB - argument: min_feature_size_at_max_zoom=0.0625 (Default value for the minimum size in tile pixels of features to emit at the maximum zoom level to allow for overzooming)
0:00:00 DEB - argument: min_feature_size=1.0 (Default value for the minimum size in tile pixels of features to emit below the maximum zoom level)
0:00:00 DEB - argument: simplify_tolerance_at_max_zoom=0.0625 (Default value for the tile pixel tolerance to use when simplifying features at the maximum zoom level to allow for overzooming)
0:00:00 DEB - argument: simplify_tolerance=0.1 (Default value for the tile pixel tolerance to use when simplifying features below the maximum zoom level)
0:00:00 DEB - argument: osm_lazy_reads=true (Read OSM blocks from disk in worker threads)
0:00:00 DEB - argument: compact_db=true (Reduce the DB size by separating and deduping the tile data)
0:00:00 DEB - argument: skip_filled_tiles=false (Skip writing tiles containing only polygon fills to the output)
0:00:00 DEB - argument: tile_warning_size_mb=1.0 (Maximum size in megabytes of a tile to emit a warning about)
0:00:00 DEB - argument: tmpdir=data/tmp (temp directory)
0:00:00 DEB - argument: only_download=false (download source data then exit)
0:00:00 DEB - argument: download=false (download sources)
0:00:00 DEB - argument: temp_nodes=data/tmp/node.db (temp node db location)
0:00:00 DEB - argument: temp_multipolygons=data/tmp/multipolygon.db (temp multipolygon db location)
0:00:00 DEB - argument: temp_features=data/tmp/feature.db (temp feature db location)
0:00:00 DEB - argument: osm_parse_node_bounds=false (parse bounds from OSM nodes instead of header)
0:00:00 DEB - argument: only_fetch_wikidata=false (fetch wikidata translations then quit)
0:00:00 DEB - argument: fetch_wikidata=false (fetch wikidata translations then continue)
0:00:00 DEB - argument: use_wikidata=true (use wikidata translations)
0:00:00 DEB - argument: wikidata_cache=data/sources/wikidata_names.json (wikidata cache file)
0:00:00 DEB - argument: lake_centerlines_path=data/sources/lake_centerline.shp.zip (lake_centerlines shapefile path)
0:00:00 DEB - argument: free_lake_centerlines_after_read=false (delete lake_centerlines input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: water_polygons_path=data/sources/water-polygons-split-3857.zip (water_polygons shapefile path)
0:00:00 DEB - argument: free_water_polygons_after_read=false (delete water_polygons input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: natural_earth_path=data/sources/natural_earth_vector.sqlite.zip (natural_earth sqlite db path)
0:00:00 DEB - argument: free_natural_earth_after_read=false (delete natural_earth input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: osm_path=data/sources/rhode_island.osm.pbf (osm OSM input file path)
0:00:00 DEB - argument: free_osm_after_read=false (delete osm input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: mbtiles=data/out.mbtiles (mbtiles output file)
0:00:00 DEB - argument: transliterate=true (attempt to transliterate latin names)
0:00:00 DEB - argument: languages=am,ar,az,be,bg,br,bs,ca,co,cs,cy,da,de,el,en,eo,es,et,eu,fi,fr,fy,ga,gd,he,hi,hr,hu,hy,id,is,it,ja,ja_kana,ja_rm,ja-Latn,ja-Hira,ka,kk,kn,ko,ko-Latn,ku,la,lb,lt,lv,mk,mt,ml,nl,no,oc,pl,pt,rm,ro,ru,sk,sl,sq,sr,sr-Latn,sv,ta,te,th,tr,uk,zh (languages to use)
0:00:00 DEB - argument: only_layers= (Include only certain layers)
0:00:00 DEB - argument: exclude_layers= (Exclude certain layers)
0:00:00 DEB - argument: boundary_country_names=true (boundary layer: add left/right codes of neighboring countries)
0:00:00 DEB - argument: transportation_z13_paths=false (transportation(_name) layer: show all paths on z13)
0:00:00 DEB - argument: building_merge_z13=true (building layer: merge nearby buildings at z13)
0:00:00 DEB - argument: transportation_name_brunnel=false (transportation_name layer: set to false to omit brunnel and help merge long highways)
0:00:00 DEB - argument: transportation_name_size_for_shield=false (transportation_name layer: allow road names on shorter segments (ie. they will have a shield))
0:00:00 DEB - argument: transportation_name_limit_merge=false (transportation_name layer: limit merge so we don't combine different relations to help merge long highways)
0:00:00 DEB - argument: transportation_name_minor_refs=false (transportation_name layer: include name and refs from minor road networks if not present on a way)
0:00:00 DEB - argument: mbtiles_name=OpenMapTiles ('name' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org ('description' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_attribution=<a href="https://www.openmaptiles.org/" target="_blank">&copy; OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a> ('attribution' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_version=3.13.1 ('version' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_type=baselayer ('type' attribute for mbtiles metadata)
0:00:00 DEB - argument: help=false (show arguments then exit)
0:00:00 INF - Building OpenMapTilesProfile profile into data/out.mbtiles in these phases:
0:00:00 INF -   lake_centerlines: Process features in data/sources/lake_centerline.shp.zip
0:00:00 INF -   water_polygons: Process features in data/sources/water-polygons-split-3857.zip
0:00:00 INF -   natural_earth: Process features in data/sources/natural_earth_vector.sqlite.zip
0:00:00 INF -   osm_pass1: Pre-process OpenStreetMap input (store node locations then relation members)
0:00:00 INF -   osm_pass2: Process OpenStreetMap nodes, ways, then relations
0:00:00 INF -   sort: Sort rendered features by tile ID
0:00:00 INF -   mbtiles: Encode each tile and write to data/out.mbtiles
0:00:00 INF - no wikidata translations found, run with --fetch-wikidata to download
0:00:00 DEB - ✓ 196M storage on / (/dev/root) requested for read phase disk, 30G available
0:00:00 DEB -  - 44M used for temporary node location cache
0:00:00 DEB -  - 6.6M used for temporary multipolygon geometry cache
0:00:00 DEB -  - 145M used for temporary feature storage
0:00:00 DEB - ✓ 218M storage on / (/dev/root) requested for write phase disk, 30G available
0:00:00 DEB -  - 145M used for temporary feature storage
0:00:00 DEB -  - 72M used for mbtiles output
0:00:00 DEB - ✓ 313M JVM heap requested for read phase, 4.2G available
0:00:00 DEB -  - 300M used for sparsearray node location in-memory index
0:00:00 DEB -  - 13M used for temporary profile storage
0:00:00 DEB - ✓ 50M storage on / (/dev/root) requested for read phase, 30G available
0:00:00 DEB -  - 44M used for sparsearray node location cache
0:00:00 DEB -  - 6.6M used for multipolygon way geometries
0:00:00 DEB - ✓ 50M temporary files and 2.9G of free memory for OS to cache them
0:00:00 INF - Using merge sort feature map, chunk size=1431mb max workers=2
0:00:01 INF - dataFileCache open start
0:00:02 INF [lake_centerlines] - 
0:00:02 INF [lake_centerlines] - Starting...
0:00:04 INF [lake_centerlines] -  read: [  59k 100%  32k/s ] write: [    0    0/s ] 0    
    cpus: 1.8 gc:  3% heap: 162M/4.2G direct: 237k postGC: 75M
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:04 INF [lake_centerlines] - Finished in 2s cpu:3s avg:1.9
0:00:04 INF [lake_centerlines] -   read     1x(80% 2s)
0:00:04 INF [lake_centerlines] -   process  2x(13% 0.2s wait:2s)
0:00:04 INF [lake_centerlines] -   write    1x(0% 0s wait:2s)
0:00:04 INF [water_polygons] - 
0:00:04 INF [water_polygons] - Starting...
0:00:14 INF [water_polygons] -  read: [ 2.2k  15%  219/s ] write: [  57k 5.6k/s ] 1.4G 
    cpus: 2 gc: 11% heap: 1.1G/4.2G direct: 51M postGC: 1.2G
    read(59%) ->  (106/1k) -> process(17% 39%) -> (1.2k/53k) -> write( 0%)
0:00:24 INF [water_polygons] -  read: [   6k  42%  385/s ] write: [ 322k  26k/s ] 1.4G 
    cpus: 1.6 gc:  8% heap: 2G/4.2G direct: 51M postGC: 1.7G
    read(73%) ->    (0/1k) -> process(25% 22%) -> (1.1k/53k) -> write( 0%)
0:00:27 INF [water_polygons] -  read: [  14k 100% 2.5k/s ] write: [ 4.3M 1.2M/s ] 186M 
    cpus: 1.7 gc:  7% heap: 3.3G/4.2G direct: 51M postGC: 1.8G
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:27 INF [water_polygons] - Finished in 23s cpu:41s gc:2s avg:1.8
0:00:27 INF [water_polygons] -   read     1x(61% 14s wait:2s)
0:00:27 INF [water_polygons] -   process  2x(29% 7s wait:10s)
0:00:27 INF [water_polygons] -   write    1x(2% 0.5s wait:23s)
0:00:27 INF [natural_earth] - unzipping /home/runner/work/planetiler/planetiler/data/sources/natural_earth_vector.sqlite.zip to data/tmp/natearth.sqlite
0:00:34 INF [natural_earth] - 
0:00:34 INF [natural_earth] - Starting...
0:00:43 INF [natural_earth] -  read: [ 349k 100%  42k/s ] write: [  181   21/s ] 186M 
    cpus: 1.6 gc:  0% heap: 3G/4.2G direct: 51M postGC: 1.9G
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:43 INF [natural_earth] - Finished in 9s cpu:14s avg:1.6
0:00:43 INF [natural_earth] -   read     1x(90% 8s sys:1s)
0:00:43 INF [natural_earth] -   process  2x(20% 2s wait:7s)
0:00:43 INF [natural_earth] -   write    1x(0% 0s wait:8s)
0:00:43 INF [osm_pass1] - 
0:00:43 INF [osm_pass1] - Starting...
0:00:45 INF [osm_pass1:process] - Finished nodes: 4,624,282 (2.2M/s) in 2s cpu:3s avg:1.7
0:00:46 INF [osm_pass1:process] - Finished ways: 336,740 (473k/s) in 0.7s cpu:1s avg:1.8
0:00:46 INF [osm_pass1:process] - Finished relations: 7,908 (87k/s) in 0.1s cpu:0.2s avg:1.9
0:00:46 INF [osm_pass1] -  nodes: [ 4.6M 1.5M/s ] 428M  ways: [ 336k 115k/s ] rels: [ 7.9k 2.7k/s ] blocks: [  623  212/s ]
    cpus: 1.7 gc:  1% heap: 1G/4.2G direct: 51M postGC: 880M hppc: 464k
    read( -%) ->     (0/4) -> parse( -%) ->     (0/4) -> process( -%)
0:00:46 DEB [osm_pass1] - Processed 623 blocks:
0:00:46 DEB [osm_pass1] -   nodes: 4,624,282 (2.2M/s) in 2s cpu:3s avg:1.7
0:00:46 DEB [osm_pass1] -   ways: 336,740 (473k/s) in 0.7s cpu:1s avg:1.8
0:00:46 DEB [osm_pass1] -   relations: 7,908 (87k/s) in 0.1s cpu:0.2s avg:1.9
0:00:46 INF [osm_pass1] - Finished in 3s cpu:5s avg:1.8
0:00:46 INF [osm_pass1] -   read     1x(2% 0.1s wait:3s)
0:00:46 INF [osm_pass1] -   parse    1x(74% 2s)
0:00:46 INF [osm_pass1] -   process  1x(42% 1s wait:1s)
0:00:46 INF [osm_pass2] - 
0:00:46 INF [osm_pass2] - Starting...
0:00:48 INF [osm_pass2:process] - Finished nodes: 4,624,282 (1.9M/s) in 2s cpu:5s avg:2
0:00:48 DEB [osm_pass2:process] - Sorting long long multimap...
0:00:48 DEB [osm_pass2:process] - Sorted long long multimap 0s cpu:0.1s avg:2.2
0:00:48 WAR [osm_pass2:process] - No GB polygon for inferring route network types
0:00:56 INF [osm_pass2] -  nodes: [ 4.6M 100% 461k/s ] 428M  ways: [ 210k  63%  21k/s ] rels: [    0   0%    0/s ] features: [   5M  69k/s ] 1.6G  blocks: [  605  97%   60/s ]
    cpus: 2 gc:  1% heap: 1.9G/4.2G direct: 51M postGC: 892M relInfo: 423k mpGeoms: 849k 
    read( 0%) ->   (11/13) -> process(65% 60%) -> (632/53k) -> write( 2%)
0:01:04 INF [osm_pass2:process] - Finished ways: 336,740 (22k/s) in 15s cpu:30s avg:1.9
0:01:06 INF [osm_pass2] -  nodes: [ 4.6M 100%    0/s ] 428M  ways: [ 336k 100%  12k/s ] rels: [ 2.7k  34%  271/s ] features: [ 5.2M  26k/s ] 1.6G  blocks: [  622 100%    1/s ]
    cpus: 1.9 gc:  1% heap: 2.3G/4.2G direct: 51M postGC: 900M relInfo: 423k mpGeoms: 19M  
    read( -%) ->    (0/13) -> process(76% 79%) -> (417/53k) -> write( 1%)
0:01:12 INF [osm_pass2:process] - Finished relations: 7,908 (929/s) in 9s cpu:17s avg:2
0:01:14 INF [osm_pass2] -  nodes: [ 4.6M 100%    0/s ] 428M  ways: [ 336k 100%    0/s ] rels: [ 7.9k 100%  633/s ] features: [ 5.3M 3.1k/s ] 271M  blocks: [  623 100%   <1/s ]
    cpus: 2 gc:  1% heap: 1.2G/4.2G direct: 51M postGC: 887M relInfo: 423k mpGeoms: 19M  
    read( -%) ->    (0/13) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:01:14 DEB [osm_pass2] - Processed 623 blocks:
0:01:14 DEB [osm_pass2] -   nodes: 4,624,282 (1.9M/s) in 2s cpu:5s avg:2
0:01:14 DEB [osm_pass2] -   ways: 336,740 (22k/s) in 15s cpu:30s avg:1.9
0:01:14 DEB [osm_pass2] -   relations: 7,908 (929/s) in 9s cpu:17s avg:2
0:01:14 INF [osm_pass2] - Finished in 28s cpu:55s avg:2
0:01:14 INF [osm_pass2] -   read     1x(0% 0s wait:14s done:14s)
0:01:14 INF [osm_pass2] -   process  2x(76% 21s)
0:01:14 INF [osm_pass2] -   write    1x(1% 0.3s wait:28s)
0:01:14 INF [boundaries] - 
0:01:14 INF [boundaries] - Starting...
0:01:14 INF [boundaries] - Creating polygons for 1 boundaries
0:01:14 WAR [boundaries] - Unable to form closed polygon for OSM relation 148838 (likely missing edges)
0:01:14 INF [boundaries] - Finished creating 0 country polygons
0:01:14 INF [boundaries] - Finished in 0s cpu:0.1s avg:1.7
0:01:14 INF - Deleting node.db to make room for output file
0:01:14 INF [sort] - 
0:01:14 INF [sort] - Starting...
0:01:14 INF [sort] - Grouped 8 chunks into 1
0:01:16 INF [sort] -  chunks: [   1 /   1 100% ] 271M 
    cpus: 1.5 gc:  0% heap: 1.7G/4.2G direct: 51M postGC: 887M
    ->     (0/3) -> worker( -%)
0:01:16 INF [sort] - Finished in 1s cpu:2s avg:1.5
0:01:16 INF [sort] -   worker  1x(88% 1s)
0:01:16 INF - read:0s write:0s sort:0s
0:01:16 INF [mbtiles] - 
0:01:16 INF [mbtiles] - Starting...
0:01:16 DEB [mbtiles:write] - Execute mbtiles: create table metadata (name text, value text);
0:01:16 DEB [mbtiles:write] - Execute mbtiles: create unique index name on metadata (name);
0:01:16 DEB [mbtiles:write] - Execute mbtiles: create table tiles_shallow (
  zoom_level integer,
  tile_column integer,
  tile_row integer,
  tile_data_id integer

  , primary key(zoom_level,tile_column,tile_row)

) without rowid

0:01:16 DEB [mbtiles:write] - Execute mbtiles: create table tiles_data (
  tile_data_id integer primary key,
  tile_data blob
)

0:01:16 DEB [mbtiles:write] - Execute mbtiles: create view tiles AS
select
  tiles_shallow.zoom_level as zoom_level,
  tiles_shallow.tile_column as tile_column,
  tiles_shallow.tile_row as tile_row,
  tiles_data.tile_data as tile_data
from tiles_shallow
join tiles_data on tiles_shallow.tile_data_id = tiles_data.tile_data_id

0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: name=OpenMapTiles
0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: format=pbf
0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org
0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: attribution=<a href="https://www.openmaptiles.org/" target="_blank">&copy; OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a>
0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: version=3.13.1
0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: type=baselayer
0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: bounds=-74.07,21.34,-17.84,43.55
0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: center=-45.955,32.445,3
0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: minzoom=0
0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: maxzoom=14
0:01:16 DEB [mbtiles:write] - Set mbtiles metadata: json={"vector_layers":[{"id":"aerodrome_label","fields":{"name_int":"String","iata":"String","ele_ft":"Number","name_de":"String","name":"String","icao":"String","name:en":"String","class":"String","ele":"Number","name_en":"String","name:latin":"String"},"minzoom":10,"maxzoom":14},{"id":"aeroway","fields":{"ref":"String","class":"String"},"minzoom":10,"maxzoom":14},{"id":"boundary","fields":{"disputed":"Number","admin_level":"Number","maritime":"Number"},"minzoom":0,"maxzoom":14},{"id":"building","fields":{"colour":"String","render_height":"Number","render_min_height":"Number","hide_3d":"Boolean"},"minzoom":13,"maxzoom":14},{"id":"housenumber","fields":{"housenumber":"String"},"minzoom":14,"maxzoom":14},{"id":"landcover","fields":{"subclass":"String","class":"String","_numpoints":"Number"},"minzoom":7,"maxzoom":14},{"id":"landuse","fields":{"class":"String"},"minzoom":4,"maxzoom":14},{"id":"mountain_peak","fields":{"name_int":"String","customary_ft":"Number","ele_ft":"Number","name_de":"Str... 2302 more characters
0:01:17 INF [mbtiles:write] - Starting z0
0:01:17 INF [mbtiles:write] - Finished z0 in 0s cpu:0s avg:0, now starting z1
0:01:17 INF [mbtiles:write] - Finished z1 in 0s cpu:0s avg:0, now starting z2
0:01:17 INF [mbtiles:write] - Finished z2 in 0s cpu:0s avg:0, now starting z3
0:01:17 INF [mbtiles:write] - Finished z3 in 0s cpu:0s avg:0, now starting z4
0:01:17 INF [mbtiles:write] - Finished z4 in 0s cpu:0s avg:0, now starting z5
0:01:17 INF [mbtiles:write] - Finished z5 in 0s cpu:0s avg:0, now starting z6
0:01:17 INF [mbtiles:write] - Finished z6 in 0s cpu:0s avg:0, now starting z7
0:01:18 INF [mbtiles:write] - Finished z7 in 1s cpu:2s avg:2, now starting z8
0:01:20 INF [mbtiles:write] - Finished z8 in 1s cpu:3s avg:2, now starting z9
0:01:20 INF [mbtiles:write] - Finished z9 in 0.6s cpu:1s avg:2, now starting z10
0:01:21 INF [mbtiles:write] - Finished z10 in 0.7s cpu:1s avg:2, now starting z11
0:01:22 INF [mbtiles:write] - Finished z11 in 1s cpu:2s avg:2, now starting z12
0:01:24 INF [mbtiles:write] - Finished z12 in 2s cpu:4s avg:2, now starting z13
0:01:26 INF [mbtiles] -  features: [ 572k  11%  57k/s ] 271M  tiles: [ 289k  28k/s ] 13M  
    cpus: 2 gc:  7% heap: 1.4G/4.2G direct: 51M postGC: 1.5G
    read( 1%) -> (214/217) -> encode(58% 60%) -> (215/216) -> write( 4%)
    last tile: 13/2466/3066 (z13 4%) https://www.openstreetmap.org/#map=13/41.17865/-71.63086
0:01:34 INF [mbtiles:write] - Finished z13 in 10s cpu:20s avg:2, now starting z14
0:01:36 INF [mbtiles] -  features: [ 2.2M  42% 164k/s ] 271M  tiles: [ 1.1M  87k/s ] 49M  
    cpus: 2 gc:  3% heap: 1.4G/4.2G direct: 51M postGC: 1.5G
    read( 1%) -> (213/217) -> encode(65% 66%) -> (215/216) -> write( 8%)
    last tile: 14/4947/6212 (z14 5%) https://www.openstreetmap.org/#map=14/39.84229/-71.30127
0:01:39 DEB [mbtiles:write] - Shallow tiles written: 4,115,454
0:01:39 DEB [mbtiles:write] - Tile data written: 21,305 (99% omitted)
0:01:39 DEB [mbtiles:write] - Unique tile hashes: 11,286
0:01:39 INF [mbtiles:write] - Finished z14 in 5s cpu:9s avg:1.9
0:01:39 INF [mbtiles] -  features: [ 5.3M 100% 998k/s ] 271M  tiles: [ 4.1M 955k/s ] 108M 
    cpus: 1.9 gc:  2% heap: 2.7G/4.2G direct: 51M postGC: 1.5G
    read( -%) ->   (0/217) -> encode( -%  -%) ->   (0/216) -> write( -%)
    last tile: 14/7380/5985 (z14 100%) https://www.openstreetmap.org/#map=14/43.56447/-17.84180
0:01:39 DEB [mbtiles] - Tile stats:
0:01:39 DEB [mbtiles] - z0 avg:7.9k max:7.9k
0:01:39 DEB [mbtiles] - z1 avg:4k max:4k
0:01:39 DEB [mbtiles] - z2 avg:9.4k max:9.4k
0:01:39 DEB [mbtiles] - z3 avg:4k max:6.4k
0:01:39 DEB [mbtiles] - z4 avg:1.6k max:4.6k
0:01:39 DEB [mbtiles] - z5 avg:1.4k max:8.2k
0:01:39 DEB [mbtiles] - z6 avg:980 max:22k
0:01:39 DEB [mbtiles] - z7 avg:754 max:55k
0:01:39 DEB [mbtiles] - z8 avg:396 max:112k
0:01:39 DEB [mbtiles] - z9 avg:270 max:278k
0:01:39 DEB [mbtiles] - z10 avg:154 max:233k
0:01:39 DEB [mbtiles] - z11 avg:103 max:132k
0:01:39 DEB [mbtiles] - z12 avg:83 max:119k
0:01:39 DEB [mbtiles] - z13 avg:71 max:109k
0:01:39 DEB [mbtiles] - z14 avg:67 max:282k
0:01:39 DEB [mbtiles] - all avg:70 max:0
0:01:39 DEB [mbtiles] -  # features: 5,304,942
0:01:39 DEB [mbtiles] -     # tiles: 4,115,454
0:01:39 INF [mbtiles] - Finished in 23s cpu:46s gc:1s avg:2
0:01:39 INF [mbtiles] -   read    1x(2% 0.5s wait:22s)
0:01:39 INF [mbtiles] -   encode  2x(60% 14s)
0:01:39 INF [mbtiles] -   write   1x(16% 4s wait:18s)
0:01:39 INF - Finished in 1m39s cpu:2m56s gc:3s avg:1.8
0:01:39 INF - FINISHED!
0:01:39 INF - 
0:01:39 INF - ----------------------------------------
0:01:39 INF - 	overall          1m39s cpu:2m56s gc:3s avg:1.8
0:01:39 INF - 	lake_centerlines 2s cpu:3s avg:1.9
0:01:39 INF - 	  read     1x(80% 2s)
0:01:39 INF - 	  process  2x(13% 0.2s wait:2s)
0:01:39 INF - 	  write    1x(0% 0s wait:2s)
0:01:39 INF - 	water_polygons   23s cpu:41s gc:2s avg:1.8
0:01:39 INF - 	  read     1x(61% 14s wait:2s)
0:01:39 INF - 	  process  2x(29% 7s wait:10s)
0:01:39 INF - 	  write    1x(2% 0.5s wait:23s)
0:01:39 INF - 	natural_earth    9s cpu:14s avg:1.6
0:01:39 INF - 	  read     1x(90% 8s sys:1s)
0:01:39 INF - 	  process  2x(20% 2s wait:7s)
0:01:39 INF - 	  write    1x(0% 0s wait:8s)
0:01:39 INF - 	osm_pass1        3s cpu:5s avg:1.8
0:01:39 INF - 	  read     1x(2% 0.1s wait:3s)
0:01:39 INF - 	  parse    1x(74% 2s)
0:01:39 INF - 	  process  1x(42% 1s wait:1s)
0:01:39 INF - 	osm_pass2        28s cpu:55s avg:2
0:01:39 INF - 	  read     1x(0% 0s wait:14s done:14s)
0:01:39 INF - 	  process  2x(76% 21s)
0:01:39 INF - 	  write    1x(1% 0.3s wait:28s)
0:01:39 INF - 	boundaries       0s cpu:0.1s avg:1.7
0:01:39 INF - 	sort             1s cpu:2s avg:1.5
0:01:39 INF - 	  worker  1x(88% 1s)
0:01:39 INF - 	mbtiles          23s cpu:46s gc:1s avg:2
0:01:39 INF - 	  read    1x(2% 0.5s wait:22s)
0:01:39 INF - 	  encode  2x(60% 14s)
0:01:39 INF - 	  write   1x(16% 4s wait:18s)
0:01:39 INF - ----------------------------------------
0:01:39 INF - 	features	271MB
0:01:39 INF - 	mbtiles	108MB
-rw-r--r-- 1 runner docker 62M Nov 21 20:27 run.jar

@erik
Copy link
Contributor Author

erik commented Nov 18, 2022

SonarCloud Quality Gate failed. Quality Gate failed

Bug C 1 Bug

From my reading of the issue, I believe this warning can be safely suppressed, but would like a second opinion. Parse is a static utility class that has no obvious lifecycle, and as far as I can tell we'd want the NumberFormat instance available for the duration of the thread.

@msbarry
Copy link
Contributor

msbarry commented Nov 21, 2022

Yikes! Good catch. I'm a bit concerned about other locations that do this as well. It looks like both Format and Parse classes use number format instances. Could you update those as well? Looking at a recent run on the planet there's only a small amount of time spent in any of those, so the overhead of getting the thread local variable should be fine.

@msbarry
Copy link
Contributor

msbarry commented Nov 21, 2022

SonarCloud Quality Gate failed. Quality Gate failed
Bug C 1 Bug

From my reading of the issue, I believe this warning can be safely suppressed, but would like a second opinion. Parse is a static utility class that has no obvious lifecycle, and as far as I can tell we'd want the NumberFormat instance available for the duration of the thread.

I think that's fine, can you put @SuppressWarnings("java:S5164") on that thread local definition with a short comment explaining that?

@sonarcloud
Copy link

sonarcloud bot commented Nov 21, 2022

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

100.0% 100.0% Coverage
0.0% 0.0% Duplication

@erik erik requested a review from msbarry November 21, 2022 20:39
Comment on lines -26 to +49
pf = NumberFormat.getPercentInstance(locale);
pf.setMaximumFractionDigits(0);
nf = NumberFormat.getNumberInstance(locale);
nf.setMaximumFractionDigits(1);
intF = NumberFormat.getNumberInstance(locale);
intF.setMaximumFractionDigits(0);
pf = ThreadLocal.withInitial(() -> {
var f = NumberFormat.getPercentInstance(locale);
f.setMaximumFractionDigits(0);
return f;
});
nf = ThreadLocal.withInitial(() -> {
var f = NumberFormat.getNumberInstance(locale);
f.setMaximumFractionDigits(1);
return f;
});
intF = ThreadLocal.withInitial(() -> {
var f = NumberFormat.getNumberInstance(locale);
f.setMaximumFractionDigits(0);
return f;
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minor thing - you could probably just inline these in the field definitions since they don't need anything outside the initializer

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that possible if they need access to the locale parameter passed to the constructor?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh yeah, good point!

@msbarry msbarry merged commit ccf0981 into onthegomap:main Nov 22, 2022
@erik erik deleted the ep/fix-parse-race branch November 22, 2022 01:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants