vw_small

Hardened fork of Vaultwarden (https://github.com/dani-garcia/vaultwarden) with fewer features.
git clone https://git.philomathiclife.com/repos/vw_small
Log | Files | Refs | README

commit 4e827e4f8ab4c5d3daf22de8753d9d585772dcdb
parent f713e2e092c337496758c92bb69c6feea47428fc
Author: Daniel GarcĂ­a <dani-garcia@users.noreply.github.com>
Date:   Wed, 12 Dec 2018 22:15:54 +0100

Implement better retry and use it while saving device

Diffstat:
Msrc/db/models/attachment.rs | 36+++++++++---------------------------
Msrc/db/models/device.rs | 12+++++++++---
Msrc/util.rs | 29++++++++++++++++++++++++++++-
3 files changed, 46 insertions(+), 31 deletions(-)

diff --git a/src/db/models/attachment.rs b/src/db/models/attachment.rs @@ -64,33 +64,15 @@ impl Attachment { } pub fn delete(self, conn: &DbConn) -> QueryResult<()> { - use crate::util; - use std::{thread, time}; - - let mut retries = 10; - - loop { - match diesel::delete( - attachments::table.filter( - attachments::id.eq(&self.id) - ) - ).execute(&**conn) { - Ok(_) => break, - Err(err) => { - if retries < 1 { - error!("Failed with 10 retries"); - return Err(err) - } else { - retries -= 1; - info!("Had to retry! Retries left: {}", retries); - thread::sleep(time::Duration::from_millis(500)); - continue - } - } - } - } - - util::delete_file(&self.get_file_path()); + crate::util::retry( + || { + diesel::delete(attachments::table.filter(attachments::id.eq(&self.id))) + .execute(&**conn) + }, + 10, + )?; + + crate::util::delete_file(&self.get_file_path()); Ok(()) } diff --git a/src/db/models/device.rs b/src/db/models/device.rs @@ -101,7 +101,6 @@ impl Device { amr: vec!["Application".into()], }; - (encode_jwt(&claims), DEFAULT_VALIDITY.num_seconds()) } } @@ -116,8 +115,15 @@ impl Device { pub fn save(&mut self, conn: &DbConn) -> QueryResult<()> { self.updated_at = Utc::now().naive_utc(); - diesel::replace_into(devices::table) - .values(&*self).execute(&**conn).and(Ok(())) + crate::util::retry( + || { + diesel::replace_into(devices::table) + .values(&*self) + .execute(&**conn) + }, + 10, + ) + .and(Ok(())) } pub fn delete(self, conn: &DbConn) -> QueryResult<()> { diff --git a/src/util.rs b/src/util.rs @@ -252,6 +252,33 @@ fn upcase_value(value: &Value) -> Value { fn _process_key(key: &str) -> String { match key.to_lowercase().as_ref() { "ssn" => "SSN".into(), - _ => self::upcase_first(key) + _ => self::upcase_first(key), + } +} + +// +// Retry methods +// + +pub fn retry<F, T, E>(func: F, max_tries: i32) -> Result<T, E> +where + F: Fn() -> Result<T, E>, +{ + use std::{thread::sleep, time::Duration}; + let mut tries = 0; + + loop { + match func() { + ok @ Ok(_) => return ok, + err @ Err(_) => { + tries += 1; + + if tries >= max_tries { + return err; + } + + sleep(Duration::from_millis(500)); + } + } } }