Documentation ¶
Overview ¶
Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved.
SPDX-License-Identifier: Apache-2.0
Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved.
SPDX-License-Identifier: Apache-2.0
Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved.
SPDX-License-Identifier: Apache-2.0
Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved.
SPDX-License-Identifier: Apache-2.0
Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved.
SPDX-License-Identifier: Apache-2.0
Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved.
SPDX-License-Identifier: Apache-2.0
Distributed lock using lock files https://fileinfo.com/extension/lock
Index ¶
- Constants
- Variables
- func CleanDir(dir string) (err error)
- func ConvertFileSytemError(err error) error
- func Copy(src string, dest string) (err error)
- func CopyBetweenFS(srcFs FS, src string, destFs FS, dest string) (err error)
- func CurrentDirectory() (string, error)
- func ExcludeAll(files []string, exclusionPatterns ...string) ([]string, error)
- func Exists(path string) bool
- func FindAll(dir string, extensions ...string) (files []string, err error)
- func GetFileSize(name string) (size int64, err error)
- func GetType() int
- func IdentityPathConverterFunc(path string) string
- func IsDir(path string) (result bool, err error)
- func IsDirectory(fi os.FileInfo) bool
- func IsEmpty(name string) (empty bool, err error)
- func IsFile(path string) (result bool, err error)
- func IsFileHandleUnset(fh uintptr) bool
- func IsPathNotExist(err error) bool
- func IsRegularFile(fi os.FileInfo) bool
- func IsSymLink(fi os.FileInfo) bool
- func ListDirTree(dirPath string, list *[]string) error
- func Ls(dir string) (files []string, err error)
- func Lstat(name string) (fileInfo os.FileInfo, err error)
- func MkDir(dir string) (err error)
- func Move(src string, dest string) (err error)
- func MoveBetweenFS(srcFs FS, src string, destFs FS, dest string) (err error)
- func NewExtendedOsFs() afero.Fs
- func PathSeparator() rune
- func ReadFile(name string) ([]byte, error)
- func Rm(dir string) (err error)
- func Stat(name string) (os.FileInfo, error)
- func SubDirectories(directory string) ([]string, error)
- func TempDir(dir string, prefix string) (name string, err error)
- func TempDirInTempDir(prefix string) (name string, err error)
- func TempDirectory() string
- func Unzip(source string, destination string) ([]string, error)
- func Zip(source string, destination string) error
- type Chowner
- type DiskUsage
- type ExtendedOsFs
- type FS
- type File
- type FileTimeInfo
- type IFileHash
- type ILock
- type Linker
- type RemoteLockFile
- func (l *RemoteLockFile) IsStale() bool
- func (l *RemoteLockFile) Lock(ctx context.Context) error
- func (l *RemoteLockFile) LockWithTimeout(ctx context.Context, timeout time.Duration) error
- func (l *RemoteLockFile) MakeStale(ctx context.Context) error
- func (l *RemoteLockFile) ReleaseIfStale(ctx context.Context) error
- func (l *RemoteLockFile) TryLock(ctx context.Context) (err error)
- func (l *RemoteLockFile) Unlock(context.Context) error
- type UsageStat
- func (d *UsageStat) GetFree() uint64
- func (d *UsageStat) GetInodesFree() uint64
- func (d *UsageStat) GetInodesTotal() uint64
- func (d *UsageStat) GetInodesUsed() uint64
- func (d *UsageStat) GetInodesUsedPercent() float64
- func (d *UsageStat) GetTotal() uint64
- func (d *UsageStat) GetUsed() uint64
- func (d *UsageStat) GetUsedPercent() float64
- type VFS
- func (fs *VFS) Chmod(name string, mode os.FileMode) error
- func (fs *VFS) Chown(name string, uid, gid int) (err error)
- func (fs *VFS) Chtimes(name string, atime time.Time, mtime time.Time) error
- func (fs *VFS) CleanDir(dir string) (err error)
- func (fs *VFS) ConvertFilePath(name string) string
- func (fs *VFS) ConvertToAbsolutePath(rootPath string, paths []string) ([]string, error)
- func (fs *VFS) ConvertToRelativePath(rootPath string, paths []string) ([]string, error)
- func (fs *VFS) Copy(src string, dest string) (err error)
- func (fs *VFS) CreateFile(name string) (File, error)
- func (fs *VFS) CurrentDirectory() (string, error)
- func (fs *VFS) DiskUsage(name string) (usage DiskUsage, err error)
- func (fs *VFS) ExcludeAll(files []string, exclusionPatterns ...string) ([]string, error)
- func (fs *VFS) Exists(path string) bool
- func (fs *VFS) FileHash(hashAlgo string, path string) (hash string, err error)
- func (fs *VFS) FindAll(dir string, extensions ...string) (files []string, err error)
- func (fs *VFS) GarbageCollect(root string, durationSinceLastAccess time.Duration) error
- func (fs *VFS) GenericOpen(name string) (File, error)
- func (fs *VFS) GetFileSize(name string) (size int64, err error)
- func (fs *VFS) GetType() int
- func (fs *VFS) IsDir(path string) (result bool, err error)
- func (fs *VFS) IsEmpty(name string) (empty bool, err error)
- func (fs *VFS) IsFile(path string) (result bool, err error)
- func (fs *VFS) IsLink(path string) (result bool, err error)
- func (fs *VFS) Link(oldname, newname string) (err error)
- func (fs *VFS) ListDirTree(dirPath string, list *[]string) error
- func (fs *VFS) Lls(dir string) (files []os.FileInfo, err error)
- func (fs *VFS) LlsFromOpenedDirectory(dir File) ([]os.FileInfo, error)
- func (fs *VFS) Ls(dir string) (names []string, err error)
- func (fs *VFS) LsFromOpenedDirectory(dir File) ([]string, error)
- func (fs *VFS) Lstat(name string) (fileInfo os.FileInfo, err error)
- func (fs *VFS) MkDir(dir string) (err error)
- func (fs *VFS) MkDirAll(dir string, perm os.FileMode) (err error)
- func (fs *VFS) Move(src string, dest string) (err error)
- func (fs *VFS) NewRemoteLockFile(id string, dirToLock string) ILock
- func (fs *VFS) Open(name string) (doublestar.File, error)
- func (fs *VFS) OpenFile(name string, flag int, perm os.FileMode) (File, error)
- func (fs *VFS) PathSeparator() rune
- func (fs *VFS) ReadFile(filename string) (content []byte, err error)
- func (fs *VFS) Readlink(name string) (value string, err error)
- func (fs *VFS) Rm(dir string) (err error)
- func (fs *VFS) Stat(name string) (os.FileInfo, error)
- func (fs *VFS) StatTimes(name string) (info FileTimeInfo, err error)
- func (fs *VFS) SubDirectories(directory string) ([]string, error)
- func (fs *VFS) Symlink(oldname string, newname string) (err error)
- func (fs *VFS) TempDir(dir string, prefix string) (name string, err error)
- func (fs *VFS) TempDirInTempDir(prefix string) (name string, err error)
- func (fs *VFS) TempDirectory() string
- func (fs *VFS) TempFile(dir string, prefix string) (f File, err error)
- func (fs *VFS) TempFileInTempDir(prefix string) (f File, err error)
- func (fs *VFS) Unzip(source string, destination string) (fileList []string, err error)
- func (fs *VFS) Walk(root string, fn filepath.WalkFunc) error
- func (fs *VFS) WriteFile(filename string, data []byte, perm os.FileMode) (err error)
- func (fs *VFS) Zip(source, destination string) error
Constants ¶
const ( StandardFS int = iota InMemoryFS )
const LockFilePrefix = "lockfile"
const (
UnsetFileHandle = ^uint64(0)
)
Variables ¶
var ( ErrLinkNotImplemented = fmt.Errorf("link not implemented: %w", commonerrors.ErrNotImplemented) ErrChownNotImplemented = fmt.Errorf("chown not implemented: %w", commonerrors.ErrNotImplemented) ErrPathNotExist = errors.New("readdirent: no such file or directory") )
var (
FileSystemTypes = []int{StandardFS, InMemoryFS}
)
Functions ¶
func ConvertFileSytemError ¶
Converts file system error into common errors
func CurrentDirectory ¶
func ExcludeAll ¶
Excludes files
func GetFileSize ¶
func IsDirectory ¶
func IsFileHandleUnset ¶
func IsPathNotExist ¶
func IsRegularFile ¶
func ListDirTree ¶
func NewExtendedOsFs ¶
func PathSeparator ¶
func PathSeparator() rune
func SubDirectories ¶
func TempDirInTempDir ¶
func TempDirectory ¶
func TempDirectory() string
Types ¶
type ExtendedOsFs ¶
func (*ExtendedOsFs) ChownIfPossible ¶
func (c *ExtendedOsFs) ChownIfPossible(name string, uid int, gid int) error
func (*ExtendedOsFs) LinkIfPossible ¶
func (c *ExtendedOsFs) LinkIfPossible(oldname, newname string) (err error)
type FS ¶
type FS interface { //The following is for being able to use doublestar Open(name string) (doublestar.File, error) // Open a file for reading. It opens the named file with specified flag (O_RDONLY etc.). // See os.Open() GenericOpen(name string) (File, error) // OpenFile opens a file using the given flags and the given mode. // OpenFile is the generalized open call // most users will use GenericOpen or Create instead. // See os.OpenFile OpenFile(name string, flag int, perm os.FileMode) (File, error) // Creates a file. CreateFile(name string) (File, error) // Gets the path separator character. PathSeparator() rune Stat(name string) (os.FileInfo, error) Lstat(name string) (os.FileInfo, error) // Gets file time information. StatTimes(name string) (FileTimeInfo, error) // Gets the type of the file system. GetType() int // Removes all the files in a directory (equivalent rm -rf .../*) CleanDir(dir string) (err error) // Checks if a file or folder exists Exists(path string) bool // Removes directory (equivalent to rm -r) Rm(dir string) (err error) // States whether it is a file or not IsFile(path string) (result bool, err error) // States whether it is a directory or not IsDir(path string) (result bool, err error) // States whether it is a link or not IsLink(path string) (result bool, err error) // Checks whether a path is empty or not IsEmpty(name string) (empty bool, err error) // Makes directory (equivalent to mkdir -p) MkDir(dir string) (err error) // Makes directory (equivalent to mkdir -p) MkDirAll(dir string, perm os.FileMode) (err error) // Excludes files from a list. Returns the list without the path matching the exclusion patterns. ExcludeAll(files []string, exclusionPatterns ...string) ([]string, error) // Finds all the files with extensions FindAll(dir string, extensions ...string) (files []string, err error) // Walks the file tree rooted at root, calling fn for each file or // directory in the tree, including root. See https://golang.org/pkg/path/filepath/#WalkDir Walk(root string, fn filepath.WalkFunc) error // Lists all files and directory (equivalent to ls) Ls(dir string) (files []string, err error) LsFromOpenedDirectory(dir File) (files []string, err error) // Lists all files and directory (equivalent to ls -l) Lls(dir string) (files []os.FileInfo, err error) LlsFromOpenedDirectory(dir File) (files []os.FileInfo, err error) // Copy files and directory (equivalent to cp -r) Copy(src string, dest string) (err error) // Moves a file (equivalent to mv) Move(src string, dest string) (err error) // Creates a temp directory TempDir(dir string, prefix string) (name string, err error) // Creates a temp directory in temp directory. TempDirInTempDir(prefix string) (name string, err error) // Creates a temp file TempFile(dir string, pattern string) (f File, err error) // Creates a temp file in temp directory. TempFileInTempDir(pattern string) (f File, err error) // Gets temp directory. TempDirectory() string // Gets current directory. CurrentDirectory() (string, error) // Reads a file and return its content. ReadFile(filename string) ([]byte, error) // Writes data to a file named by filename. // If the file does not exist, WriteFile creates it with permissions perm; // otherwise WriteFile truncates it before writing. WriteFile(filename string, data []byte, perm os.FileMode) error // Runs the Garbage collector on the filesystem (removes any file which has not been accessed for a certain duration) GarbageCollect(root string, durationSinceLastAccess time.Duration) error // Changes the mode of the named file to mode. Chmod(name string, mode os.FileMode) error // Changes the access and modification times of the named file Chtimes(name string, atime time.Time, mtime time.Time) error // Changes the numeric uid and gid of the named file. Chown(name string, uid, gid int) error // Creates newname as a hard link to the oldname file Link(oldname, newname string) error // Returns the destination of the named symbolic link. Readlink(name string) (string, error) // Creates newname as a symbolic link to oldname. Symlink(oldname string, newname string) error // Determines Disk usage DiskUsage(name string) (DiskUsage, error) // Gets file size GetFileSize(filename string) (int64, error) // Returns a list of all subdirectories (which are not hidden) SubDirectories(directory string) ([]string, error) // Lists the content of directory recursively ListDirTree(dirPath string, list *[]string) error // Gets FS file path instead of real file path. In most cases, returned file path // should be identical however this may not be true for some particular file systems e.g. for base FS, file path // returned will have any base prefix removed. ConvertFilePath(name string) string // Converts a list of paths to relative paths ConvertToRelativePath(rootPath string, paths []string) ([]string, error) // Converts a list of paths to relative paths ConvertToAbsolutePath(rootPath string, paths []string) ([]string, error) // Creates a lock file on a remote location (NFS) NewRemoteLockFile(id string, dirToLock string) ILock // Compresses a file tree (source) into a zip file (destination) Zip(source string, destination string) error // Decompresses a source zip archive into the destination Unzip(source string, destination string) ([]string, error) // Calculates file hash FileHash(hashAlgo string, path string) (string, error) }
func GetGlobalFileSystem ¶
func GetGlobalFileSystem() FS
func NewInMemoryFileSystem ¶
func NewInMemoryFileSystem() FS
func NewStandardFileSystem ¶
func NewStandardFileSystem() FS
type File ¶
func CreateFile ¶
func GenericOpen ¶
func TempFileInTempDir ¶
type FileTimeInfo ¶
type FileTimeInfo interface { ModTime() time.Time AccessTime() time.Time ChangeTime() time.Time BirthTime() time.Time HasChangeTime() bool HasBirthTime() bool HasAccessTime() bool }
func DetermineFileTimes ¶
func DetermineFileTimes(info os.FileInfo) (times FileTimeInfo, err error)
type IFileHash ¶
type IFileHash interface { Calculate(f File) (string, error) CalculateFile(fs FS, path string) (string, error) GetType() string }
For reference. https://stackoverflow.com/questions/1761607/what-is-the-fastest-hash-algorithm-to-check-if-two-files-are-equal
func NewFileHash ¶
type ILock ¶
type ILock interface { Lock(ctx context.Context) error // Locks the lock. This call will wait (i.e. block) until the lock is available. LockWithTimeout(ctx context.Context, timeout time.Duration) error // Tries to lock the lock until the timeout expires. If the timeout expires, this method will return commonerror.ErrTimeout. TryLock(ctx context.Context) error // Attempts to lock the lock instantly. This method will return commonerrors.ErrLocked immediately if the lock cannot be acquired straight away. IsStale() bool // Determines whether a lock is stale (the owner forgot to release it or is dead) or not. Unlock(ctx context.Context) error // Releases the lock. This takes precedence over any current lock. ReleaseIfStale(ctx context.Context) error // Forces the lock to be released if it is considered as stale. MakeStale(ctx context.Context) error // Makes the lock stale. This is mostly for testing purposes. }
FIXME it should be noted that despite being possible to use the lock with an in-memory filesystem, it should be avoided at all cost. The implementation of the in-memory FS used (afero) has shown several thread safety issues (e.g. https://github.com/spf13/afero/issues/298) and therefore, should not be used for scenarios involving concurrency until it is fixed.
func NewGenericRemoteLockFile ¶
NewGenericRemoteLockFile creates a new remote lock using the file system.
type RemoteLockFile ¶
type RemoteLockFile struct {
// contains filtered or unexported fields
}
RemoteLockFile describes a distributed lock using only the file system. The locking mechanism is performed using directories and the atomic function `mkdir`. A major issue of distributed locks is the presence of stale locks due to many factors such as the loss of the holder of a lock for various reasons. To mitigate this problem, a "heart bit" file is modified regularly by the lock holder in order to specify the holder is still alive and the lock still valid.
func (*RemoteLockFile) IsStale ¶
func (l *RemoteLockFile) IsStale() bool
IsStale checks whether the lock is stale (i.e. no heart beat detected) or not.
func (*RemoteLockFile) Lock ¶
func (l *RemoteLockFile) Lock(ctx context.Context) error
Lock locks the lock. This call will block until the lock is available.
func (*RemoteLockFile) LockWithTimeout ¶
LockWithTimeout tries to lock the lock until the timeout expires
func (*RemoteLockFile) MakeStale ¶
func (l *RemoteLockFile) MakeStale(ctx context.Context) error
MakeStale is mostly useful for testing purposes and tries to mock locks going stale.
func (*RemoteLockFile) ReleaseIfStale ¶
func (l *RemoteLockFile) ReleaseIfStale(ctx context.Context) error
type UsageStat ¶
type UsageStat struct { Total uint64 Free uint64 Used uint64 UsedPercent float64 InodesTotal uint64 InodesUsed uint64 InodesFree uint64 InodesUsedPercent float64 }
func (*UsageStat) GetInodesFree ¶
func (*UsageStat) GetInodesTotal ¶
func (*UsageStat) GetInodesUsed ¶
func (*UsageStat) GetInodesUsedPercent ¶
func (*UsageStat) GetUsedPercent ¶
type VFS ¶
type VFS struct {
// contains filtered or unexported fields
}
func (*VFS) ConvertFilePath ¶
func (*VFS) ConvertToAbsolutePath ¶
func (*VFS) ConvertToRelativePath ¶
func (*VFS) CurrentDirectory ¶
func (*VFS) ExcludeAll ¶
func (*VFS) GarbageCollect ¶
func (*VFS) ListDirTree ¶
Return a list of files and directories recursively available under specified path
func (*VFS) LlsFromOpenedDirectory ¶
func (*VFS) LsFromOpenedDirectory ¶
func (*VFS) PathSeparator ¶
func (*VFS) SubDirectories ¶
Return a list of all subdirectories (which are not hidden)