{"record":{"id":"3472868c6c5956c1","repo":"hyperledger/fabric","slug":"no-object-open-cannot-close-object","errorCode":null,"errorMessage":"no object open, cannot close object","messagePattern":"no object open, cannot close object","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/ledgerutil/jsonrw/json_read_write.go","lineNumber":93,"sourceCode":"// Open a json object\nfunc (w *JSONFileWriter) OpenObject() error {\n\tif w.objectOpened {\n\t\treturn errors.Errorf(\"object already open, must close object before starting a new one\")\n\t}\n\n\tw.objectOpened = true\n\t_, err := w.buffer.Write([]byte(\"{\\n\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Close a json object\nfunc (w *JSONFileWriter) CloseObject() error {\n\tif !w.objectOpened {\n\t\treturn errors.Errorf(\"no object open, cannot close object\")\n\t}\n\n\t_, err := w.buffer.Write([]byte(\"}\\n\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tw.objectOpened = false\n\tw.firstFieldWritten = false\n\n\treturn nil\n}\n\n// Add field to an open json object\nfunc (w *JSONFileWriter) AddField(k string, v any) error {\n\t// Need to open object before adding fields\n\tif !w.objectOpened {\n\t\treturn errors.Errorf(\"no object open, cannot add field\")","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/ledgerutil/jsonrw/json_read_write.go#L75-L111","documentation":"API-misuse guard on JSONFileWriter.CloseObject: CloseObject was called when no object is open (objectOpened is false, either never opened or already closed). This is a client-side state-machine error, not an I/O failure.","triggerScenarios":"Calling CloseObject on a fresh writer, after the object was already closed, or after an OpenObject call failed with an error.","commonSituations":"Unbalanced open/close calls in error-handling paths, duplicated cleanup code, or ignoring the error from OpenObject and proceeding anyway.","solutions":["Balance every OpenObject with exactly one CloseObject","Only call CloseObject if OpenObject returned nil","Track whether the object was opened in a local bool before cleanup code"],"exampleFix":"// before\nw.OpenObject()\nw.CloseObject()\nw.CloseObject() // second call errors\n// after\nw.OpenObject()\nw.CloseObject()","handlingStrategy":"validation","validationCode":"if objectWasOpened && !objectWasClosed {\n\tif err := w.CloseObject(); err != nil { return err }\n}","typeGuard":"func objectNeedsClose(opened, closed bool) bool { return opened && !closed }","tryCatchPattern":"if err := w.CloseObject(); err != nil {\n\treturn fmt.Errorf(\"close object: %w\", err)\n}","preventionTips":["Only call CloseObject after a successful OpenObject","Use defer so close happens exactly once per open","Avoid duplicating close logic in both normal and error paths"],"tags":["hyperledger-fabric","json","state-machine","api-misuse"],"backgroundTag":"json-writer-no-object-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"}