From 8cbf502ef097002ae6a1ea8571d932f3d78fe4d2 Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Tue, 26 Dec 2023 17:46:14 -0600 Subject: [PATCH] logic error pruning --- server/src/main.rs | 4 ++-- server/src/mine.rs | 25 ++++++++++++++----------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index 3e4deac..8d6ab99 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -66,14 +66,14 @@ async fn main() -> Result<(), Error> { .with_target("server::paths", Level::ERROR) .with_target("server::turtle_api", Level::INFO) .with_target("server::fell", Level::WARN) - .with_target("server::mine", Level::WARN) + .with_target("server::mine", Level::INFO) .with_target("server::depot", Level::TRACE); let subscriber = tracing_subscriber::fmt::layer() .compact() .with_file(false) .with_target(true) - .with_span_events(FmtSpan::ACTIVE) + //.with_span_events(FmtSpan::ACTIVE) .with_filter(filter); let reg = tracing_subscriber::registry() diff --git a/server/src/mine.rs b/server/src/mine.rs index aed76fe..d275f21 100644 --- a/server/src/mine.rs +++ b/server/src/mine.rs @@ -265,6 +265,8 @@ impl Task for Quarry { } let chunk = chunk.unwrap(); + info!("#{} doing chunk {chunk}", turtle.name().to_str()); + let max_chunk = Vec3::new(4,4,4); let e = owned.size.component_div(&max_chunk); @@ -282,9 +284,6 @@ impl Task for Quarry { } fn poll(&mut self) -> TaskState { - let max_chunk = Vec3::new(4,4,4); - let chunks = self.size.component_div(&max_chunk); - if self.progress.done() { return TaskState::Complete; } @@ -312,6 +311,7 @@ impl Task for Quarry { #[derive(Serialize, Deserialize, Clone)] struct ChunkedTask { confirmed: Arc, + #[serde(skip_deserializing)] head: Arc, // highest active chunk #[serde(skip)] in_flight: Arc>>, // must remain sorted @@ -330,7 +330,7 @@ impl ChunkedTask { fn done(&self) -> bool { let backstop = self.confirmed.load(Ordering::SeqCst); - backstop + 1 >= self.max + backstop >= self.max } fn allocated(&self) -> bool { @@ -340,6 +340,8 @@ impl ChunkedTask { async fn next_chunk(&self) -> Option { let mut in_flight = self.in_flight.clone().write_owned().await; + tracing::trace!("running: {:?}", in_flight); + let backstop = self.confirmed.load(Ordering::SeqCst); // we have a mutex anyway @@ -348,9 +350,10 @@ impl ChunkedTask { } for i in backstop..self.max { - if in_flight.get(i as usize).is_none() { + if !in_flight.contains(&i) { in_flight.push(i); in_flight.sort_unstable(); + info!("next: {i}"); return Some(i); } } @@ -368,7 +371,7 @@ impl ChunkedTask { if min { // make sure that head is no less than min loop { let curr = self.confirmed.load(Ordering::SeqCst); - if let Ok(_) = self.confirmed.compare_exchange(curr, curr.max(chunk), Ordering::AcqRel, Ordering::SeqCst) { + if let Ok(_) = self.confirmed.compare_exchange(curr, curr.max(chunk+1), Ordering::AcqRel, Ordering::SeqCst) { break; } } @@ -391,20 +394,20 @@ mod tests { async fn linear() { let tracker = ChunkedTask::new(5); assert_eq!(tracker.next_chunk().await, Some(0)); + tracker.mark_done(0).await; assert_eq!(tracker.next_chunk().await, Some(1)); + tracker.mark_done(1).await; assert_eq!(tracker.next_chunk().await, Some(2)); assert_eq!(tracker.done(), false); + tracker.mark_done(2).await; assert_eq!(tracker.next_chunk().await, Some(3)); + tracker.mark_done(3).await; assert_eq!(tracker.next_chunk().await, Some(4)); assert_eq!(tracker.next_chunk().await, None); assert_eq!(tracker.done(), false); + assert_eq!(tracker.next_chunk().await, None); assert_eq!(tracker.allocated(), true); - tracker.mark_done(0).await; - tracker.mark_done(1).await; - tracker.mark_done(2).await; - tracker.mark_done(3).await; tracker.mark_done(4).await; - tracker.mark_done(5).await; assert_eq!(tracker.done(), true); }