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

  1. Call CloseList before Close
  2. Ensure CloseList runs on all paths (including error paths) before Close
  3. Order defers so CloseList executes before Close
  4. 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

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


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