handle server crashing while holding data_store lock.
This commit is contained in:
parent
7ced269906
commit
adfafe1fc6
|
@ -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<Option<Texture>> {
|
||||
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<Option<Texture>> {
|
||||
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<Vec<u8>> {
|
||||
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<Vec<u8>> {
|
||||
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<Texture>,
|
||||
insert_texture_data: Option<Vec<u8>>,
|
||||
) -> ProtocolResult<ReplaceTextureStatus> {
|
||||
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue