{"record":{"id":"4c1de376d871e641","repo":"hyperledger/fabric","slug":"no-collection-config-update-below-block-sequence-4c1de3","errorCode":null,"errorMessage":"no collection config update below block sequence = %d for chaincode %s is available","messagePattern":"no collection config update below block sequence = (.+?) for chaincode (.+?) is available","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gossip/privdata/reconcile.go","lineNumber":244,"sourceCode":"\t\t\t\tdig2collectionCfg[digKey] = collectionConfigCache[collConfigKey]\n\t\t\t}\n\t\t}\n\t}\n\treturn dig2collectionCfg, minBlock, maxBlock\n}\n\nfunc (r *Reconciler) getMostRecentCollectionConfig(chaincodeName string, collectionName string, blockNum uint64) (*peer.StaticCollectionConfig, error) {\n\tconfigHistoryRetriever, err := r.GetConfigHistoryRetriever()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"configHistoryRetriever is not available\")\n\t}\n\n\tconfigInfo, err := configHistoryRetriever.MostRecentCollectionConfigBelow(blockNum, chaincodeName)\n\tif err != nil {\n\t\treturn nil, errors.New(fmt.Sprintf(\"cannot find recent collection config update below block sequence = %d for chaincode %s\", blockNum, chaincodeName))\n\t}\n\tif configInfo == nil {\n\t\treturn nil, errors.New(fmt.Sprintf(\"no collection config update below block sequence = %d for chaincode %s is available\", blockNum, chaincodeName))\n\t}\n\n\tcollectionConfig := extractCollectionConfig(configInfo.CollectionConfig, collectionName)\n\tif collectionConfig == nil {\n\t\treturn nil, errors.New(fmt.Sprintf(\"no collection config was found for collection %s for chaincode %s\", collectionName, chaincodeName))\n\t}\n\n\tstaticCollectionConfig, wasCastingSuccessful := collectionConfig.Payload.(*peer.CollectionConfig_StaticCollectionConfig)\n\tif !wasCastingSuccessful {\n\t\treturn nil, errors.New(fmt.Sprintf(\"expected collection config of type CollectionConfig_StaticCollectionConfig for collection %s for chaincode %s, while got different config type...\", collectionName, chaincodeName))\n\t}\n\treturn staticCollectionConfig.StaticCollectionConfig, nil\n}\n\nfunc (r *Reconciler) preparePvtDataToCommit(elements []*protosgossip.PvtDataElement) []*ledger.ReconciledPvtdata {\n\trwSetByBlockByKeys := r.groupRwsetByBlock(elements)\n\n\t// populate the private RWSets passed to the ledger","sourceCodeStart":226,"sourceCodeEnd":262,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/gossip/privdata/reconcile.go#L226-L262","documentation":"MostRecentCollectionConfigBelow succeeded but returned a nil configInfo, so the config history service has no collection config update record below the requested block sequence. This is a distinct 'record absent' condition from the errored lookup in [1392].","triggerScenarios":"getMostRecentCollectionConfig (via getDig2CollectionConfig) when configHistoryRetriever.MostRecentCollectionConfigBelow returns (nil, nil) for the given chaincodeName and blockNum.","commonSituations":"Reconciling private data for blocks committed before the chaincode/collection was first defined; a peer whose ledger history index lacks entries for that chaincode (e.g. joined via snapshot that excludes old config history).","solutions":["Ensure the collection config update block is present and below the block being reconciled.","Reconcile only newer blocks, or commit the collection config update again so a record exists below the target block.","Check/rebuild the config history index on the peer.","Verify the chaincode name is spelled exactly as deployed."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"configInfo, err := retriever.MostRecentCollectionConfigBelow(blockNum, chaincodeName)\nif err != nil || configInfo == nil {\n    log.Warningf(\"no collection config below block %d for %s\", blockNum, chaincodeName)\n    return // skip reconciliation for these digs\n}","typeGuard":null,"tryCatchPattern":"if err != nil {\n    if strings.Contains(err.Error(), \"no collection config update below\") {\n        log.Warningf(\"collection config predates block %d; cannot reconcile\", blockNum)\n        return\n    }\n    return err\n}","preventionTips":["Only reconcile blocks at or after the block where the collection was first defined.","Keep config history intact — do not prune/rebuild ledgers without preserving config history.","Re-commit a collection config update (chaincode upgrade) if records are missing.","Confirm block numbers passed to reconciliation fall within the config's validity range."],"tags":["hyperledger-fabric","gossip","collection-config"],"backgroundTag":"collection-config-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"}