Skip to content

Commit 5ad9463

Browse files
committed
[FAB-3525] Fix config block retrieval
Upon startup peer was scanning all blocks for each channel's config block. This was extremely inefficient for large chains. This change navigates directly to the config block based on the last block's metadata which has a pointer to the last config block. Change-Id: Ia570f4d64df135e99a24a4206006bb969c7e4476 Signed-off-by: David Enyeart <[email protected]>
1 parent 132817b commit 5ad9463

File tree

2 files changed

+29
-36
lines changed

2 files changed

+29
-36
lines changed

core/peer/peer.go

+25-35
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package peer
1919
import (
2020
"errors"
2121
"fmt"
22-
"math"
2322
"net"
2423
"sync"
2524

@@ -145,41 +144,32 @@ func InitChain(cid string) {
145144
}
146145

147146
func getCurrConfigBlockFromLedger(ledger ledger.PeerLedger) (*common.Block, error) {
148-
// Config blocks contain only 1 transaction, so we look for 1-tx
149-
// blocks and check the transaction type
150-
var envelope *common.Envelope
151-
var tx *common.Payload
152-
var block *common.Block
153-
var err error
154-
var currBlockNumber uint64 = math.MaxUint64
155-
for currBlockNumber >= 0 {
156-
if block, err = ledger.GetBlockByNumber(currBlockNumber); err != nil {
157-
return nil, err
158-
}
159-
if block.Data != nil && len(block.Data.Data) == 1 {
160-
if envelope, err = utils.ExtractEnvelope(block, 0); err != nil {
161-
peerLogger.Warning("Failed to get Envelope from Block %d.", block.Header.Number)
162-
currBlockNumber = block.Header.Number - 1
163-
continue
164-
}
165-
if tx, err = utils.ExtractPayload(envelope); err != nil {
166-
peerLogger.Warning("Failed to get Payload from Block %d.", block.Header.Number)
167-
currBlockNumber = block.Header.Number - 1
168-
continue
169-
}
170-
chdr, err := utils.UnmarshalChannelHeader(tx.Header.ChannelHeader)
171-
if err != nil {
172-
peerLogger.Warning("Failed to get ChannelHeader from Block %d, error %s.", block.Header.Number, err)
173-
currBlockNumber = block.Header.Number - 1
174-
continue
175-
}
176-
if chdr.Type == int32(common.HeaderType_CONFIG) {
177-
return block, nil
178-
}
179-
}
180-
currBlockNumber = block.Header.Number - 1
147+
peerLogger.Debugf("Getting config block")
148+
149+
// get last block. Last block number is Height-1
150+
blockchainInfo, err := ledger.GetBlockchainInfo()
151+
if err != nil {
152+
return nil, err
181153
}
182-
return nil, fmt.Errorf("Failed to find config block.")
154+
lastBlock, err := ledger.GetBlockByNumber(blockchainInfo.Height - 1)
155+
if err != nil {
156+
return nil, err
157+
}
158+
159+
// get most recent config block location from last block metadata
160+
configBlockIndex, err := utils.GetLastConfigIndexFromBlock(lastBlock)
161+
if err != nil {
162+
return nil, err
163+
}
164+
165+
// get most recent config block
166+
configBlock, err := ledger.GetBlockByNumber(configBlockIndex)
167+
if err != nil {
168+
return nil, err
169+
}
170+
171+
peerLogger.Debugf("Got config block[%d]", configBlockIndex)
172+
return configBlock, nil
183173
}
184174

185175
// createChain creates a new chain object and insert it into the chains

core/peer/peer_test.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,11 @@ func TestCreateChainFromBlock(t *testing.T) {
173173
t.Fatalf("failed to get correct ledger")
174174
}
175175

176-
// Config block from ledger
176+
// Get config block from ledger
177177
block, err = getCurrConfigBlockFromLedger(ledger)
178+
assert.NoError(t, err, "Failed to get config block from ledger")
179+
assert.NotNil(t, block, "Config block should not be nil")
180+
assert.Equal(t, uint64(0), block.Header.Number, "config block should have been block 0")
178181

179182
// Bad ledger
180183
ledger = GetLedger("BogusChain")

0 commit comments

Comments
 (0)