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

  1. Call CloseList before starting a new list
  2. Move OpenList out of loops that write multiple entries
  3. 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

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


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