Simplifying the locks

[?]
Jan 15, 2021, 11:41 AM
FI3WFMTSNVFWOQWSIWD64UCPRIS6MW4GOADOC6RXPHBSGZBYL5PAC

Dependencies

  • [2] W5NU4F6J Less noisy lock
  • [3] 64M73LNC Hide `pijul lock` and avoid panics when used improperly
  • [4] GYXIF25T Proper parsing of URLs
  • [5] 2K7JLB4Z No pager on Windows
  • [6] JL4WKA5P Implement the Sanakirja concurrency model in a cross-process way
  • [7] LYTVEPH3 Avoid cloning into an existing path
  • [*] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).

Change contents

  • replacement in pijul/src/repository/unix_lock.rs at line 20
    [4.2286][4.2286:2597]()
    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()?;
    [4.2286]
    [4.2597]
    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
    [4.2598][4.2598:2724]()
    let s = process.stdout.as_mut().unwrap();
    s.read(&mut [0u8])?;
    let mut stream = UnixStream::connect(file).await?;
    [4.2598]
    [4.2724]
    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
    [4.3050][4.3050:3267]()
    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?;
    [4.3050]
    [4.3267]
    let mut stream = start_stream_if_needed(file.as_ref()).await?;
    stream.writable().await?;
  • edit in pijul/src/commands/lock.rs at line 1
    [4.7180][4.7181:7225]()
    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(());
    [4.7613]
    [4.7905]
    if let Some(p) = self.path.parent() {
    std::fs::create_dir_all(p)?
  • replacement in pijul/src/commands/lock.rs at line 23
    [4.7915][3.81:137]()
    let listener = UnixListener::bind(&self.path)?;
    [4.7915]
    [4.7979]
    let listener = UnixListener::bind(&self.path);
  • edit in pijul/src/commands/lock.rs at line 25
    [4.7999]
    [4.7999]
    let listener = if let Ok(listener) = listener {
    listener
    } else {
    return Ok(());
    };
  • edit in pijul/src/commands/lock.rs at line 38
    [4.8358][4.8358:8419]()
    let last_commit_date = Arc::new(Mutex::new(0usize));
  • edit in pijul/src/commands/lock.rs at line 47
    [4.9496][4.9496:9565]()
    let last_commit_date = last_commit_date.clone();
  • edit in pijul/src/commands/lock.rs at line 50
    [4.9720][4.9720:9765]()
    let lock = lock.clone();
  • edit in pijul/src/commands/lock.rs at line 77
    [4.11259][4.11259:11340]()
    *last_commit_date.lock().await = *clock;
  • replacement in pijul/src/commands/lock.rs at line 92
    [4.12167][4.12167:12248]()
    if start_date < *last_commit_date.lock().await {
    [4.12167]
    [4.12248]
    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
    [4.2300][4.16945:16957]()
    fs2 = "0.4"