diff options
author | Shane A. Faulkner <[email protected]> | 2018-07-31 11:39:45 -0500 |
---|---|---|
committer | GitHub <[email protected]> | 2018-07-31 11:39:45 -0500 |
commit | 01875c395bd4050141bae0737d3a0417e48fca70 (patch) | |
tree | 52b9b581c57e6024edbfe0e0cc698549473c3025 | |
parent | 98bae4a0a195eaf611f43669e3cdcfd3ac76a374 (diff) | |
parent | 2872f40d13682e9905771da900e13bc8045d509f (diff) | |
download | vaultwarden-01875c395bd4050141bae0737d3a0417e48fca70.tar.gz vaultwarden-01875c395bd4050141bae0737d3a0417e48fca70.zip |
Merge pull request #1 from mprasil/concurrency_fix
WAL journal mode and delete retry added
-rw-r--r-- | src/db/models/attachment.rs | 31 | ||||
-rw-r--r-- | src/main.rs | 5 |
2 files changed, 30 insertions, 6 deletions
diff --git a/src/db/models/attachment.rs b/src/db/models/attachment.rs index 1ce4edfe..1f5e29a7 100644 --- a/src/db/models/attachment.rs +++ b/src/db/models/attachment.rs @@ -64,14 +64,33 @@ impl Attachment { pub fn delete(self, conn: &DbConn) -> QueryResult<()> { use util; + use std::{thread, time}; - util::delete_file(&self.get_file_path()); + 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 { + println!("ERROR: Failed with 10 retries"); + return Err(err) + } else { + retries = retries - 1; + println!("Had to retry! Retries left: {}", retries); + thread::sleep(time::Duration::from_millis(500)); + continue + } + } + } + } - diesel::delete( - attachments::table.filter( - attachments::id.eq(self.id) - ) - ).execute(&**conn).and(Ok(())) + util::delete_file(&self.get_file_path()); + Ok(()) } pub fn delete_all_by_cipher(cipher_uuid: &str, conn: &DbConn) -> QueryResult<()> { diff --git a/src/main.rs b/src/main.rs index 17b63794..59840b9c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -83,6 +83,11 @@ fn check_db() { exit(1); } } + + // Turn on WAL in SQLite + use diesel::RunQueryDsl; + let connection = db::get_connection().expect("Can't conect to DB"); + diesel::sql_query("PRAGMA journal_mode=wal").execute(&connection).expect("Failed to turn on WAL"); } fn check_rsa_keys() { |