lock with timeout
clumsy, but I have node idea how to make it better
This commit is contained in:
		@ -98,7 +98,7 @@ impl ChunkStore {
 | 
			
		||||
        let mut lockfile_path = base.clone();
 | 
			
		||||
        lockfile_path.push(".lock");
 | 
			
		||||
 | 
			
		||||
         let lockfile = match OpenOptions::new()
 | 
			
		||||
        let lockfile = match OpenOptions::new()
 | 
			
		||||
            .create(true)
 | 
			
		||||
            .append(true)
 | 
			
		||||
            .open(&lockfile_path) {
 | 
			
		||||
@ -109,12 +109,34 @@ impl ChunkStore {
 | 
			
		||||
 | 
			
		||||
        let fd = lockfile.as_raw_fd();
 | 
			
		||||
 | 
			
		||||
        // fixme: lock with timeout
 | 
			
		||||
        flock(fd, FlockArg::LockExclusive)?;
 | 
			
		||||
        let now = std::time::SystemTime::now();
 | 
			
		||||
        let timeout = 10;
 | 
			
		||||
        let mut print_msg = true;
 | 
			
		||||
        loop {
 | 
			
		||||
            match flock(fd, FlockArg::LockExclusiveNonblock) {
 | 
			
		||||
                Ok(_) => break,
 | 
			
		||||
                Err(_) => {
 | 
			
		||||
                    if print_msg {
 | 
			
		||||
                        print_msg = false;
 | 
			
		||||
                        eprintln!("trying to aquire lock...");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        println!("Got LOCK {:?}", fd);
 | 
			
		||||
 | 
			
		||||
        //std::thread::sleep_ms(30000);
 | 
			
		||||
            match now.elapsed() {
 | 
			
		||||
                Ok(elapsed) => {
 | 
			
		||||
                    if elapsed.as_secs() >= timeout {
 | 
			
		||||
                        bail!("unable to aquire chunk store lock {:?} - got timeout",
 | 
			
		||||
                              lockfile_path);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Err(err) => {
 | 
			
		||||
                    bail!("unable to aquire chunk store lock {:?} - clock problems - {}",
 | 
			
		||||
                          lockfile_path, err);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            std::thread::sleep_ms(100);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Ok(ChunkStore {
 | 
			
		||||
            base,
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user