hyperledger/fabric · error
no list open, cannot add entries
Error message
no list open, cannot add entries
What it means
API-misuse guard on JSONFileWriter.AddEntry: entries can only be appended to a list previously opened with OpenList; the call arrived while listOpened is false, so the entry would produce invalid JSON and is rejected.
Source
Thrown at internal/ledgerutil/jsonrw/json_read_write.go:179
func (w *JSONFileWriter) CloseList() error {
if !w.listOpened {
return errors.Errorf("no list open, cannot close list")
}
w.listOpened = false
_, err := w.buffer.Write([]byte("]\n"))
if err != nil {
return err
}
return nil
}
// Add entries to an open json list
func (w *JSONFileWriter) AddEntry(r any) error {
// Need to open list before adding entries
if !w.listOpened {
return errors.Errorf("no list open, cannot add entries")
}
// Add commas for entries after the first entry in the list
if w.firstEntryWritten {
_, err := w.buffer.Write([]byte(",\n"))
if err != nil {
return err
}
} else {
w.firstEntryWritten = true
}
err := w.encoder.Encode(r)
if err != nil {
return err
}
w.count++
return nilView on GitHub (pinned to 2736b63f8f)
Solutions
- Wrap AddEntry calls between OpenList and CloseList
- Move AddEntry inside the list-open region
- For top-level arrays, open one list for the whole file before adding entries
Example fix
// before
w.AddEntry("a") // errors: no list open
// after
w.OpenList()
w.AddEntry("a")
w.CloseList() Defensive patterns
Strategy: validation
Validate before calling
func requireListOpen(listOpened bool) error {
if !listOpened { return errors.New("AddEntry requires an open list: call OpenList first") }
return nil
} Type guard
func canAddEntry(listOpened bool) bool { return listOpened } Try / catch
if err := w.OpenList(); err != nil { return err }
if err := w.AddEntry(item); err != nil { return err }
if err := w.CloseList(); err != nil { return err } Prevention
- Open the list before the entry loop, close it after
- Never write entries at the file's top level without a wrapping list
- Check AddEntry errors so a failed write doesn't desync state
When it happens
Trigger: Calling AddEntry before OpenList or after CloseList has closed the current list.
Common situations: Writing entries at the file's top level without wrapping them in a list, or continuing to add entries in a loop after the list was closed.
Related errors
- object already open, must close object before starting a new
- no object open, cannot close object
- no object open, cannot add field
- list already open, must close list before starting a new one
- no list open, cannot close list
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/22c1abad0f8700a6.
Report an issue: GitHub.