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 FilepathStem(fp string) string
- 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(ctx 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 FilepathStem ¶ added in v1.13.0
FilepathStem returns the final path component, without its suffix.
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)