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  }