{"record":{"id":"5b3a344458b891be","repo":"hyperledger/fabric","slug":"error-getting-private-data-by-block-number-d","errorCode":null,"errorMessage":"error getting private data by block number %d","messagePattern":"error getting private data by block number (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/peer/deliverevents.go","lineNumber":188,"sourceCode":"\treturn \"block_and_pvtdata\"\n}\n\n// getPrivateData returns private data for the block\nfunc (bprs *blockAndPrivateDataResponseSender) getPrivateData(\n\tblock *common.Block,\n\tchain deliver.Chain,\n\tchannelID string,\n\tsignedData *protoutil.SignedData,\n) (map[uint64]*rwset.TxPvtReadWriteSet, error) {\n\tchannel, ok := chain.(Chain)\n\tif !ok {\n\t\treturn nil, errors.New(\"wrong chain type\")\n\t}\n\n\tpvtData, err := channel.Ledger().GetPvtDataByNum(block.Header.Number, nil)\n\tif err != nil {\n\t\tlogger.Errorf(\"Error getting private data by block number %d on channel %s\", block.Header.Number, channelID)\n\t\treturn nil, errors.Wrapf(err, \"error getting private data by block number %d\", block.Header.Number)\n\t}\n\n\tseqs2Namespaces := aggregatedCollections(make(map[seqAndDataModel]map[string][]*rwset.CollectionPvtReadWriteSet))\n\n\tconfigHistoryRetriever, err := channel.Ledger().GetConfigHistoryRetriever()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tidentityDeserializer, err := bprs.IdentityDeserializerManager.Deserializer(channelID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// check policy for each collection and add the collection if passing the policy requirement\n\tfor _, item := range pvtData {\n\t\tlogger.Debugf(\"Got private data for block number %d, tx sequence %d\", block.Header.Number, item.SeqInBlock)\n\t\tif item.WriteSet == nil {","sourceCodeStart":170,"sourceCodeEnd":206,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/peer/deliverevents.go#L170-L206","documentation":"After obtaining the channel ledger, getPrivateData calls GetPvtDataByNum(blockNum) to retrieve private data for the block. If the ledger returns an error (ledger internal failure, block not yet committed to pvt store, etc.), it is wrapped with this message naming the block number and returned to the deliver client.","triggerScenarios":"SendBlockResponse with reconciliation enabled requesting private data for a block number whose private data is unavailable or whose ledger/pvtdata store errors (e.g., blockNum beyond committed pvt data, corrupted pvt store).","commonSituations":"Requesting pvt data for a very recent block not yet in the private data store; peer's pvtdata store partially purged (BTL expired); ledger database corruption; requesting an old block after pvtdata expiry.","solutions":["Check the wrapped cause (errors.Cause / %v chain) for the underlying ledger error and address it (e.g., corrupted DB → rebuild).","Request pvt data only for blocks within the private-data retention window (BTL not expired).","Retry after the block's private data has been committed if the request raced commit.","Verify peer logs for the accompanying 'Error getting private data by block number' line to identify the channel/block."],"exampleFix":"// before\npvt, err := getPrivateData(block, chain, chID, sd) // may fail for purged data\n// after\npvt, err := getPrivateData(block, chain, chID, sd)\nif err != nil {\n  var cause error\n  if unwrapped := errors.Unwrap(err); unwrapped != nil { cause = unwrapped }\n  log.Printf(\"pvt data unavailable for block %d: %v\", block.Header.Number, cause)\n}","handlingStrategy":"retry","validationCode":"if block.Header != nil && block.Header.Number >= latestCommittedHeight {\n  return errors.New(\"block not committed yet; defer pvt data request\")\n}","typeGuard":null,"tryCatchPattern":"pvt, err := getPrivateData(block, chain, chID, sd)\nif err != nil && strings.Contains(err.Error(), \"error getting private data by block number\") {\n  // inspect errors.Unwrap(err); retry with backoff or trigger reconciliation\n}","preventionTips":["Respect BTL retention windows","Avoid racing pvt data requests against commit","Monitor pvtdata store health"],"tags":["ledger","private-data","deliver","hyperledger-fabric"],"backgroundTag":"pvtdata-retrieval-failed","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"}