feat: add resumable file archive jobs and offline verification
This commit is contained in:
27
internal/retention/job_lock_unix.go
Normal file
27
internal/retention/job_lock_unix.go
Normal file
@@ -0,0 +1,27 @@
|
||||
//go:build linux || darwin
|
||||
|
||||
package retention
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
// lockJob 的非阻塞文件锁随进程退出自动释放,不使用永不过期的“锁目录”。
|
||||
func lockJob(root *os.Root) (*os.File, error) {
|
||||
f, err := root.OpenFile(".lock", os.O_CREATE|os.O_RDWR|syscall.O_NOFOLLOW, 0600)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
info, err := f.Stat()
|
||||
if err != nil || !info.Mode().IsRegular() || info.Mode().Perm()&0077 != 0 {
|
||||
f.Close()
|
||||
return nil, errors.New("invalid archive lock file")
|
||||
}
|
||||
if err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); err != nil {
|
||||
f.Close()
|
||||
return nil, errors.New("archive job is locked or filesystem does not support locking")
|
||||
}
|
||||
return f, nil
|
||||
}
|
||||
Reference in New Issue
Block a user