hyperledger/fabric · error
list already open, must close list before starting a new one
Error message
list already open, must close list before starting a new one
What it means
JSON lists follow the same discipline as objects: OpenList flips a listOpened flag and writes '['. A second OpenList while a list is still open is rejected, since the writer cannot represent a nested bare list without an entry mechanism and enforces one open list at a time.
Source
Thrown at internal/ledgerutil/jsonrw/json_read_write.go:147
if reflect.TypeOf(v).Kind() == reflect.Slice {
err = w.OpenList()
if err != nil {
return err
}
} else {
err = w.encoder.Encode(v)
if err != nil {
return err
}
}
return nil
}
// Open a json list
func (w *JSONFileWriter) OpenList() error {
if w.listOpened {
return errors.Errorf("list already open, must close list before starting a new one")
}
w.listOpened = true
w.count = 0
_, err := w.buffer.Write([]byte("[\n"))
if err != nil {
return err
}
return nil
}
// Close a json list
func (w *JSONFileWriter) CloseList() error {
if !w.listOpened {
return errors.Errorf("no list open, cannot close list")
}
View on GitHub (pinned to 2736b63f8f)
Solutions
- Call CloseList before starting a new list
- Move OpenList out of loops that write multiple entries
- Close the list before opening an object for the next section
Example fix
// before
w.OpenList()
for _, e := range entries { w.OpenList() }
// after
w.OpenList()
for _, e := range entries { w.AddEntry(e) }
w.CloseList() Defensive patterns
Strategy: validation
Validate before calling
type listTracker struct{ listOpen bool } Type guard
func canOpenList(listOpened bool) bool { return !listOpened } Try / catch
if err := w.OpenList(); err != nil {
return fmt.Errorf("open list: %w", err)
}
defer func() {
if err := w.CloseList(); err != nil { log.Error(err) }
}() Prevention
- Pair every OpenList with one CloseList
- Never call OpenList inside an entry-writing loop
- Track list state locally for nested/sequential sections
- Check return values of OpenList/CloseList
When it happens
Trigger: Calling OpenList twice without CloseList, typically when OpenList sits inside a loop or when an entry loop also calls OpenList per item.
Common situations: Refactored code writing nested lists, or a forgotten CloseList when switching from one list to another in the same file.
Related errors
- object already open, must close object before starting a new
- no object open, cannot close object
- no list open, cannot close list
- no object open, cannot add field
- no list open, cannot add entries
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/da4af1093eb8f36a.
Report an issue: GitHub.