|
package proxy
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/tendermint/tendermint/libs/service"
|
|
)
|
|
|
|
//-----------------------------
|
|
|
|
// Tendermint's interface to the application consists of multiple connections
|
|
type AppConns interface {
|
|
service.Service
|
|
|
|
Mempool() AppConnMempool
|
|
Consensus() AppConnConsensus
|
|
Query() AppConnQuery
|
|
Snapshot() AppConnSnapshot
|
|
}
|
|
|
|
func NewAppConns(clientCreator ClientCreator) AppConns {
|
|
return NewMultiAppConn(clientCreator)
|
|
}
|
|
|
|
//-----------------------------
|
|
// multiAppConn implements AppConns
|
|
|
|
// a multiAppConn is made of a few appConns (mempool, consensus, query)
|
|
// and manages their underlying abci clients
|
|
// TODO: on app restart, clients must reboot together
|
|
type multiAppConn struct {
|
|
service.BaseService
|
|
|
|
mempoolConn AppConnMempool
|
|
consensusConn AppConnConsensus
|
|
queryConn AppConnQuery
|
|
snapshotConn AppConnSnapshot
|
|
|
|
clientCreator ClientCreator
|
|
}
|
|
|
|
// Make all necessary abci connections to the application
|
|
func NewMultiAppConn(clientCreator ClientCreator) AppConns {
|
|
multiAppConn := &multiAppConn{
|
|
clientCreator: clientCreator,
|
|
}
|
|
multiAppConn.BaseService = *service.NewBaseService(nil, "multiAppConn", multiAppConn)
|
|
return multiAppConn
|
|
}
|
|
|
|
// Returns the mempool connection
|
|
func (app *multiAppConn) Mempool() AppConnMempool {
|
|
return app.mempoolConn
|
|
}
|
|
|
|
// Returns the consensus Connection
|
|
func (app *multiAppConn) Consensus() AppConnConsensus {
|
|
return app.consensusConn
|
|
}
|
|
|
|
// Returns the query Connection
|
|
func (app *multiAppConn) Query() AppConnQuery {
|
|
return app.queryConn
|
|
}
|
|
|
|
// Returns the snapshot Connection
|
|
func (app *multiAppConn) Snapshot() AppConnSnapshot {
|
|
return app.snapshotConn
|
|
}
|
|
|
|
func (app *multiAppConn) OnStart() error {
|
|
// query connection
|
|
querycli, err := app.clientCreator.NewABCIClient()
|
|
if err != nil {
|
|
return fmt.Errorf("error creating ABCI client (query connection): %w", err)
|
|
}
|
|
querycli.SetLogger(app.Logger.With("module", "abci-client", "connection", "query"))
|
|
if err := querycli.Start(); err != nil {
|
|
return fmt.Errorf("error starting ABCI client (query connection): %w", err)
|
|
}
|
|
app.queryConn = NewAppConnQuery(querycli)
|
|
|
|
// snapshot connection
|
|
snapshotcli, err := app.clientCreator.NewABCIClient()
|
|
if err != nil {
|
|
return fmt.Errorf("error creating ABCI client (snapshot connection): %w", err)
|
|
}
|
|
snapshotcli.SetLogger(app.Logger.With("module", "abci-client", "connection", "snapshot"))
|
|
if err := snapshotcli.Start(); err != nil {
|
|
return fmt.Errorf("error starting ABCI client (snapshot connection): %w", err)
|
|
}
|
|
app.snapshotConn = NewAppConnSnapshot(snapshotcli)
|
|
|
|
// mempool connection
|
|
memcli, err := app.clientCreator.NewABCIClient()
|
|
if err != nil {
|
|
return fmt.Errorf("error creating ABCI client (mempool connection): %w", err)
|
|
}
|
|
memcli.SetLogger(app.Logger.With("module", "abci-client", "connection", "mempool"))
|
|
if err := memcli.Start(); err != nil {
|
|
return fmt.Errorf("error starting ABCI client (mempool connection): %w", err)
|
|
}
|
|
app.mempoolConn = NewAppConnMempool(memcli)
|
|
|
|
// consensus connection
|
|
concli, err := app.clientCreator.NewABCIClient()
|
|
if err != nil {
|
|
return fmt.Errorf("error creating ABCI client (consensus connection): %w", err)
|
|
}
|
|
concli.SetLogger(app.Logger.With("module", "abci-client", "connection", "consensus"))
|
|
if err := concli.Start(); err != nil {
|
|
return fmt.Errorf("error starting ABCI client (consensus connection): %w", err)
|
|
}
|
|
app.consensusConn = NewAppConnConsensus(concli)
|
|
|
|
return nil
|
|
}
|