mirror of
https://github.com/tendermint/tendermint.git
synced 2026-02-07 20:40:44 +00:00
* Fix many golint errors * Fix golint errors in the 'lite' package * Don't export Pool.store * Fix typo * Revert unwanted changes * Fix errors in counter package * Fix linter errors in kvstore package * Fix linter error in example package * Fix error in tests package * Fix linter errors in v2 package * Fix linter errors in consensus package * Fix linter errors in evidence package * Fix linter error in fail package * Fix linter errors in query package * Fix linter errors in core package * Fix linter errors in node package * Fix linter errors in mempool package * Fix linter error in conn package * Fix linter errors in pex package * Rename PEXReactor export to Reactor * Fix linter errors in trust package * Fix linter errors in upnp package * Fix linter errors in p2p package * Fix linter errors in proxy package * Fix linter errors in mock_test package * Fix linter error in client_test package * Fix linter errors in coretypes package * Fix linter errors in coregrpc package * Fix linter errors in rpcserver package * Fix linter errors in rpctypes package * Fix linter errors in rpctest package * Fix linter error in json2wal script * Fix linter error in wal2json script * Fix linter errors in kv package * Fix linter error in state package * Fix linter error in grpc_client * Fix linter errors in types package * Fix linter error in version package * Fix remaining errors * Address review comments * Fix broken tests * Reconcile package coregrpc * Fix golangci bot error * Fix new golint errors * Fix broken reference * Enable golint linter * minor changes to bring golint into line * fix failing test * fix pex reactor naming * address PR comments
86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
package lite
|
|
|
|
import (
|
|
log "github.com/tendermint/tendermint/libs/log"
|
|
lerr "github.com/tendermint/tendermint/lite/errors"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
var _ PersistentProvider = (*multiProvider)(nil)
|
|
|
|
// multiProvider allows you to place one or more caches in front of a source
|
|
// Provider. It runs through them in order until a match is found.
|
|
type multiProvider struct {
|
|
logger log.Logger
|
|
providers []PersistentProvider
|
|
}
|
|
|
|
// NewMultiProvider returns a new provider which wraps multiple other providers.
|
|
func NewMultiProvider(providers ...PersistentProvider) *multiProvider {
|
|
return &multiProvider{
|
|
logger: log.NewNopLogger(),
|
|
providers: providers,
|
|
}
|
|
}
|
|
|
|
// SetLogger sets logger on self and all subproviders.
|
|
func (mc *multiProvider) SetLogger(logger log.Logger) {
|
|
mc.logger = logger
|
|
for _, p := range mc.providers {
|
|
p.SetLogger(logger)
|
|
}
|
|
}
|
|
|
|
// SaveFullCommit saves on all providers, and aborts on the first error.
|
|
func (mc *multiProvider) SaveFullCommit(fc FullCommit) (err error) {
|
|
for _, p := range mc.providers {
|
|
err = p.SaveFullCommit(fc)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// LatestFullCommit loads the latest from all providers and provides
|
|
// the latest FullCommit that satisfies the conditions.
|
|
// Returns the first error encountered.
|
|
func (mc *multiProvider) LatestFullCommit(chainID string, minHeight, maxHeight int64) (fc FullCommit, err error) {
|
|
for _, p := range mc.providers {
|
|
var commit FullCommit
|
|
commit, err = p.LatestFullCommit(chainID, minHeight, maxHeight)
|
|
if lerr.IsErrCommitNotFound(err) {
|
|
err = nil
|
|
continue
|
|
} else if err != nil {
|
|
return
|
|
}
|
|
if fc == (FullCommit{}) {
|
|
fc = commit
|
|
} else if commit.Height() > fc.Height() {
|
|
fc = commit
|
|
}
|
|
if fc.Height() == maxHeight {
|
|
return
|
|
}
|
|
}
|
|
if fc == (FullCommit{}) {
|
|
err = lerr.ErrCommitNotFound()
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// ValidatorSet returns validator set at height as provided by the first
|
|
// provider which has it, or an error otherwise.
|
|
func (mc *multiProvider) ValidatorSet(chainID string, height int64) (valset *types.ValidatorSet, err error) {
|
|
for _, p := range mc.providers {
|
|
valset, err = p.ValidatorSet(chainID, height)
|
|
if err == nil {
|
|
// TODO Log unexpected types of errors.
|
|
return valset, nil
|
|
}
|
|
}
|
|
return nil, lerr.ErrUnknownValidators(chainID, height)
|
|
}
|