From 506631a18f9e20875e7bde703700851b61e15b24 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer <mschiffer@universe-factory.net> Date: Thu, 12 Oct 2023 19:59:14 +0200 Subject: [PATCH] core/region_processor: only return available regions Ignore regions that failed to process and have no old processed data. --- src/core/region_processor.rs | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/core/region_processor.rs b/src/core/region_processor.rs index c1193b6..caaf8ec 100644 --- a/src/core/region_processor.rs +++ b/src/core/region_processor.rs @@ -1,6 +1,6 @@ //! The [RegionProcessor] and related functions -use std::{ffi::OsStr, path::Path, time::SystemTime}; +use std::{ffi::OsStr, path::Path, sync::mpsc, time::SystemTime}; use anyhow::{Context, Result}; use indexmap::IndexSet; @@ -32,7 +32,7 @@ fn parse_region_filename(file_name: &OsStr) -> Option<TileCoords> { } /// [RegionProcessor::process_region] return values -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] enum RegionProcessorStatus { /// Region was processed Ok, @@ -224,23 +224,28 @@ impl<'a> RegionProcessor<'a> { /// /// Returns a list of the coordinates of all processed regions pub fn run(self) -> Result<Vec<TileCoords>> { - let mut regions = self.collect_regions()?; - - // Sort regions in a zig-zag pattern to optimize cache usage - regions.sort_unstable_by_key(|&TileCoords { x, z }| (x, if x % 2 == 0 { z } else { -z })); - fs::create_dir_all(&self.config.processed_dir)?; fs::create_dir_all(&self.config.tile_dir(TileKind::Lightmap, 0))?; info!("Processing region files..."); - regions.par_iter().try_for_each(|&coords| { - let _ = self + let (region_send, region_recv) = mpsc::channel(); + + self.collect_regions()?.par_iter().try_for_each(|&coords| { + let ret = self .process_region(coords) .with_context(|| format!("Failed to process region {:?}", coords))?; + + if ret != RegionProcessorStatus::ErrorMissing { + region_send.send(coords).unwrap(); + } + anyhow::Ok(()) })?; + drop(region_send); + let mut regions: Vec<_> = region_recv.into_iter().collect(); + // info!( // "Processed region files ({} processed, {} unchanged, {} errors)", // processed, @@ -248,6 +253,9 @@ impl<'a> RegionProcessor<'a> { // errors, // ); + // Sort regions in a zig-zag pattern to optimize cache usage + regions.sort_unstable_by_key(|&TileCoords { x, z }| (x, if x % 2 == 0 { z } else { -z })); + Ok(regions) } }