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 }