handle server crashing while holding data_store lock.
This commit is contained in:
		@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user