forked from minio/minio
/
xl-storage-errors.go
141 lines (124 loc) · 3.76 KB
/
xl-storage-errors.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// Copyright (c) 2015-2021 MinIO, Inc.
//
// This file is part of MinIO Object Storage stack
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package cmd
import (
"errors"
"os"
"runtime"
"syscall"
)
// No space left on device error
func isSysErrNoSpace(err error) bool {
return errors.Is(err, syscall.ENOSPC)
}
// Invalid argument, unsupported flags such as O_DIRECT
func isSysErrInvalidArg(err error) bool {
return errors.Is(err, syscall.EINVAL)
}
// Input/output error
func isSysErrIO(err error) bool {
return errors.Is(err, syscall.EIO)
}
// Check if the given error corresponds to EISDIR (is a directory).
func isSysErrIsDir(err error) bool {
return errors.Is(err, syscall.EISDIR)
}
// Check if the given error corresponds to ENOTDIR (is not a directory).
func isSysErrNotDir(err error) bool {
return errors.Is(err, syscall.ENOTDIR)
}
// Check if the given error corresponds to the ENAMETOOLONG (name too long).
func isSysErrTooLong(err error) bool {
return errors.Is(err, syscall.ENAMETOOLONG)
}
// Check if the given error corresponds to the ELOOP (too many symlinks).
func isSysErrTooManySymlinks(err error) bool {
return errors.Is(err, syscall.ELOOP)
}
// Check if the given error corresponds to ENOTEMPTY for unix,
// EEXIST for solaris variants,
// and ERROR_DIR_NOT_EMPTY for windows (directory not empty).
func isSysErrNotEmpty(err error) bool {
if errors.Is(err, syscall.ENOTEMPTY) {
return true
}
if errors.Is(err, syscall.EEXIST) && runtime.GOOS == "solaris" {
return true
}
var pathErr *os.PathError
if errors.As(err, &pathErr) {
if runtime.GOOS == globalWindowsOSName {
var errno syscall.Errno
if errors.As(pathErr.Err, &errno) {
// ERROR_DIR_NOT_EMPTY
return errno == 0x91
}
}
}
return false
}
// Check if the given error corresponds to the specific ERROR_PATH_NOT_FOUND for windows
func isSysErrPathNotFound(err error) bool {
if runtime.GOOS != globalWindowsOSName {
var pathErr *os.PathError
if errors.As(err, &pathErr) {
return pathErr.Err == syscall.ENOENT
}
return false
}
var pathErr *os.PathError
if errors.As(err, &pathErr) {
var errno syscall.Errno
if errors.As(pathErr.Err, &errno) {
// ERROR_PATH_NOT_FOUND
return errno == 0x03
}
}
return false
}
// Check if the given error corresponds to the specific ERROR_INVALID_HANDLE for windows
func isSysErrHandleInvalid(err error) bool {
if runtime.GOOS != globalWindowsOSName {
return false
}
// Check if err contains ERROR_INVALID_HANDLE errno
var pathErr *os.PathError
if errors.As(err, &pathErr) {
var errno syscall.Errno
if errors.As(pathErr.Err, &errno) {
// ERROR_PATH_NOT_FOUND
return errno == 0x6
}
}
return false
}
func isSysErrCrossDevice(err error) bool {
return errors.Is(err, syscall.EXDEV)
}
// Check if given error corresponds to too many open files
func isSysErrTooManyFiles(err error) bool {
return errors.Is(err, syscall.ENFILE) || errors.Is(err, syscall.EMFILE)
}
func osIsNotExist(err error) bool {
return errors.Is(err, os.ErrNotExist)
}
func osIsPermission(err error) bool {
return errors.Is(err, os.ErrPermission) || errors.Is(err, syscall.EROFS)
}
func osIsExist(err error) bool {
return errors.Is(err, os.ErrExist)
}