{"record":{"id":"47da41b25461a3ab","repo":"hyperledger/fabric","slug":"already-at-height-of-d","errorCode":null,"errorMessage":"already at height of %d","messagePattern":"already at height of (.+?)","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"info","filePath":"orderer/consensus/smartbft/synchronizer.go","lineNumber":108,"sourceCode":"\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"cannot get HeightsByEndpoints\")\n\t}\n\n\ts.Logger.Infof(\"HeightsByEndpoints: %v\", heightByEndpoint)\n\n\tif len(heightByEndpoint) == 0 {\n\t\treturn nil, errors.New(\"no cluster members to synchronize with\")\n\t}\n\n\tvar heights []uint64\n\tfor _, value := range heightByEndpoint {\n\t\theights = append(heights, value)\n\t}\n\n\ttargetHeight := s.computeTargetHeight(heights)\n\tstartHeight := s.Support.Height()\n\tif startHeight >= targetHeight {\n\t\treturn nil, errors.Errorf(\"already at height of %d\", targetHeight)\n\t}\n\n\ttargetSeq := targetHeight - 1\n\tseq := startHeight\n\n\tvar blocksFetched int\n\n\ts.Logger.Debugf(\"Will fetch sequences [%d-%d]\", seq, targetSeq)\n\n\tvar lastPulledBlock *cb.Block\n\tfor seq <= targetSeq {\n\t\tblock := blockPuller.PullBlock(seq)\n\t\tif block == nil {\n\t\t\ts.Logger.Debugf(\"Failed to fetch block [%d] from cluster\", seq)\n\t\t\tbreak\n\t\t}\n\t\tif protoutil.IsConfigBlock(block) {\n\t\t\ts.Support.WriteConfigBlock(block, nil)","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/synchronizer.go#L90-L126","documentation":"Raised in Synchronizer.synchronize when the local ledger height (startHeight) is already greater than or equal to the computed target height derived from remote peers' heights. This is not a fault: it means the node has nothing to replicate — it is as up-to-date as (or ahead of) the cluster members it probed. Sync then falls back to serving state from the local ledger.","triggerScenarios":"Synchronizer.Sync -> synchronize runs, HeightsByEndpoint probing succeeds, computeTargetHeight(heights) <= s.Support.Height(). Happens when this orderer is already caught up, when remote peers are lagging/behind (making targetHeight lower), or when computeTargetHeight picks a low height (e.g. f+1-th highest height with few reachable peers).","commonSituations":"Healthy caught-up orderer whose node still calls Sync (benign, logged as a warning); most cluster members are offline so the probe only sees laggard peers; after restoring from backup this node is ahead of the live cluster; asymmetry after network partition heals.","solutions":["If the node is healthy this is expected — verify the local ledger height matches the cluster and ignore","Check why remote peers report low heights: are most cluster members down? Bring up a quorum","If this node is erroneously ahead (restored backup), reconcile with the actual cluster ledger; do NOT truncate the ledger manually without operator procedures","Ensure enough endpoints are reachable so computeTargetHeight sees the true maximum cluster height"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"// Compare local height to remote heights before triggering sync\nlocalHeight := support.Height()\nremoteHeights := probeHeights(consenters) // via Deliver service\nif maxOf(remoteHeights) <= localHeight {\n    // node is already caught up; skip synchronization entirely\n}","typeGuard":null,"tryCatchPattern":"// Treat 'already at height' as success: check result height instead of error\nresp := synchronizer.Sync()\nif resp.Latest.Height >= expectedHeight {\n    // healthy caught-up state; no action needed\n}","preventionTips":["Treat this error as benign info, not a fault, in monitoring/alerting","Ensure a quorum of up-to-date peers is online so targetHeight reflects the true cluster height","Avoid restoring ledgers from backups newer than the live cluster","Log and compare local vs remote heights routinely"],"tags":["consensus","smartbft","fabric","ledger"],"backgroundTag":"already-caught-up","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"}