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
- Ensure the parent of dest exists and is writable by the running user.
- Remove or rename any regular file currently occupying dest.
- Choose a destination on a writable volume (e.g. $TMPDIR).
- 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
- Choose extraction destinations on writable volumes, not read-only system paths.
- Ensure the worker user owns or can write the parent directory.
- Don't let a regular file occupy the destination path.
- In containers, mount a writable volume for jar caching.
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
- error accesing path
- error in creating jar
- error opening file
- can't change to old working directory
- can't change to temp directory
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)