hyperledger/fabric · error

error closing temp file '%s'

Error message

error closing temp file '%s'

What it means

After writing data, WriteFile explicitly closes the temp file before renaming. A close failure can indicate buffered data failed to flush to disk, so the operation aborts with this wrapped error rather than renaming an incompletely persisted file.

Source

Thrown at core/chaincode/persistence/persistence.go:65

	}
	tmpFile, err := os.CreateTemp(path, ".ccpackage.")
	if err != nil {
		return errors.Wrapf(err, "error creating temp file in directory '%s'", path)
	}
	defer os.Remove(tmpFile.Name())

	if n, err := tmpFile.Write(data); err != nil || n != len(data) {
		if err == nil {
			err = errors.Errorf(
				"failed to write the entire content of the file, expected %d, wrote %d",
				len(data), n,
			)
		}
		return errors.Wrapf(err, "error writing to temp file '%s'", tmpFile.Name())
	}

	if err := tmpFile.Close(); err != nil {
		return errors.Wrapf(err, "error closing temp file '%s'", tmpFile.Name())
	}

	if err := os.Rename(tmpFile.Name(), filepath.Join(path, name)); err != nil {
		return errors.Wrapf(err, "error renaming temp file '%s'", tmpFile.Name())
	}

	return nil
}

// Remove removes a file from the filesystem - used for rolling back an in-flight
// Save operation upon a failure
func (f *FilesystemIO) Remove(name string) error {
	return os.Remove(name)
}

// ReadFile reads a file from the filesystem
func (f *FilesystemIO) ReadFile(filename string) ([]byte, error) {
	return os.ReadFile(filename)

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Check and free disk space on the volume holding the package directory
  2. Check the peer process's open file descriptor limit (ulimit -n) and raise if EMFILE
  3. Inspect the wrapped OS error for the exact close failure and address storage-level issues, then retry
Defensive patterns

Strategy: retry

Validate before calling

if err := ensureDiskSpace(path, uint64(len(data))+1<<20); err != nil { return err }
if err := checkFdLimit(); err != nil { return err }

Try / catch

if err := io.WriteFile(path, name, data); err != nil {
    var perr *os.PathError
    if errors.As(err, &perr) && (errors.Is(perr.Err, syscall.ENOSPC) || errors.Is(perr.Err, syscall.EMFILE)) {
        // free space / raise ulimit, then retry
    }
    return err
}

Prevention

When it happens

Trigger: tmpFile.Close() returns an error — typically ENOSPC when flushing buffered writes at close, or an I/O error on the underlying file descriptor.

Common situations: Disk filling up between the write and the close; NFS/network storage transient errors; file descriptor exhaustion affecting the peer process (EMFILE).

Related errors


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/62509b651bf12503. Report an issue: GitHub.