juicedata/juicefs · error

open %s: %s

Error message

open %s: %s

What it means

Returned by produceFromList in `juicefs sync` when the --files-from list file cannot be opened. The wrapped error is the os.Open failure — missing file or unreadable path — so the object list to copy cannot be read.

Source

Thrown at pkg/sync/sync.go:1867

	logger.Debugf("Restore prefix %q from checkpoint, restoreObjs: %d, listDone: %v", prefix, len(objs), listDone)
	for _, obj := range objs {
		incrTotal(1)
		tasks <- obj
	}

	if !listDone {
		if err := startProducer(tasks, src, dst, prefix, listDepth, config, checkpointMgr); err != nil {
			logger.Errorf("Failed to restart producer for prefix %s: %v", prefix, err)
			failed.Increment()
		}
	}
	return true
}

func produceFromList(tasks chan<- object.Object, src, dst object.ObjectStorage, config *Config, checkpointMgr *CheckpointManager) error {
	f, err := os.Open(config.FilesFrom)
	if err != nil {
		return fmt.Errorf("open %s: %s", config.FilesFrom, err)
	}
	defer f.Close()

	prefixs := make(chan string, config.Threads)
	var wg sync.WaitGroup
	wg.Add(config.Threads)
	for i := 0; i < config.Threads; i++ {
		go func() {
			defer wg.Done()
			for key := range prefixs {
				if !strings.HasSuffix(key, "/") {
					if err := produceSingleObject(tasks, src, dst, key, config, checkpointMgr); err == nil {
						listedPrefix.Increment()
						continue
					} else if errors.Is(err, errDirSuffix) {
						key += "/"
					} else if os.IsNotExist(err) {
						atomic.AddInt64(&ignoreFiles, 1)

View on GitHub (pinned to c9a67b23e8)

Solutions

  1. Check the --files-from path exists and is readable
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at pkg/sync/sync.go:1867 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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