juicedata/juicefs · info
ErrSkipped
ErrSkipped
Error message
skipped
What it means
utils.ErrSkipped is a sentinel meaning the operation was intentionally skipped. In cmd/object.go, the JuiceFS object-storage wrapper returns it (wrapped) when the target key is a special file name (e.g. control files), and shouldRetry uses it to avoid retrying skipped operations.
Source
Thrown at pkg/utils/errors.go:27
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package utils
import (
"errors"
"syscall"
)
var (
ErrNotSUP = errors.New("not supported")
ErrFuncTimeout = errors.New("function timeout")
ErrSkipped = errors.New("skipped")
ErrExtlink = syscall.Errno(1000)
)
View on GitHub (pinned to c9a67b23e8)
Solutions
- Exclude special files (.stats, .config, .accesslog, etc.) from your source listing
- Check for utils.ErrSkipped with errors.Is and treat it as success/skip rather than failure
- Filter keys through vfs.IsSpecialName before writing
Example fix
// before
err := dst.Put(ctx, key, r)
if err != nil { return err }
// after
err := dst.Put(ctx, key, r)
if errors.Is(err, utils.ErrSkipped) { return nil } // special file, ignore Defensive patterns
Strategy: try-catch
Validate before calling
if vfs.IsSpecialName(key) {
return nil // skip before calling Put/UploadMultipart
} Type guard
func isSkipped(err error) bool { return errors.Is(err, utils.ErrSkipped) } Try / catch
err := dst.Put(ctx, key, r)
if err != nil {
if errors.Is(err, utils.ErrSkipped) {
return nil // special file intentionally skipped
}
return err
} Prevention
- Filter special names (.stats, .config, .accesslog) out of listings before sync
- Compare with errors.Is, not string equality, since it is usually wrapped
- Design copy pipelines to treat skips as success
When it happens
Trigger: Put or CreateMultipartUpload on the JuiceFS storage adapter with a key matching vfs.IsSpecialName (like .stats, .config); the error propagates wrapped as "skip special file %s for jfs".
Common situations: Syncing or writing a whole mounted directory where kernel/vfs special files (control pseudo-files) appear in the listing; sync tools enumerating the FUSE mount root.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06).
Data as JSON: /api/errors/ecb51f0483cd87e1.
Report an issue: GitHub.