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        string

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Ensure the ledger is open first: call OpenLedger/Initialize (createOrOpenChains path) for the ledgerID before querying.
  2. Verify the ledger ID matches an existing, open channel.
  3. 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

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


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