Simplifying the locks
[?]
Jan 15, 2021, 11:41 AM
FI3WFMTSNVFWOQWSIWD64UCPRIS6MW4GOADOC6RXPHBSGZBYL5PACDependencies
- [2]
W5NU4F6JLess noisy lock - [3]
64M73LNCHide `pijul lock` and avoid panics when used improperly - [4]
2K7JLB4ZNo pager on Windows - [5]
LYTVEPH3Avoid cloning into an existing path - [6]
JL4WKA5PImplement the Sanakirja concurrency model in a cross-process way - [7]
GYXIF25TProper parsing of URLs - [*]
SXEYMYF7Fixing the bad changes in history (unfortunately, by rebooting).
Change contents
- replacement in pijul/src/repository/unix_lock.rs at line 20
pub async fn mut_txn<P: AsRef<Path>>(file: P) -> Result<MutTxnLock, anyhow::Error> {let cmd = std::env::args().next().unwrap();let mut process = std::process::Command::new(&cmd).args(&["lock", file.as_ref().to_str().unwrap()]).stdout(std::process::Stdio::piped()).spawn()?;async fn start_stream_if_needed(file: &Path) -> Result<UnixStream, std::io::Error> {if let Ok(stream) = UnixStream::connect(file).await {Ok(stream)} else {let cmd = std::env::args().next().unwrap();let mut process = std::process::Command::new(&cmd).args(&["lock", file.to_str().unwrap()]).stdout(std::process::Stdio::piped()).spawn()?;let s = process.stdout.as_mut().unwrap();s.read(&mut [0u8])?;UnixStream::connect(file).await}} - replacement in pijul/src/repository/unix_lock.rs at line 35
let s = process.stdout.as_mut().unwrap();s.read(&mut [0u8])?;let mut stream = UnixStream::connect(file).await?;pub async fn mut_txn<P: AsRef<Path>>(file: P) -> Result<MutTxnLock, anyhow::Error> {let mut stream = start_stream_if_needed(file.as_ref()).await?; - replacement in pijul/src/repository/unix_lock.rs at line 49
let cmd = std::env::args().next().unwrap();std::process::Command::new(&cmd).args(&["lock", file.as_ref().to_str().unwrap()]).spawn()?;let mut stream = UnixStream::connect(file).await?;let mut stream = start_stream_if_needed(file.as_ref()).await?;stream.writable().await?; - edit in pijul/src/commands/lock.rs at line 1
use fs2::FileExt;use std::fs::OpenOptions; - replacement in pijul/src/commands/lock.rs at line 20[4.7613]→[4.7613:7676](∅→∅),[4.7676]→[2.0:58](∅→∅),[2.58]→[4.7676:7769](∅→∅),[4.7676]→[4.7676:7769](∅→∅),[4.7769]→[3.44:80](∅→∅),[3.80]→[4.7826:7905](∅→∅),[4.7826]→[4.7826:7905](∅→∅)
let lock = Arc::new(self.path.with_extension("lock"));std::fs::create_dir_all(lock.parent().unwrap())?;let lockfile = OpenOptions::new().write(true).create(true).open(&lock.as_ref())?;if lockfile.try_lock_exclusive().is_err() {return Ok(());if let Some(p) = self.path.parent() {std::fs::create_dir_all(p)? - replacement in pijul/src/commands/lock.rs at line 23
let listener = UnixListener::bind(&self.path)?;let listener = UnixListener::bind(&self.path); - edit in pijul/src/commands/lock.rs at line 25
let listener = if let Ok(listener) = listener {listener} else {return Ok(());}; - edit in pijul/src/commands/lock.rs at line 38
let last_commit_date = Arc::new(Mutex::new(0usize)); - edit in pijul/src/commands/lock.rs at line 47
let last_commit_date = last_commit_date.clone(); - edit in pijul/src/commands/lock.rs at line 50
let lock = lock.clone(); - edit in pijul/src/commands/lock.rs at line 77
*last_commit_date.lock().await = *clock; - replacement in pijul/src/commands/lock.rs at line 92
if start_date < *last_commit_date.lock().await {if start_date < *clock.lock().await { - edit in pijul/src/commands/lock.rs at line 102[4.13197]→[3.138:211](∅→∅),[3.211]→[4.13263:13362](∅→∅),[4.13263]→[4.13263:13362](∅→∅),[4.13362]→[4.13362:13419](∅→∅),[4.13419]→[3.212:349](∅→∅)
if let Ok(lockfile) = OpenOptions::new().write(true).create(true).open(lock.as_ref()){lockfile.unlock().unwrap_or(());} - edit in pijul/src/commands/lock.rs at line 112[4.13852]→[4.13852:13945](∅→∅),[4.13945]→[3.350:385](∅→∅),[3.385]→[4.14001:14042](∅→∅),[4.14001]→[4.14001:14042](∅→∅)
let lockfile = OpenOptions::new().write(true).create(true).open(lock.as_ref())?;lockfile.unlock().unwrap_or(()); - edit in pijul/Cargo.toml at line 87
fs2 = "0.4"