Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/feat/perf' into sig-cache
Browse files Browse the repository at this point in the history
# Conflicts:
#	x/auth/ante/sigverify.go
  • Loading branch information
jinsan-line committed Jan 6, 2021
2 parents dd56ff5 + 900473c commit cfc5dca
Show file tree
Hide file tree
Showing 27 changed files with 291 additions and 49 deletions.
14 changes: 12 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,16 @@ jobs:
- go-mod-v2-{{ checksum "go.sum" }}
- run:
name: Cache go modules
command: make go-mod-cache
command: |
go env -w GOPRIVATE=github.com/line/*
git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/"
make go-mod-cache
- run:
name: Build
command: make build
command: |
go env -w GOPRIVATE=github.com/line/*
git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/"
make build
- run:
name: Git garbage collection
command: git gc
Expand Down Expand Up @@ -106,6 +112,8 @@ jobs:
command: |
export VERSION="$(git describe --tags --long | sed 's/v\(.*\)/\1/')"
export GO111MODULE=on
go env -w GOPRIVATE=github.com/line/*
git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/"
mkdir -p /tmp/logs /tmp/workspace/profiles
for pkg in $(go list ./... | grep -v '/simulation' | circleci tests split); do
id=$(echo "$pkg" | sed 's|[/.]|_|g')
Expand Down Expand Up @@ -134,6 +142,8 @@ jobs:
- run:
name: lint
command: |
go env -w GOPRIVATE=github.com/line/*
git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/"
go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.27
make lint
Expand Down
11 changes: 9 additions & 2 deletions baseapp/baseapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ type BaseApp struct { // nolint: maligned
router sdk.Router // handle any kind of message
queryRouter sdk.QueryRouter // router for redirecting query calls
txDecoder sdk.TxDecoder // unmarshal []byte into sdk.Tx
metrics *Metrics // metrics of baseapp

// set upon LoadVersion or LoadLatestVersion.
baseKey *sdk.KVStoreKey // Main KVStore in cms
Expand Down Expand Up @@ -131,6 +132,7 @@ func NewBaseApp(
txDecoder: txDecoder,
fauxMerkleMode: false,
trace: false,
metrics: NopMetrics(),
}
for _, option := range options {
option(app)
Expand Down Expand Up @@ -362,6 +364,10 @@ func (app *BaseApp) setTrace(trace bool) {
app.trace = trace
}

func (app *BaseApp) setMetrics(metrics *Metrics) {
app.metrics = metrics
}

// Router returns the router of the BaseApp.
func (app *BaseApp) Router() sdk.Router {
if app.sealed {
Expand All @@ -388,8 +394,9 @@ func (app *BaseApp) IsSealed() bool { return app.sealed }
func (app *BaseApp) setCheckState(header abci.Header) {
ms := app.cms.CacheMultiStore()
app.checkState = &state{
ms: ms,
ctx: sdk.NewContext(ms, header, true, app.logger).WithMinGasPrices(app.minGasPrices),
ms: ms,
ctx: sdk.NewContext(ms, header, true, app.logger).
WithMinGasPrices(app.minGasPrices).WithConsensusParams(app.consensusParams),
}
}

Expand Down
30 changes: 30 additions & 0 deletions baseapp/metrics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package baseapp

const (
// MetricsSubsystem is a subsystem shared by all metrics exposed by this
// package.
MetricsSubsystem = "baseapp"
)

// Metrics contains metrics exposed by this package.
type Metrics struct {
}

// PrometheusMetrics returns Metrics build using Prometheus client library.
// Optionally, labels can be provided along with their values ("foo",
// "fooValue").
func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics {
return &Metrics{}
}

// NopMetrics returns no-op Metrics.
func NopMetrics() *Metrics {
return &Metrics{}
}

func GeneratePrometheusMetrics(prometheus bool) *Metrics {
if prometheus {
return PrometheusMetrics("app")
}
return NopMetrics()
}
22 changes: 22 additions & 0 deletions baseapp/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@ import (
"fmt"
"io"

"github.com/tendermint/iavl"
dbm "github.com/tendermint/tm-db"

"github.com/cosmos/cosmos-sdk/store"
"github.com/cosmos/cosmos-sdk/store/cache"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)

Expand Down Expand Up @@ -49,6 +52,25 @@ func SetTrace(trace bool) func(*BaseApp) {
return func(app *BaseApp) { app.setTrace(trace) }
}

// SetMetrics sets prometheus metrics
func SetMetrics(bappMetrics *Metrics, storeMetrics *storetypes.Metrics, iavlMetricsProvider iavl.MetricsProvider) func(*BaseApp) {
return func(app *BaseApp) {
app.setMetrics(bappMetrics)
app.cms.SetMetrics(storeMetrics, iavlMetricsProvider)
}
}

func MetricsProvider(prometheus bool) (*Metrics, *storetypes.Metrics, cache.MetricsProvider, iavl.MetricsProvider) {
namespace := "app"
if prometheus {
return PrometheusMetrics(namespace),
storetypes.PrometheusMetrics(namespace),
cache.PrometheusMetricsProvider(namespace),
iavl.PrometheusMetricsProvider(namespace)
}
return NopMetrics(), storetypes.NopMetrics(), cache.NopMetricsProvider(), iavl.NopMetricsProvider()
}

func (app *BaseApp) SetName(name string) {
if app.sealed {
panic("SetName() on sealed BaseApp")
Expand Down
2 changes: 2 additions & 0 deletions client/flags/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ const (
FlagMaxOpenConnections = "max-open"
FlagRPCReadTimeout = "read-timeout"
FlagRPCWriteTimeout = "write-timeout"
FlagRPCIdleTimeout = "idle-timeout"
FlagOutputDocument = "output-document" // inspired by wget -O
FlagSkipConfirmation = "yes"
FlagProve = "prove"
Expand Down Expand Up @@ -142,6 +143,7 @@ func RegisterRestServerFlags(cmd *cobra.Command) *cobra.Command {
cmd.Flags().Uint(FlagMaxOpenConnections, 1000, "The number of maximum open connections")
cmd.Flags().Uint(FlagRPCReadTimeout, 10, "The RPC read timeout (in seconds)")
cmd.Flags().Uint(FlagRPCWriteTimeout, 10, "The RPC write timeout (in seconds)")
cmd.Flags().Uint(FlagRPCIdleTimeout, 60, "The RPC idle timeout (in seconds)")
cmd.Flags().Bool(FlagUnsafeCORS, false, "Allows CORS requests from all domains. For development purposes only, use it at your own risk.")

return cmd
Expand Down
4 changes: 3 additions & 1 deletion client/lcd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func NewRestServer(cdc *codec.Codec) *RestServer {
}

// Start starts the rest server
func (rs *RestServer) Start(listenAddr string, maxOpen int, readTimeout, writeTimeout uint, cors bool) (err error) {
func (rs *RestServer) Start(listenAddr string, maxOpen int, readTimeout, writeTimeout, idleTimeout uint, cors bool) (err error) {
server.TrapSignal(func() {
err := rs.listener.Close()
rs.log.Error("error closing listener", "err", err)
Expand All @@ -57,6 +57,7 @@ func (rs *RestServer) Start(listenAddr string, maxOpen int, readTimeout, writeTi
cfg.MaxOpenConnections = maxOpen
cfg.ReadTimeout = time.Duration(readTimeout) * time.Second
cfg.WriteTimeout = time.Duration(writeTimeout) * time.Second
cfg.IdleTimeout = time.Duration(idleTimeout) * time.Second

rs.listener, err = tmrpcserver.Listen(listenAddr, cfg)
if err != nil {
Expand Down Expand Up @@ -97,6 +98,7 @@ func ServeCommand(cdc *codec.Codec, registerRoutesFn func(*RestServer)) *cobra.C
viper.GetInt(flags.FlagMaxOpenConnections),
uint(viper.GetInt(flags.FlagRPCReadTimeout)),
uint(viper.GetInt(flags.FlagRPCWriteTimeout)),
uint(viper.GetInt(flags.FlagRPCIdleTimeout)),
viper.GetBool(flags.FlagUnsafeCORS),
)

Expand Down
8 changes: 7 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ require (
github.com/btcsuite/btcd v0.20.1-beta
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d
github.com/cosmos/ledger-cosmos-go v0.11.1
github.com/go-kit/kit v0.10.0
github.com/gogo/protobuf v1.3.1
github.com/golang/mock v1.3.1-0.20190508161146-9fa652df1129
github.com/golang/snappy v0.0.2 // indirect
Expand All @@ -22,6 +23,7 @@ require (
github.com/onsi/gomega v1.9.0 // indirect
github.com/pelletier/go-toml v1.6.0
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.5.1
github.com/rakyll/statik v0.1.6
github.com/spf13/afero v1.2.1 // indirect
github.com/spf13/cobra v1.0.0
Expand All @@ -42,4 +44,8 @@ require (
gopkg.in/yaml.v2 v2.3.0
)

replace github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4
replace (
github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4
github.com/tendermint/iavl => github.com/line/iavl v0.14.4-0.20201217063301-6b67687bfae9
github.com/tendermint/tendermint => github.com/line/tendermint v0.33.10-0.20210106061749-b557e0c9a76c
)
9 changes: 4 additions & 5 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,10 @@ github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOS
github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
github.com/line/iavl v0.14.4-0.20201217063301-6b67687bfae9 h1:n6YHVdTld8D0dAogBUcXTaqhk1ZMTAR9Phy4xdMVWDY=
github.com/line/iavl v0.14.4-0.20201217063301-6b67687bfae9/go.mod h1:eG6hI8RbMxL1nR+nJBykXD//gKjUpKCAT2tvi9V93sA=
github.com/line/tendermint v0.33.10-0.20210106061749-b557e0c9a76c h1:BLKoXsi7V+y1Neb9FcYgV+9UWKeJM1KLsoJBy/GAg3w=
github.com/line/tendermint v0.33.10-0.20210106061749-b557e0c9a76c/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM=
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
Expand Down Expand Up @@ -441,11 +445,6 @@ github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM
github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso=
github.com/tendermint/go-amino v0.15.1 h1:D2uk35eT4iTsvJd9jWIetzthE5C0/k2QmMFkCN+4JgQ=
github.com/tendermint/go-amino v0.15.1/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
github.com/tendermint/iavl v0.14.3 h1:tuiUAqJdA3OOyPU/9P3pMYnAcd+OL7BUdzNiE3ytUwQ=
github.com/tendermint/iavl v0.14.3/go.mod h1:vHLYxU/zuxBmxxr1v+5Vnd/JzcIsyK17n9P9RDubPVU=
github.com/tendermint/tendermint v0.33.5/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM=
github.com/tendermint/tendermint v0.33.9 h1:rRKIfu5qAXX5f9bwX1oUXSZz/ALFJjDuivhkbGUQxiU=
github.com/tendermint/tendermint v0.33.9/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM=
github.com/tendermint/tm-db v0.5.1 h1:H9HDq8UEA7Eeg13kdYckkgwwkQLBnJGgX4PgLJRhieY=
github.com/tendermint/tm-db v0.5.1/go.mod h1:g92zWjHpCYlEvQXvy9M168Su8V1IBEeawpXVVBaK4f4=
github.com/tendermint/tm-db v0.5.2 h1:QG3IxQZBubWlr7kGQcYIavyTNmZRO+r//nENxoq0g34=
Expand Down
4 changes: 4 additions & 0 deletions server/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ type BaseConfig struct {

// InterBlockCache enables inter-block caching.
InterBlockCache bool `mapstructure:"inter-block-cache"`

// When true, Prometheus metrics are served under /metrics on prometheus_listen_addr in config.toml.
// It works when tendermint's prometheus option (config.toml) is set to true.
Prometheus bool `mapstructure:"prometheus"`
}

// Config defines the server's top level configuration
Expand Down
4 changes: 4 additions & 0 deletions server/config/toml.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ halt-time = {{ .BaseConfig.HaltTime }}
# InterBlockCache enables inter-block caching.
inter-block-cache = {{ .BaseConfig.InterBlockCache }}
# When true, Prometheus metrics are served under /metrics on prometheus_listen_addr in config.toml.
# It works when tendermint's prometheus option (config.toml) is set to true.
prometheus = {{ .BaseConfig.Prometheus }}
`

var configTemplate *template.Template
Expand Down
5 changes: 5 additions & 0 deletions server/mock/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package mock
import (
"io"

"github.com/tendermint/iavl"
dbm "github.com/tendermint/tm-db"

store "github.com/cosmos/cosmos-sdk/store/types"
Expand Down Expand Up @@ -99,6 +100,10 @@ func (ms multiStore) SetInterBlockCache(_ sdk.MultiStorePersistentCache) {
panic("not implemented")
}

func (ms multiStore) SetMetrics(metrics *store.Metrics, iavlMetricsProvider iavl.MetricsProvider) {
panic("not implemented")
}

var _ sdk.KVStore = kvStore{}

type kvStore struct {
Expand Down
3 changes: 2 additions & 1 deletion server/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ const (
FlagInterBlockCache = "inter-block-cache"
FlagUnsafeSkipUpgrades = "unsafe-skip-upgrades"
FlagTrace = "trace"
FlagPrometheus = "prometheus"

FlagPruning = "pruning"
FlagPruningKeepRecent = "pruning-keep-recent"
Expand Down Expand Up @@ -130,7 +131,7 @@ func startStandAlone(ctx *Context, appCreator AppCreator) error {

app := appCreator(ctx.Logger, db, traceWriter)

svr, err := server.NewServer(addr, "socket", app)
svr, err := server.NewServer(addr, "grpc", app)
if err != nil {
return fmt.Errorf("error creating listener: %v", err)
}
Expand Down
3 changes: 2 additions & 1 deletion simapp/sim_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"os"
"testing"

"github.com/cosmos/cosmos-sdk/store/cache"
"github.com/stretchr/testify/require"
abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/libs/log"
Expand Down Expand Up @@ -47,7 +48,7 @@ func fauxMerkleModeOpt(bapp *baseapp.BaseApp) {
// interBlockCacheOpt returns a BaseApp option function that sets the persistent
// inter-block write-through cache.
func interBlockCacheOpt() func(*baseapp.BaseApp) {
return baseapp.SetInterBlockCache(store.NewCommitKVStoreCacheManager())
return baseapp.SetInterBlockCache(store.NewCommitKVStoreCacheManager(cache.NopMetricsProvider()))
}

func TestFullAppSimulation(t *testing.T) {
Expand Down
24 changes: 15 additions & 9 deletions store/cache/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ var (

// DefaultCommitKVStoreCacheSize defines the persistent ARC cache size for a
// CommitKVStoreCache.
DefaultCommitKVStoreCacheSize uint = 1000
DefaultCommitKVStoreCacheSize uint = 300000
)

type (
Expand All @@ -27,20 +27,22 @@ type (
// CommitKVStore and below is completely irrelevant to this layer.
CommitKVStoreCache struct {
types.CommitKVStore
cache *lru.ARCCache
cache *lru.ARCCache
metrics *Metrics
}

// CommitKVStoreCacheManager maintains a mapping from a StoreKey to a
// CommitKVStoreCache. Each CommitKVStore, per StoreKey, is meant to be used
// in an inter-block (persistent) manner and typically provided by a
// CommitMultiStore.
CommitKVStoreCacheManager struct {
cacheSize uint
caches map[string]types.CommitKVStore
cacheSize uint
caches map[string]types.CommitKVStore
metricsProvider func(storeName string) *Metrics
}
)

func NewCommitKVStoreCache(store types.CommitKVStore, size uint) *CommitKVStoreCache {
func NewCommitKVStoreCache(store types.CommitKVStore, size uint, metrics *Metrics) *CommitKVStoreCache {
cache, err := lru.NewARC(int(size))
if err != nil {
panic(fmt.Errorf("failed to create KVStore cache: %s", err))
Expand All @@ -49,13 +51,15 @@ func NewCommitKVStoreCache(store types.CommitKVStore, size uint) *CommitKVStoreC
return &CommitKVStoreCache{
CommitKVStore: store,
cache: cache,
metrics: metrics,
}
}

func NewCommitKVStoreCacheManager(size uint) *CommitKVStoreCacheManager {
func NewCommitKVStoreCacheManager(size uint, metricsProvider MetricsProvider) *CommitKVStoreCacheManager {
return &CommitKVStoreCacheManager{
cacheSize: size,
caches: make(map[string]types.CommitKVStore),
cacheSize: size,
caches: make(map[string]types.CommitKVStore),
metricsProvider: metricsProvider,
}
}

Expand All @@ -64,7 +68,7 @@ func NewCommitKVStoreCacheManager(size uint) *CommitKVStoreCacheManager {
// The returned Cache is meant to be used in a persistent manner.
func (cmgr *CommitKVStoreCacheManager) GetStoreCache(key types.StoreKey, store types.CommitKVStore) types.CommitKVStore {
if cmgr.caches[key.Name()] == nil {
cmgr.caches[key.Name()] = NewCommitKVStoreCache(store, cmgr.cacheSize)
cmgr.caches[key.Name()] = NewCommitKVStoreCache(store, cmgr.cacheSize, cmgr.metricsProvider(key.Name()))
}

return cmgr.caches[key.Name()]
Expand Down Expand Up @@ -99,10 +103,12 @@ func (ckv *CommitKVStoreCache) Get(key []byte) []byte {
valueI, ok := ckv.cache.Get(keyStr)
if ok {
// cache hit
ckv.metrics.InterBlockCacheHits.Add(1)
return valueI.([]byte)
}

// cache miss; write to cache
ckv.metrics.InterBlockCacheMisses.Add(1)
value := ckv.CommitKVStore.Get(key)
ckv.cache.Add(keyStr, value)

Expand Down
Loading

0 comments on commit cfc5dca

Please sign in to comment.