juicedata/juicefs · critical
object storage: %s
Error message
object storage: %s
What it means
After loading the volume format, newJFS calls NewReloadableStorage(format, metaCli, nil) to construct the underlying object storage named in the volume settings; failure is wrapped as 'object storage: %s'. This typically means the configured bucket cannot be reached or authenticated, or the storage URL is invalid.
Source
Thrown at cmd/object.go:522
if runtime.GOOS == "windows" && utils.IsWinAdminOrElevatedPrivilege() {
uid = 0
gid = 0
}
metaUrl := os.Getenv(endpoint)
if metaUrl == "" {
metaUrl = endpoint
}
metaConf := meta.DefaultConf()
metaConf.MaxDeletes = 10
metaConf.NoBGJob = true
metaCli := meta.NewClient(metaUrl, metaConf)
format, err := metaCli.Load(true)
if err != nil {
return nil, fmt.Errorf("load setting: %s", err)
}
blob, err := NewReloadableStorage(format, metaCli, nil)
if err != nil {
return nil, fmt.Errorf("object storage: %s", err)
}
chunkConf := getDefaultChunkConf(format)
store := chunk.NewCachedStore(blob, *chunkConf, nil)
registerMetaMsg(metaCli, store, chunkConf)
err = metaCli.NewSession(false)
if err != nil {
return nil, fmt.Errorf("new session: %s", err)
}
metaCli.OnReload(func(fmt *meta.Format) {
store.UpdateLimit(fmt.UploadLimit, fmt.DownloadLimit)
})
vfsConf := &vfs.Config{
Meta: metaConf,
Format: *format,
Version: version.Version(),
Chunk: chunkConf,
AttrTimeout: time.Second,View on GitHub (pinned to c9a67b23e8)
Solutions
- Check the wrapped error for the provider cause (NoSuchBucket, AccessDenied, DNS failure).
- Verify credentials/env vars (AWS_ACCESS_KEY_ID, etc.) on the host running the command.
- Run `juicefs status <meta-url>` to see the configured storage URL and test access to that bucket.
- If the bucket moved, update the volume setting (`juicefs config`/re-format) or restore access to the original bucket.
Example fix
// before $ juicefs gateway jfs://redis://host/1 /mnt // object storage: Bucket not found // after: fix storage config or credentials $ export AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... $ juicefs gateway redis://host/1 /mnt
Defensive patterns
Strategy: validation
Validate before calling
// before newJFS, check the bucket is reachable with current credentials $ juicefs status <meta-url> // shows configured storage URL $ aws s3 ls s3://<bucket>/ // verifies access
Try / catch
blob, err := NewReloadableStorage(format, metaCli, nil)
if err != nil {
return nil, fmt.Errorf("object storage: %s", err)
} Prevention
- Provision cloud credentials in the environment before starting gateway/sync.
- Verify the bucket in the volume format still exists and is in the right region.
- Test storage reachability from the host (DNS, egress firewall).
- Update volume settings with `juicefs config` if the bucket changed.
When it happens
Trigger: NewReloadableStorage fails during newJFS: invalid object storage URL in the volume format, missing cloud-provider credentials (env vars), storage endpoint unreachable, unsupported storage type string.
Common situations: Bucket deleted or renamed after formatting the volume; AWS/GCS/OSS credentials not present in the environment; region changed; offline/blocked endpoint when running gateway/sync against jfs:// target.
Related errors
- format decrypt: %s
- Invalid endpoint: %v, error: %v
- create B2 client: %s
- Fail to get location of bucket %q: %s
- invalid endpoint %s: %s
AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06).
Data as JSON: /api/errors/b7832c3d121c915b.
Report an issue: GitHub.