| 907 | } |
| 908 | |
| 909 | fn acquire_owner_lock(dot_dir: &Path) -> anyhow::Result<File> { |
| 910 | let path = dot_dir.join(OWNER_LOCK_FILE); |
| 911 | let file = OpenOptions::new() |
| 912 | .create(true) |
| 913 | .truncate(false) |
| 914 | .read(true) |
| 915 | .write(true) |
| 916 | .open(&path) |
| 917 | .with_context(|| format!("failed to open owner lock {}", path.display()))?; |
| 918 | file.try_lock_exclusive().map_err(|error| { |
| 919 | anyhow!( |
| 920 | "another database owner already holds {}: {error}", |
| 921 | path.display() |
| 922 | ) |
| 923 | })?; |
| 924 | Ok(file) |
| 925 | } |
| 926 | |
| 927 | fn owner_failpoint(name: &str) { |
| 928 | if std::env::var("ATOMIC_OWNER_FAILPOINT").ok().as_deref() != Some(name) { |