{"record":{"id":"7ae1f4e78224f0f0","repo":"hyperledger/fabric","slug":"cannot-open-ledger-s-ledger-does-not-exist","errorCode":null,"errorMessage":"cannot open ledger [%s], ledger does not exist","messagePattern":"cannot open ledger \\[(.+?)\\], ledger does not exist","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/ledger/kvledger/kv_ledger_provider.go","lineNumber":327,"sourceCode":"\t\tledger.Close()\n\t}\n\tcleanupErr := p.runCleanup(ledgerID)\n\tif cleanupErr == nil {\n\t\treturn creationErr\n\t}\n\treturn errors.WithMessage(cleanupErr, creationErr.Error())\n}\n\n// Open implements the corresponding method from interface ledger.PeerLedgerProvider\nfunc (p *Provider) Open(ledgerID string) (ledger.PeerLedger, error) {\n\tlogger.Debugf(\"Open() opening kvledger: %s\", ledgerID)\n\t// Check the ID store to ensure that the chainId/ledgerId exists\n\tledgerMetadata, err := p.idStore.getLedgerMetadata(ledgerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif ledgerMetadata == nil {\n\t\treturn nil, errors.Errorf(\"cannot open ledger [%s], ledger does not exist\", ledgerID)\n\t}\n\tif ledgerMetadata.Status != msgs.Status_ACTIVE {\n\t\treturn nil, errors.Errorf(\"cannot open ledger [%s], ledger status is [%s]\", ledgerID, ledgerMetadata.Status)\n\t}\n\n\tbootSnapshotMetadata, err := snapshotMetadataFromProto(ledgerMetadata.BootSnapshotMetadata)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn p.open(ledgerID, bootSnapshotMetadata, false)\n}\n\nfunc (p *Provider) open(ledgerID string, bootSnapshotMetadata *SnapshotMetadata, initializingFromSnapshot bool) (ledger.PeerLedger, error) {\n\t// Get the block store for a chain/ledger\n\tblockStore, err := p.blkStoreProvider.Open(ledgerID)\n\tif err != nil {\n\t\treturn nil, err\n\t}","sourceCodeStart":309,"sourceCodeEnd":345,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/ledger/kvledger/kv_ledger_provider.go#L309-L345","documentation":"OpenWithDir/Open looks up the ledger's metadata record in the idStore (LevelDB). If getLedgerMetadata returns no metadata for the given ledgerID, the provider concludes the ledger/channel was never created (or was fully deleted) on this peer and refuses to open it. This is a lookup miss, not a corruption error — the idStore simply has no entry under the metadata key for that ledger.","triggerScenarios":"Calling ledger.Open(ledgerID) (peer_ledger.Provider.Open) with a ledgerID that has no metadata key in the idStore: the channel was never joined on this peer, the channel was unjoined/deleted, or the idStore DB was reset/replaced while state DBs were not (or vice versa).","commonSituations":"Joining a channel on a peer, then restoring only part of the data (partial backup restore); pointing the peer at a fresh data directory while clients still request old channels; a channel unjoin that completed deletion; mismatched CORE_LEDGER_ROOTDATA path between peer restarts.","solutions":["Verify the ledger exists: list ledgers (peer channel list) or inspect the idStore; if the channel was never joined, join it first before opening.","If data was restored from backup, restore ALL ledger databases (idStore, state, history, pvtdata store, bookkeeping) from the same consistent snapshot.","Confirm CORE_LEDGER_ROOTDATA / filelock path points to the same data directory the ledgers were created in.","If the channel was intentionally deleted, stop attempting to open that ledgerID; re-join the channel if it is needed again."],"exampleFix":"// before: opening a channel never joined on this peer\nprovider, _ := kvledger.NewProvider(...)\nlgr, err := provider.Open(\"mychannel\") // fails: no metadata entry\n\n// after: join the channel first so the ledger is created\n// peer channel join -b mychannel.block\nlgr, err := provider.Open(\"mychannel\") // succeeds once metadata exists in idStore","handlingStrategy":"try-catch","validationCode":"import \"github.com/hyperledger/fabric/core/ledger/kvledger\"\n\nfunc ledgerExists(p *kvledger.Provider, ledgerID string) bool {\n\tids, err := p.List()\n\tif err != nil {\n\t\treturn false\n\t}\n\tfor _, id := range ids {\n\t\tif id == ledgerID {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}","typeGuard":null,"tryCatchPattern":"lgr, err := provider.Open(ledgerID)\nif err != nil && strings.Contains(err.Error(), \"ledger does not exist\") {\n\t// channel not joined on this peer: join it or route the request elsewhere\n\treturn fmt.Errorf(\"ledger %s not present on this peer; join channel first\", ledgerID)\n}\nif err != nil {\n\treturn err\n}","preventionTips":["Check p.List() (or peer channel list) before opening a ledgerID.","When restoring from backup, always restore idStore together with all ledger sub-databases from one snapshot.","Keep the peer's data directory stable across restarts; don't casually change root data paths.","Automate channel-join verification in deployment scripts before serving traffic."],"tags":["ledger","idstore","channel","go"],"backgroundTag":"ledger-not-found","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"}