github.com/osdi23p228/fabric@v0.0.0-20221218062954-77808885f5db/common/ledger/blockledger/fileledger/factory.go (about) 1 /* 2 Copyright IBM Corp. 2016 All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package fileledger 8 9 import ( 10 "sync" 11 12 "github.com/osdi23p228/fabric/common/ledger/blkstorage" 13 "github.com/osdi23p228/fabric/common/ledger/blockledger" 14 "github.com/osdi23p228/fabric/common/metrics" 15 ) 16 17 type blockStoreProvider interface { 18 Open(ledgerid string) (*blkstorage.BlockStore, error) 19 List() ([]string, error) 20 Close() 21 } 22 23 type fileLedgerFactory struct { 24 blkstorageProvider blockStoreProvider 25 ledgers map[string]blockledger.ReadWriter 26 mutex sync.Mutex 27 } 28 29 // GetOrCreate gets an existing ledger (if it exists) or creates it if it does not 30 func (flf *fileLedgerFactory) GetOrCreate(chainID string) (blockledger.ReadWriter, error) { 31 flf.mutex.Lock() 32 defer flf.mutex.Unlock() 33 34 key := chainID 35 // check cache 36 ledger, ok := flf.ledgers[key] 37 if ok { 38 return ledger, nil 39 } 40 // open fresh 41 blockStore, err := flf.blkstorageProvider.Open(key) 42 if err != nil { 43 return nil, err 44 } 45 ledger = NewFileLedger(blockStore) 46 flf.ledgers[key] = ledger 47 return ledger, nil 48 } 49 50 // ChannelIDs returns the channel IDs the factory is aware of 51 func (flf *fileLedgerFactory) ChannelIDs() []string { 52 channelIDs, err := flf.blkstorageProvider.List() 53 if err != nil { 54 logger.Panic(err) 55 } 56 return channelIDs 57 } 58 59 // Close releases all resources acquired by the factory 60 func (flf *fileLedgerFactory) Close() { 61 flf.blkstorageProvider.Close() 62 } 63 64 // New creates a new ledger factory 65 func New(directory string, metricsProvider metrics.Provider) (blockledger.Factory, error) { 66 p, err := blkstorage.NewProvider( 67 blkstorage.NewConf(directory, -1), 68 &blkstorage.IndexConfig{ 69 AttrsToIndex: []blkstorage.IndexableAttr{blkstorage.IndexableAttrBlockNum}}, 70 metricsProvider, 71 ) 72 if err != nil { 73 return nil, err 74 } 75 return &fileLedgerFactory{ 76 blkstorageProvider: p, 77 ledgers: make(map[string]blockledger.ReadWriter), 78 }, nil 79 }