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

  1. Check the wrapped error for the provider cause (NoSuchBucket, AccessDenied, DNS failure).
  2. Verify credentials/env vars (AWS_ACCESS_KEY_ID, etc.) on the host running the command.
  3. Run `juicefs status <meta-url>` to see the configured storage URL and test access to that bucket.
  4. 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

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


AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06). Data as JSON: /api/errors/b7832c3d121c915b. Report an issue: GitHub.