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 nil

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Wrap AddEntry calls between OpenList and CloseList
  2. Move AddEntry inside the list-open region
  3. 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

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


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