flipped-aurora/gin-vue-admin · error

创建临时文件失败: %w

Error message

创建临时文件失败: %w

What it means

After ensuring the target directory exists, replaceAutoCodeFileAtomically creates a unique temp file (pattern .autocode-*) in that directory. If os.CreateTemp fails — usually due to directory write permission, no free inodes/space, or the directory disappearing — this error wraps the failure. The deferred os.Remove keeps failed temp files from lingering.

Source

Thrown at server/service/system/auto_code_task.go:269

func joinAutoCodeRollbackError(cause, rollbackErr error) error {
	if rollbackErr == nil {
		return cause
	}
	return errors.Join(cause, fmt.Errorf("回滚自动代码文件失败: %w", rollbackErr))
}

func replaceAutoCodeFileAtomically(target string, content []byte, mode fs.FileMode) error {
	if mode == 0 {
		mode = 0o666
	}
	dir := filepath.Dir(target)
	if err := os.MkdirAll(dir, 0o755); err != nil {
		return fmt.Errorf("创建目标目录 %s 失败: %w", dir, err)
	}
	tmp, err := os.CreateTemp(dir, ".autocode-*")
	if err != nil {
		return fmt.Errorf("创建临时文件失败: %w", err)
	}
	tmpName := tmp.Name()
	defer os.Remove(tmpName)
	if _, err = tmp.Write(content); err == nil {
		err = tmp.Sync()
	}
	if closeErr := tmp.Close(); err == nil {
		err = closeErr
	}
	if err != nil {
		return fmt.Errorf("写入临时文件失败: %w", err)
	}
	if err = os.Chmod(tmpName, mode.Perm()); err != nil {
		return fmt.Errorf("设置临时文件权限失败: %w", err)
	}
	if err = os.Rename(tmpName, target); err != nil {
		return fmt.Errorf("原子替换 %s 失败: %w", target, err)
	}

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Check the wrapped syscall errno and grant write access to the directory for the server process
  2. Verify disk space and inode availability (df -h / df -i)
  3. Raise the process fd limit (ulimit -n) if EMFILE occurs during large generation batches
  4. Ensure nothing (cleanup jobs, antivirus quarantine) removes the directory concurrently

Example fix

// before
$ sudo -u www-data test -w server/api/v1 && echo ok || echo no
no
// after
sudo chown -R www-data:www-data server web
Defensive patterns

Strategy: retry

Validate before calling

dir := filepath.Dir(targetPath)
if err := unix.Access(dir, unix.W_OK); err != nil {
    return fmt.Errorf("no temp-file create permission in %s", dir)
}
if err := checkDiskSpace(dir, 10*1024*1024); err != nil {
    return err
}

Try / catch

err := commitAutoCodeFileTask(task, publish, persist)
if err != nil && strings.Contains(err.Error(), "创建临时文件失败") {
    var p *os.PathError
    if errors.As(err, &p) && errors.Is(p.Err, syscall.EMFILE) {
        // raise ulimit -n and retry
    }
}

Prevention

When it happens

Trigger: os.CreateTemp(dir, ".autocode-*") returns an error: EACCES on the directory, ENOSPC, EMFILE/ENFILE (fd or inode exhaustion), or read-only mount. Raised from prepareAutoCodeFileTask staging writes and rollback restores.

Common situations: Service running as a user without write access to the project directory, ulimit -n too low under heavy parallel generation, full disk, or the directory was deleted between MkdirAll and CreateTemp by an external cleaner.

Related errors


AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31). Data as JSON: /api/errors/69f3baaa20f27256. Report an issue: GitHub.