aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShane A. Faulkner <[email protected]>2018-07-31 11:39:45 -0500
committerGitHub <[email protected]>2018-07-31 11:39:45 -0500
commit01875c395bd4050141bae0737d3a0417e48fca70 (patch)
tree52b9b581c57e6024edbfe0e0cc698549473c3025
parent98bae4a0a195eaf611f43669e3cdcfd3ac76a374 (diff)
parent2872f40d13682e9905771da900e13bc8045d509f (diff)
downloadvaultwarden-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.rs31
-rw-r--r--src/main.rs5
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() {