github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/utils/dbutil/threads/counted.go (about)

     1  package threads
     2  
     3  import (
     4  	"github.com/unicornultrafoundation/go-helios/u2udb"
     5  
     6  	"github.com/unicornultrafoundation/go-u2u/logger"
     7  )
     8  
     9  type (
    10  	countedDbProducer struct {
    11  		u2udb.DBProducer
    12  	}
    13  
    14  	countedFullDbProducer struct {
    15  		u2udb.FullDBProducer
    16  	}
    17  
    18  	countedStore struct {
    19  		u2udb.Store
    20  	}
    21  
    22  	countedIterator struct {
    23  		u2udb.Iterator
    24  		release func(count int)
    25  	}
    26  )
    27  
    28  func CountedDBProducer(dbs u2udb.DBProducer) u2udb.DBProducer {
    29  	return &countedDbProducer{dbs}
    30  }
    31  
    32  func CountedFullDBProducer(dbs u2udb.FullDBProducer) u2udb.FullDBProducer {
    33  	return &countedFullDbProducer{dbs}
    34  }
    35  
    36  func (p *countedDbProducer) OpenDB(name string) (u2udb.Store, error) {
    37  	s, err := p.DBProducer.OpenDB(name)
    38  	return &countedStore{s}, err
    39  }
    40  
    41  func (p *countedFullDbProducer) OpenDB(name string) (u2udb.Store, error) {
    42  	s, err := p.FullDBProducer.OpenDB(name)
    43  	return &countedStore{s}, err
    44  }
    45  
    46  var notifier = logger.New("threads-pool")
    47  
    48  func (s *countedStore) NewIterator(prefix []byte, start []byte) u2udb.Iterator {
    49  	got, release := GlobalPool.Lock(1)
    50  	if got < 1 {
    51  		notifier.Log.Warn("Too many DB iterators")
    52  	}
    53  
    54  	return &countedIterator{
    55  		Iterator: s.Store.NewIterator(prefix, start),
    56  		release:  release,
    57  	}
    58  }
    59  
    60  func (it *countedIterator) Release() {
    61  	it.Iterator.Release()
    62  	it.release(1)
    63  }