From 89417d7eaf2e8ca2be8e0be6c8aba3a0b807c943 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 17 Oct 2020 14:05:24 +0100 Subject: [PATCH] wip log expiry Signed-off-by: Ian Jackson --- Cargo.lock.example | 7 +++++++ Cargo.toml | 1 + src/gamestate.rs | 28 ++++++++++++++++++++++++++-- src/global.rs | 2 ++ src/imports.rs | 2 ++ src/updates.rs | 4 ++-- 6 files changed, 40 insertions(+), 4 deletions(-) diff --git a/Cargo.lock.example b/Cargo.lock.example index 51e03b18..d69c21f3 100644 --- a/Cargo.lock.example +++ b/Cargo.lock.example @@ -186,6 +186,12 @@ dependencies = [ "byte-tools", ] +[[package]] +name = "boolinator" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" + [[package]] name = "bumpalo" version = "3.4.0" @@ -1065,6 +1071,7 @@ dependencies = [ "anyhow", "argparse", "arrayvec", + "boolinator", "chrono", "chrono-tz", "delegate", diff --git a/Cargo.toml b/Cargo.toml index ee2385ad..d7901ca2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ otter-zcoord = { path = "zcoord" } anyhow = "1" argparse = "0.2" arrayvec = "0" +boolinator = "2" chrono = "0.4" chrono-tz = "0.5" delegate = "0.4" diff --git a/src/gamestate.rs b/src/gamestate.rs index 233496de..3d69d2cb 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -45,7 +45,7 @@ pub struct GameState { pub pieces : Pieces, pub players : PlayerMap, pub gen : Generation, - pub log : Vec<(Generation, Arc)>, // xxx expiry + pub log : VecDeque<(Generation, Arc)>, // xxx expiry pub max_z : ZCoord, } @@ -217,7 +217,6 @@ impl Debug for Html { // ---------- game state - rendering etc. ---------- - impl PieceState { #[throws(IE)] pub fn prep_piecestate(&self, p: &dyn Piece, pri : &PieceRenderInstructions) @@ -283,6 +282,31 @@ impl PieceExt for T where T: Piece + ?Sized { } } +// ---------- log expiry ========== + +impl GameState { + pub fn expire_old_logs(&mut self, cutoff: Timestamp) { + fn want_trim(gs: &GameState, cutoff: Timestamp) -> bool { + (||{ + let e = gs.log.get(1)?; + (e.1.when < cutoff).as_option() + })().is_some() + }; + + if want_trim(self, cutoff) { + while want_trim(self, cutoff) { + self.log.pop_front(); + } + let front = self.log.front_mut().unwrap(); + let front = &mut front.1; + let logent = LogEntry { + html: Html::lit("Earlier log entries expired."), + }; + *front = Arc::new(CommittedLogEntry { logent, when: front.when }); + } + } +} + // ========== ad-hoc and temporary ========== pub fn make_pieceid_visible(p : PieceId) -> VisiblePieceId { diff --git a/src/global.rs b/src/global.rs index ba335682..fd718f8b 100644 --- a/src/global.rs +++ b/src/global.rs @@ -17,6 +17,8 @@ const MAX_CLIENT_INACTIVITY : Duration = Duration::from_secs(200); const GAME_SAVE_LAG : Duration = Duration::from_millis(500); +const MAX_LOG_AGE : Duration = Duration::from_secs(10 * 86400); + #[derive(Hash,Ord,PartialOrd,Eq,PartialEq,Serialize)] #[repr(transparent)] pub struct RawTokenVal(str); diff --git a/src/imports.rs b/src/imports.rs index dcd5754f..5e6b3cfb 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -35,6 +35,8 @@ pub use std::env; pub use std::process::exit; pub use std::borrow::Cow; +pub use boolinator::Boolinator as _; + pub use thiserror::Error; pub use anyhow::{Context,anyhow}; pub use fehler::{throws,throw}; diff --git a/src/updates.rs b/src/updates.rs index 59b090b3..8c4418a4 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -412,11 +412,11 @@ impl<'r> PrepareUpdatesBuffer<'r> { let now = Timestamp::now(); for logent in logents { let when = iter::once(now).chain( - self.g.gs.log.last().map(|l| l.1.when) + self.g.gs.log.back().map(|l| l.1.when) ).max().unwrap(); let logent = Arc::new(CommittedLogEntry { when, logent }); let gen = self.gen(); - self.g.gs.log.push((gen, logent.clone())); + self.g.gs.log.push_back((gen, logent.clone())); self.us.push(PreparedUpdateEntry::Log(logent)); } } -- 2.30.2