From 574f260a30413752f38eb1af84d20f43a0260210 Mon Sep 17 00:00:00 2001 From: ntr Date: Sat, 1 Jun 2019 00:08:52 +1000 Subject: [PATCH] upkeep based on phase times now --- ops/migrations/20181020104420_games.js | 2 ++ server/Cargo.toml | 2 +- server/src/game.rs | 21 ++++++++------------- server/src/instance.rs | 9 +++++---- server/src/net.rs | 2 +- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/ops/migrations/20181020104420_games.js b/ops/migrations/20181020104420_games.js index 2e17ba79..4d498a92 100644 --- a/ops/migrations/20181020104420_games.js +++ b/ops/migrations/20181020104420_games.js @@ -4,6 +4,7 @@ exports.up = async knex => { table.index('id'); table.timestamps(true, true); table.binary('data').notNullable(); + table.timestamp('upkeep'); table.boolean('finished') .defaultTo(false) .notNullable() @@ -26,6 +27,7 @@ exports.up = async knex => { .notNullable() .index(); + table.timestamp('upkeep'); }); await knex.schema.createTable('players', table => { diff --git a/server/Cargo.toml b/server/Cargo.toml index d6c4618b..619095e4 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -16,7 +16,7 @@ tungstenite = "0.6" bcrypt = "0.2" dotenv = "0.9.0" -postgres = { version = "0.15", features = ["with-uuid"] } +postgres = { version = "0.15", features = ["with-uuid", "with-chrono"] } r2d2 = "*" r2d2_postgres = "*" diff --git a/server/src/game.rs b/server/src/game.rs index 2679a9e8..58a8ad04 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -614,13 +614,14 @@ pub fn game_write(tx: &mut Transaction, game: &Game) -> Result<(), Error> { let game_bytes = to_vec(&game)?; let query = " - INSERT INTO games (id, data) - VALUES ($1, $2) + INSERT INTO games (id, data, upkeep) + VALUES ($1, $2, $3) RETURNING id; "; + // no games should be sent to db that are not in progress let result = tx - .query(query, &[&game.id, &game_bytes])?; + .query(query, &[&game.id, &game_bytes, &game.phase_end])?; result.iter().next().ok_or(format_err!("no game written"))?; @@ -657,17 +658,11 @@ pub fn game_get(tx: &mut Transaction, id: Uuid) -> Result { } pub fn games_need_upkeep(tx: &mut Transaction) -> Result, Error> { - // let query = " - // SELECT data, id - // FROM games - // WHERE updated_at < now() - interval '5 seconds' - // AND finished = false; - // "; - let query = " SELECT data, id FROM games WHERE finished = false + AND upkeep < now() FOR UPDATE; "; let result = tx @@ -799,13 +794,13 @@ pub fn game_update(tx: &mut Transaction, game: &Game) -> Result<(), Error> { let query = " UPDATE games - SET data = $1, finished = $2, updated_at = now() - WHERE id = $3 + SET data = $1, finished = $2, upkeep = $3, updated_at = now() + WHERE id = $4 RETURNING id, data; "; let result = tx - .query(query, &[&game_bytes, &game.finished(), &game.id])?; + .query(query, &[&game_bytes, &game.finished(), &game.phase_end, &game.id])?; result.iter().next().ok_or(format_err!("game {:?} could not be written", game))?; diff --git a/server/src/instance.rs b/server/src/instance.rs index bf298039..be3e2493 100644 --- a/server/src/instance.rs +++ b/server/src/instance.rs @@ -534,13 +534,13 @@ pub fn instance_update(tx: &mut Transaction, instance: Instance) -> Result Result, Erro SELECT data, id FROM instances WHERE finished = false - AND id != '00000000-0000-0000-0000-000000000000' + AND open = false + AND upkeep < now() FOR UPDATE; "; diff --git a/server/src/net.rs b/server/src/net.rs index 86b162ad..2e1fce4a 100644 --- a/server/src/net.rs +++ b/server/src/net.rs @@ -102,7 +102,7 @@ pub fn start() { if let Err(e) = warden(db_connection) { info!("{:?}", e); } - sleep(Duration::new(5, 0)); + sleep(Duration::new(1, 0)); } });