apache/beam · error

error creating directory

Error message

error creating directory %s in extractJar(%s,%s): %w

What it means

extractJar creates the destination directory tree with os.MkdirAll(dest, 0700) before writing entries. This error wraps that failure, meaning the extraction destination could not be created — typically a permission problem on a parent directory, or a non-directory file already existing at the path.

Solutions

  1. Ensure the parent of dest exists and is writable by the running user.
  2. Remove or rename any regular file currently occupying dest.
  3. Choose a destination on a writable volume (e.g. $TMPDIR).
  4. Inspect the wrapped %w cause for the exact OS error (EACCES, EROFS, ENOTDIR).

Example fix

// before
err := expansionx.MakeJar(ctx, url, "/opt/beam/jars") // not writable
// after
err := expansionx.MakeJar(ctx, url, filepath.Join(os.TempDir(), "beam-jars"))
Defensive patterns

Strategy: validation

Validate before calling

if fi, err := os.Stat(dest); err == nil && !fi.IsDir() {
    return fmt.Errorf("%s exists and is not a directory", dest)
}
if err := os.MkdirAll(dest, 0700); err != nil {
    return fmt.Errorf("cannot pre-create extraction dir %s: %w", dest, err)
}

Try / catch

err := expansionx.MakeJar(ctx, url, dest)
if err != nil {
    var pe *fs.PathError
    if errors.As(err, &pe) && (errors.Is(pe.Err, fs.ErrPermission) || errors.Is(pe.Err, syscall.EROFS)) {
        dest = filepath.Join(os.TempDir(), "beam-jars")
        return expansionx.MakeJar(ctx, url, dest)
    }
    return err
}

Prevention

When it happens

Trigger: os.MkdirAll(dest, 0700) returns non-nil inside extractJar: parent directory not writable, dest exists as a regular file, or read-only filesystem.

Common situations: Running the Go worker in a container with a read-only root filesystem; dest collides with an existing file; extracting into a system directory as an unprivileged user.

Understand the failure class

Background: mkdir permission denied (EACCES): failed to create directory errors explained — this error's family across 32 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/8b9f691ccaddf271. Report an issue: GitHub.

Appendix: source

Thrown at sdks/go/pkg/beam/core/runtime/xlangx/expansionx/download.go:161

	destPath := filepath.Join(dest, filename)
	cleanDest := filepath.Clean(dest)
	cleanPath := filepath.Clean(destPath)

	rel, err := filepath.Rel(cleanDest, cleanPath)
	if err != nil || strings.HasPrefix(rel, ".."+string(filepath.Separator)) || rel == ".." {
		return "", fmt.Errorf("file path %q is outside destination directory %q", filename, dest)
	}
	return cleanPath, nil
}

func extractJar(source, dest string) error {
	reader, err := zip.OpenReader(source)
	if err != nil {
		return fmt.Errorf("error opening jar for extractJar(%s,%s): %w", source, dest, err)
	}

	if err := os.MkdirAll(dest, 0700); err != nil {
		return fmt.Errorf("error creating directory %s in extractJar(%s,%s): %w", dest, source, dest, err)
	}

	for _, file := range reader.File {
		fileName, err := validatePath(dest, file.Name)
		if err != nil {
			return fmt.Errorf("error validating file path (%s, %s): %w", dest, file.Name, err)
		}
		if file.FileInfo().IsDir() {
			os.MkdirAll(fileName, 0700)
			continue
		}

		sf, err := file.Open()
		if err != nil {
			return fmt.Errorf("error opening source file %s: %w", file.Name, err)
		}
		defer sf.Close()

View on GitHub (pinned to 12126d8942)