hyperledger/fabric · error
Ledger not opened [%s]
Error message
Ledger not opened [%s]
What it means
getOpenedLedger looks up the ledgerID in the manager's in-memory openedLedgers map; when the ledger has never been opened or has since been closed, it returns this error instead of opening it on demand. Callers such as GetDeployedChaincodeInfo require the ledger to already be open.
Source
Thrown at core/ledger/ledgermgmt/ledger_mgmt.go:261
// Close closes all the opened ledgers and any resources held for ledger management
func (m *LedgerMgr) Close() {
logger.Infof("Closing ledger mgmt")
m.lock.Lock()
defer m.lock.Unlock()
for _, l := range m.openedLedgers {
l.Close()
}
m.ledgerProvider.Close()
m.openedLedgers = nil
logger.Infof("ledger mgmt closed")
}
func (m *LedgerMgr) getOpenedLedger(ledgerID string) (ledger.PeerLedger, error) {
m.lock.Lock()
defer m.lock.Unlock()
l, ok := m.openedLedgers[ledgerID]
if !ok {
return nil, errors.Errorf("Ledger not opened [%s]", ledgerID)
}
return l, nil
}
func (m *LedgerMgr) closeLedger(ledgerID string) {
m.lock.Lock()
defer m.lock.Unlock()
l, ok := m.openedLedgers[ledgerID]
if ok {
l.Close()
delete(m.openedLedgers, ledgerID)
}
}
// closableLedger extends from actual validated ledger and overwrites the Close method
type closableLedger struct {
ledgerMgr *LedgerMgr
id stringView on GitHub (pinned to 2736b63f8f)
Solutions
- Ensure the ledger is open first: call OpenLedger/Initialize (createOrOpenChains path) for the ledgerID before querying.
- Verify the ledger ID matches an existing, open channel.
- Handle the error by opening the ledger and retrying the operation.
Example fix
// before
lgr, err := mgr.GetDeployedChaincodeInfo(ledgerID, ccName)
// after
lgr, err := mgr.OpenLedger(ledgerID)
if err != nil { return err }
info, err := mgr.GetDeployedChaincodeInfo(ledgerID, ccName) Defensive patterns
Strategy: fallback
Validate before calling
if _, opened := openedLedgerIDs[ledgerID]; !opened {
if err := mgr.OpenLedger(ledgerID); err != nil { return err }
} Try / catch
info, err := mgr.GetDeployedChaincodeInfo(ledgerID, cc)
if err != nil && strings.Contains(err.Error(), "Ledger not opened") {
if _, oerr := mgr.OpenLedger(ledgerID); oerr != nil { return oerr }
info, err = mgr.GetDeployedChaincodeInfo(ledgerID, cc)
} Prevention
- Open ledgers during startup (createOrOpenChains) before serving queries.
- Validate ledger IDs against the list of joined channels.
- Hold a reference to the opened ledger instead of relying on it staying cached.
When it happens
Trigger: Calling GetDeployedChaincodeInfo (or any path through getOpenedLedger) with a ledgerID whose ledger was closed (CloseLedger) or was never opened in this manager instance.
Common situations: Chaincode/lifecycle queries against a channel whose ledger was closed due to inactivity or shutdown; querying a channel ID with a typo; a query racing with ledger close during peer maintenance.
Related errors
- not found
- unexpected end of blockfile
- error opening block file %s
- error seeking block file [%s] to startOffset [%d]
- Could not seek block file [%s] to startOffset [%d]. New posi
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/3b0f263ddf00682c.
Report an issue: GitHub.