hyperledger/fabric · error

provided path %s is empty. Aborting identifytxs

Error message

provided path %s is empty. Aborting identifytxs

What it means

IdentifyTxs refuses to run when the ledger's block store directory (ledgersData under the given filesystem path) is empty. The tool needs existing block files to scan transactions from a snapshot/ledger; an empty store means there is nothing to identify, so it aborts before creating the block store provider.

Source

Thrown at internal/ledgerutil/identifytxs/identifytxs.go:262

	}

	return &compKeyMapWrapper{
		compKeyMap:  inputKeyMap,
		maxBlockNum: maxBlock,
		maxTxNum:    maxTx,
	}, nil
}

// Get a default block store provider to access the peer's block store
func getBlockStoreProvider(fsPath string) (*blkstorage.BlockStoreProvider, error) {
	// Format path to block store
	blockStorePath := kvledger.BlockStorePath(filepath.Join(fsPath, ledgersDataDirName))
	isEmpty, err := fileutil.DirEmpty(blockStorePath)
	if err != nil {
		return nil, err
	}
	if isEmpty {
		return nil, errors.Errorf("provided path %s is empty. Aborting identifytxs", fsPath)
	}
	// Default fields for block store provider
	conf := blkstorage.NewConf(blockStorePath, 0)
	indexConfig := &blkstorage.IndexConfig{
		AttrsToIndex: []blkstorage.IndexableAttr{
			blkstorage.IndexableAttrBlockNum,
			blkstorage.IndexableAttrBlockHash,
			blkstorage.IndexableAttrTxID,
			blkstorage.IndexableAttrBlockNumTranNum,
		},
	}
	metricsProvider := &disabled.Provider{}
	// Create new block store provider
	blockStoreProvider, err := blkstorage.NewProvider(conf, indexConfig, metricsProvider)
	if err != nil {
		return nil, err
	}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Verify fsPath points at the directory containing ledgersData with actual block files (blockfile_000000, etc.)
  2. Copy/restore the complete ledger or snapshot data before rerunning the command
  3. If the ledger is genuinely empty there are no transactions to identify; skip the tool
  4. Check disk/permissions to confirm the data was actually restored where you expect it

Example fix

// before
IdentifyTxs(ctx, "/var/hyperledger/production/empty-copy", ...)
// after
IdentifyTxs(ctx, "/var/hyperledger/production", ...) // path containing ledgersData/ with block files
Defensive patterns

Strategy: validation

Validate before calling

import os, filepath

func blockStoreHasData(fsPath string) (bool, error) {
	bsPath := filepath.Join(fsPath, "ledgersData")
	entries, err := os.ReadDir(bsPath)
	if os.IsNotExist(err) {
		return false, nil
	}
	if err != nil {
		return false, err
	}
	return len(entries) > 0, nil
}

Type guard

func hasLedgerData(fsPath string) bool {
	info, err := os.Stat(filepath.Join(fsPath, "ledgersData"))
	return err == nil && info.IsDir()
}

Try / catch

if empty, err := blockStoreHasData(fsPath); err != nil || !empty {
	return fmt.Errorf("no ledger data at %s: cannot run identifytxs", fsPath)
}
records, err := identifytxs.IdentifyTxs(ctx, fsPath, ...)

Prevention

When it happens

Trigger: Calling IdentifyTxs with an fsPath whose <fsPath>/ledgersData block store directory exists but contains no files, e.g. pointing at a freshly created, empty, or incompletely copied ledger data directory.

Common situations: Pointing the tool at the wrong root (a parent directory instead of the ledger data dir), a snapshot copy that was interrupted or is still in progress, or a wiped/re-initialized node directory.

Related errors


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