github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/integration/routing.go (about)

     1  package integration
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/unicornultrafoundation/go-helios/u2udb"
     7  	"github.com/unicornultrafoundation/go-helios/u2udb/cachedproducer"
     8  	"github.com/unicornultrafoundation/go-helios/u2udb/multidb"
     9  	"github.com/unicornultrafoundation/go-helios/u2udb/skipkeys"
    10  
    11  	"github.com/unicornultrafoundation/go-u2u/utils/dbutil/threads"
    12  )
    13  
    14  type RoutingConfig struct {
    15  	Table map[string]multidb.Route
    16  }
    17  
    18  func (a RoutingConfig) Equal(b RoutingConfig) bool {
    19  	if len(a.Table) != len(b.Table) {
    20  		return false
    21  	}
    22  	for k, v := range a.Table {
    23  		if b.Table[k] != v {
    24  			return false
    25  		}
    26  	}
    27  	return true
    28  }
    29  
    30  func MakeMultiProducer(rawProducers map[multidb.TypeName]u2udb.IterableDBProducer, scopedProducers map[multidb.TypeName]u2udb.FullDBProducer, cfg RoutingConfig) (u2udb.FullDBProducer, error) {
    31  	cachedProducers := make(map[multidb.TypeName]u2udb.FullDBProducer)
    32  	var flushID []byte
    33  	var err error
    34  	for typ, producer := range scopedProducers {
    35  		flushID, err = producer.Initialize(rawProducers[typ].Names(), flushID)
    36  		if err != nil {
    37  			return nil, fmt.Errorf("failed to open existing databases: %v. Try to use 'db heal' to recover", err)
    38  		}
    39  		cachedProducers[typ] = cachedproducer.WrapAll(producer)
    40  	}
    41  
    42  	p, err := makeMultiProducer(cachedProducers, cfg)
    43  	return threads.CountedFullDBProducer(p), err
    44  }
    45  
    46  func MakeDirectMultiProducer(rawProducers map[multidb.TypeName]u2udb.IterableDBProducer, cfg RoutingConfig) (u2udb.FullDBProducer, error) {
    47  	dproducers := map[multidb.TypeName]u2udb.FullDBProducer{}
    48  	for typ, producer := range rawProducers {
    49  		dproducers[typ] = &DummyScopedProducer{producer}
    50  	}
    51  	return MakeMultiProducer(rawProducers, dproducers, cfg)
    52  }
    53  
    54  func makeMultiProducer(scopedProducers map[multidb.TypeName]u2udb.FullDBProducer, cfg RoutingConfig) (u2udb.FullDBProducer, error) {
    55  	multi, err := multidb.NewProducer(scopedProducers, cfg.Table, TablesKey)
    56  	if err != nil {
    57  		return nil, fmt.Errorf("failed to construct multidb: %v", err)
    58  	}
    59  
    60  	err = multi.Verify()
    61  	if err != nil {
    62  		return nil, fmt.Errorf("incompatible chainstore DB layout: %v. Try to use 'db transform' to recover", err)
    63  	}
    64  	return skipkeys.WrapAllProducer(multi, MetadataPrefix), nil
    65  }