From adfafe1fc6ee1fb1b51e332af54e7b330009b10a Mon Sep 17 00:00:00 2001 From: CodeSteak Date: Mon, 13 May 2019 23:09:50 +0200 Subject: [PATCH] handle server crashing while holding data_store lock. --- .../texture-sync-server/src/server_state.rs | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/server/texture-sync-server/src/server_state.rs b/server/texture-sync-server/src/server_state.rs index 09ef116..d7a1875 100644 --- a/server/texture-sync-server/src/server_state.rs +++ b/server/texture-sync-server/src/server_state.rs @@ -25,24 +25,38 @@ impl ProtocolHandler for ServerState { let q = Query::parse(query) .map_err(|e| ProtocolError::BadRequest(format!("Invalid Query String: {:?}", e)))?; - let data_store = self.data_store.read().unwrap(); + let data_store = self + .data_store + .read() + .unwrap_or_else(|_| handle_broken_rwlock()); let mut textures = data_store.borrow_textures(); Ok(q.search(&mut textures)) } fn get_texture_by_id(&mut self, id: &str) -> ProtocolResult> { - let data_store = self.data_store.read().unwrap(); + let data_store = self + .data_store + .read() + .unwrap_or_else(|_| handle_broken_rwlock()); + Ok(data_store.texture_by_id(id)) } fn get_texture_by_name(&mut self, name: &str) -> ProtocolResult> { - let data_store = self.data_store.read().unwrap(); + let data_store = self + .data_store + .read() + .unwrap_or_else(|_| handle_broken_rwlock()); + Ok(data_store.texture_by_name(name)) } fn get_texture_file(&mut self, hash: Sha256) -> ProtocolResult> { - let data_store = self.data_store.read().unwrap(); + let data_store = self + .data_store + .read() + .unwrap_or_else(|_| handle_broken_rwlock()); let data = data_store.read_texture_file_by_hash(&hash)?; @@ -54,7 +68,10 @@ impl ProtocolHandler for ServerState { hash: Sha256, format: TextureFormat, ) -> ProtocolResult> { - let mut data_store = self.data_store.write().unwrap(); + let mut data_store = self + .data_store + .write() + .unwrap_or_else(|_| handle_broken_rwlock()); let preview = data_store.get_texture_preview(&hash, format)?; @@ -67,7 +84,10 @@ impl ProtocolHandler for ServerState { insert: Option, insert_texture_data: Option>, ) -> ProtocolResult { - let mut data_store = self.data_store.write().unwrap(); + let mut data_store = self + .data_store + .write() + .unwrap_or_else(|_| handle_broken_rwlock()); match insert_texture_data { Some(data) => { @@ -133,3 +153,10 @@ impl ProtocolHandler for ServerState { } } } + +fn handle_broken_rwlock() -> ! { + eprintln!("Panic while data_store lock was acquired."); + eprintln!("Representation in memory could be invalid."); + eprintln!("Can't recover. Please restart."); + std::process::exit(13); +}