hyperledger/fabric · error
list still open, must close list before closing jsonFileWrit
Error message
list still open, must close list before closing jsonFileWriter
What it means
Close flushes the buffer and writes the file, but only after the JSON structure is complete. If a list is still open (listOpened true) the document is missing its closing ']', so Close aborts with this error instead of writing a truncated file.
Source
Thrown at internal/ledgerutil/jsonrw/json_read_write.go:202
if err != nil {
return err
}
} else {
w.firstEntryWritten = true
}
err := w.encoder.Encode(r)
if err != nil {
return err
}
w.count++
return nil
}
func (w *JSONFileWriter) Close() error {
if w.listOpened {
return errors.Errorf("list still open, must close list before closing jsonFileWriter")
}
err := w.buffer.Flush()
if err != nil {
return err
}
err = w.file.Sync()
if err != nil {
return err
}
err = fileutil.SyncParentDir(w.file.Name())
if err != nil {
return err
}
return w.file.Close()View on GitHub (pinned to 2736b63f8f)
Solutions
- Call CloseList before Close
- Ensure CloseList runs on all paths (including error paths) before Close
- Order defers so CloseList executes before Close
- Close objects and lists explicitly in helpers rather than relying on Close to clean up
Example fix
// before w.OpenList() w.AddEntry(1) w.Close() // errors: list still open // after w.OpenList() w.AddEntry(1) w.CloseList() w.Close()
Defensive patterns
Strategy: try-catch
Validate before calling
if listStillOpen { return errors.New("close the list before calling Close") } Type guard
func safeToClose(listOpened bool) bool { return !listOpened } Try / catch
if err := w.CloseList(); err != nil {
return fmt.Errorf("close list: %w", err)
}
if err := w.Close(); err != nil {
return fmt.Errorf("close writer: %w", err)
} Prevention
- Call CloseList before Close on every code path, including early returns
- Order defers so CloseList runs before Close (defers run LIFO)
- Centralize writer teardown in one helper function
- Handle entry-loop errors before attempting Close
When it happens
Trigger: Calling Close while a list remains open — a CloseList call was skipped on some code path, or an entry loop exited before CloseList ran.
Common situations: Early returns or error paths inside entry-writing loops that skip CloseList, defers registered in the wrong order, or a forgotten close at the end of a writer helper like the close() function.
Related errors
- object already open, must close object before starting a new
- no object open, cannot close object
- list already open, must close list before starting a new one
- no list open, cannot close list
- error decoding input
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/89da371d421286c8.
Report an issue: GitHub.