{"record":{"id":"89da371d421286c8","repo":"hyperledger/fabric","slug":"list-still-open-must-close-list-before-closing-js","errorCode":null,"errorMessage":"list still open, must close list before closing jsonFileWriter","messagePattern":"list still open, must close list before closing jsonFileWriter","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/ledgerutil/jsonrw/json_read_write.go","lineNumber":202,"sourceCode":"\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tw.firstEntryWritten = true\n\t}\n\n\terr := w.encoder.Encode(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\tw.count++\n\n\treturn nil\n}\n\nfunc (w *JSONFileWriter) Close() error {\n\tif w.listOpened {\n\t\treturn errors.Errorf(\"list still open, must close list before closing jsonFileWriter\")\n\t}\n\n\terr := w.buffer.Flush()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = w.file.Sync()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = fileutil.SyncParentDir(w.file.Name())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn w.file.Close()","sourceCodeStart":184,"sourceCodeEnd":220,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/ledgerutil/jsonrw/json_read_write.go#L184-L220","documentation":"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.","triggerScenarios":"Calling Close while a list remains open — a CloseList call was skipped on some code path, or an entry loop exited before CloseList ran.","commonSituations":"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.","solutions":["Call CloseList before Close","Ensure CloseList runs on all paths (including error paths) before Close","Order defers so CloseList executes before Close","Close objects and lists explicitly in helpers rather than relying on Close to clean up"],"exampleFix":"// before\nw.OpenList()\nw.AddEntry(1)\nw.Close() // errors: list still open\n// after\nw.OpenList()\nw.AddEntry(1)\nw.CloseList()\nw.Close()","handlingStrategy":"try-catch","validationCode":"if listStillOpen { return errors.New(\"close the list before calling Close\") }","typeGuard":"func safeToClose(listOpened bool) bool { return !listOpened }","tryCatchPattern":"if err := w.CloseList(); err != nil {\n\treturn fmt.Errorf(\"close list: %w\", err)\n}\nif err := w.Close(); err != nil {\n\treturn fmt.Errorf(\"close writer: %w\", err)\n}","preventionTips":["Call CloseList before Close on every code path, including early returns","Order defers so CloseList runs before Close (defers run LIFO)","Centralize writer teardown in one helper function","Handle entry-loop errors before attempting Close"],"tags":["hyperledger-fabric","json","state-machine","resource-leak"],"backgroundTag":"json-writer-list-still-open","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}