You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

989 lines
34 KiB

deps: update gogo/protobuf version from v1.2.1 to v1.3.0 (#3947) * update gogo/protobuf version from v1.2.1 to v1.3.0 Also errcheck from v1.1.0 to v1.2.0 See full diff in - https://github.com/gogo/protobuf/compare/v1.2.1...v1.3.0 - https://github.com/kisielk/errcheck/compare/v1.1.0...v1.2.0 Changelog: Tested versions: go 1.12.9 protoc 3.7.1 Improvements: plugin/stringer - Handle repeated and/or nullable types a bit better now. plugin/size - Remove the loop in sovXXX by using bit twiddling. Thanks: https://github.com/apelisse plugin/marshalto - Implemented a reverse marshal strategy which allows for faster marshalling. This now avoids a recursive (and repeated) call to Size(). Thanks: https://github.com/apelisse plugin/compare - Added support for for oneof types. Bug fixes: protoc-gen-gogo/generator - Fix assignment to entry in nil map. Thanks: https://github.com/tgulacsi protoc-gen-gogo/generator - Allows plugins to call RecordTypeUse without panicking. Thanks: https://github.com/fedenusy proto/extensions - Fixed set extension regression. We did not clear the extensions before setting. io/uint32 - fix uint32reader bug that causes ReadMsg to recreate buffer when lengths are the same. Thanks: https://github.com/SebiSujar proto/table_merge: Fix merge of non-nullable slices. Thanks: https://github.com/euroelessar Upstream commits: merged in golang/protobuf commit 318d17de72747ed1c16502681db4b2bb709a92d0 - Add UnimplementedServer for server interface merged in golang/protobuf commit b85cd75de734650db18a99a943fe351d41387800 - protoc-gen-go/grpc: inline errUnimplemented function merged in golang/protobuf commit d3c38a4eb4970272b87a425ae00ccc4548e2f9bb - protoc-gen-go/grpc: use status and code packages only if needed merged in golang/protobuf commit e91709a02e0e8ff8b86b7aa913fdc9ae9498e825 - fix indentation in jsonpb with Any messages merged in golang/protobuf commit 8d0c54c1246661d9a51ca0ba455d22116d485eaa - protoc-gen-go: generate XXX_OneofWrappers instead of XXX_OneofFuncs Misc: extensions.md - Markdown update. Thanks: https://github.com/TennyZhuang Readme.md - Added user. go/protoc update - Updated to go1.12.x and protoc 3.7.1 Makefile update - fix go vet shadow tool reference test/mixbench - Update mixbench tool. Expose runnable benchmarks via flags. * update certstrap * update golangci-lint from v1.13.2 to v1.17.1 * update gox as well * test * comment out golangci temporary * comment out go-deadlock deps
5 years ago
blockchain: Reorg reactor (#3561) * go routines in blockchain reactor * Added reference to the go routine diagram * Initial commit * cleanup * Undo testing_logger change, committed by mistake * Fix the test loggers * pulled some fsm code into pool.go * added pool tests * changes to the design added block requests under peer moved the request trigger in the reactor poolRoutine, triggered now by a ticker in general moved everything required for making block requests smarter in the poolRoutine added a simple map of heights to keep track of what will need to be requested next added a few more tests * send errors to FSM in a different channel than blocks send errors (RemovePeer) from switch on a different channel than the one receiving blocks renamed channels added more pool tests * more pool tests * lint errors * more tests * more tests * switch fast sync to new implementation * fixed data race in tests * cleanup * finished fsm tests * address golangci comments :) * address golangci comments :) * Added timeout on next block needed to advance * updating docs and cleanup * fix issue in test from previous cleanup * cleanup * Added termination scenarios, tests and more cleanup * small fixes to adr, comments and cleanup * Fix bug in sendRequest() If we tried to send a request to a peer not present in the switch, a missing continue statement caused the request to be blackholed in a peer that was removed and never retried. While this bug was manifesting, the reactor kept asking for other blocks that would be stored and never consumed. Added the number of unconsumed blocks in the math for requesting blocks ahead of current processing height so eventually there will be no more blocks requested until the already received ones are consumed. * remove bpPeer's didTimeout field * Use distinct err codes for peer timeout and FSM timeouts * Don't allow peers to update with lower height * review comments from Ethan and Zarko * some cleanup, renaming, comments * Move block execution in separate goroutine * Remove pool's numPending * review comments * fix lint, remove old blockchain reactor and duplicates in fsm tests * small reorg around peer after review comments * add the reactor spec * verify block only once * review comments * change to int for max number of pending requests * cleanup and godoc * Add configuration flag fast sync version * golangci fixes * fix config template * move both reactor versions under blockchain * cleanup, golint, renaming stuff * updated documentation, fixed more golint warnings * integrate with behavior package * sync with master * gofmt * add changelog_pending entry * move to improvments * suggestion to changelog entry
5 years ago
blockchain: Reorg reactor (#3561) * go routines in blockchain reactor * Added reference to the go routine diagram * Initial commit * cleanup * Undo testing_logger change, committed by mistake * Fix the test loggers * pulled some fsm code into pool.go * added pool tests * changes to the design added block requests under peer moved the request trigger in the reactor poolRoutine, triggered now by a ticker in general moved everything required for making block requests smarter in the poolRoutine added a simple map of heights to keep track of what will need to be requested next added a few more tests * send errors to FSM in a different channel than blocks send errors (RemovePeer) from switch on a different channel than the one receiving blocks renamed channels added more pool tests * more pool tests * lint errors * more tests * more tests * switch fast sync to new implementation * fixed data race in tests * cleanup * finished fsm tests * address golangci comments :) * address golangci comments :) * Added timeout on next block needed to advance * updating docs and cleanup * fix issue in test from previous cleanup * cleanup * Added termination scenarios, tests and more cleanup * small fixes to adr, comments and cleanup * Fix bug in sendRequest() If we tried to send a request to a peer not present in the switch, a missing continue statement caused the request to be blackholed in a peer that was removed and never retried. While this bug was manifesting, the reactor kept asking for other blocks that would be stored and never consumed. Added the number of unconsumed blocks in the math for requesting blocks ahead of current processing height so eventually there will be no more blocks requested until the already received ones are consumed. * remove bpPeer's didTimeout field * Use distinct err codes for peer timeout and FSM timeouts * Don't allow peers to update with lower height * review comments from Ethan and Zarko * some cleanup, renaming, comments * Move block execution in separate goroutine * Remove pool's numPending * review comments * fix lint, remove old blockchain reactor and duplicates in fsm tests * small reorg around peer after review comments * add the reactor spec * verify block only once * review comments * change to int for max number of pending requests * cleanup and godoc * Add configuration flag fast sync version * golangci fixes * fix config template * move both reactor versions under blockchain * cleanup, golint, renaming stuff * updated documentation, fixed more golint warnings * integrate with behavior package * sync with master * gofmt * add changelog_pending entry * move to improvments * suggestion to changelog entry
5 years ago
blockchain: Reorg reactor (#3561) * go routines in blockchain reactor * Added reference to the go routine diagram * Initial commit * cleanup * Undo testing_logger change, committed by mistake * Fix the test loggers * pulled some fsm code into pool.go * added pool tests * changes to the design added block requests under peer moved the request trigger in the reactor poolRoutine, triggered now by a ticker in general moved everything required for making block requests smarter in the poolRoutine added a simple map of heights to keep track of what will need to be requested next added a few more tests * send errors to FSM in a different channel than blocks send errors (RemovePeer) from switch on a different channel than the one receiving blocks renamed channels added more pool tests * more pool tests * lint errors * more tests * more tests * switch fast sync to new implementation * fixed data race in tests * cleanup * finished fsm tests * address golangci comments :) * address golangci comments :) * Added timeout on next block needed to advance * updating docs and cleanup * fix issue in test from previous cleanup * cleanup * Added termination scenarios, tests and more cleanup * small fixes to adr, comments and cleanup * Fix bug in sendRequest() If we tried to send a request to a peer not present in the switch, a missing continue statement caused the request to be blackholed in a peer that was removed and never retried. While this bug was manifesting, the reactor kept asking for other blocks that would be stored and never consumed. Added the number of unconsumed blocks in the math for requesting blocks ahead of current processing height so eventually there will be no more blocks requested until the already received ones are consumed. * remove bpPeer's didTimeout field * Use distinct err codes for peer timeout and FSM timeouts * Don't allow peers to update with lower height * review comments from Ethan and Zarko * some cleanup, renaming, comments * Move block execution in separate goroutine * Remove pool's numPending * review comments * fix lint, remove old blockchain reactor and duplicates in fsm tests * small reorg around peer after review comments * add the reactor spec * verify block only once * review comments * change to int for max number of pending requests * cleanup and godoc * Add configuration flag fast sync version * golangci fixes * fix config template * move both reactor versions under blockchain * cleanup, golint, renaming stuff * updated documentation, fixed more golint warnings * integrate with behavior package * sync with master * gofmt * add changelog_pending entry * move to improvments * suggestion to changelog entry
5 years ago
blockchain: Reorg reactor (#3561) * go routines in blockchain reactor * Added reference to the go routine diagram * Initial commit * cleanup * Undo testing_logger change, committed by mistake * Fix the test loggers * pulled some fsm code into pool.go * added pool tests * changes to the design added block requests under peer moved the request trigger in the reactor poolRoutine, triggered now by a ticker in general moved everything required for making block requests smarter in the poolRoutine added a simple map of heights to keep track of what will need to be requested next added a few more tests * send errors to FSM in a different channel than blocks send errors (RemovePeer) from switch on a different channel than the one receiving blocks renamed channels added more pool tests * more pool tests * lint errors * more tests * more tests * switch fast sync to new implementation * fixed data race in tests * cleanup * finished fsm tests * address golangci comments :) * address golangci comments :) * Added timeout on next block needed to advance * updating docs and cleanup * fix issue in test from previous cleanup * cleanup * Added termination scenarios, tests and more cleanup * small fixes to adr, comments and cleanup * Fix bug in sendRequest() If we tried to send a request to a peer not present in the switch, a missing continue statement caused the request to be blackholed in a peer that was removed and never retried. While this bug was manifesting, the reactor kept asking for other blocks that would be stored and never consumed. Added the number of unconsumed blocks in the math for requesting blocks ahead of current processing height so eventually there will be no more blocks requested until the already received ones are consumed. * remove bpPeer's didTimeout field * Use distinct err codes for peer timeout and FSM timeouts * Don't allow peers to update with lower height * review comments from Ethan and Zarko * some cleanup, renaming, comments * Move block execution in separate goroutine * Remove pool's numPending * review comments * fix lint, remove old blockchain reactor and duplicates in fsm tests * small reorg around peer after review comments * add the reactor spec * verify block only once * review comments * change to int for max number of pending requests * cleanup and godoc * Add configuration flag fast sync version * golangci fixes * fix config template * move both reactor versions under blockchain * cleanup, golint, renaming stuff * updated documentation, fixed more golint warnings * integrate with behavior package * sync with master * gofmt * add changelog_pending entry * move to improvments * suggestion to changelog entry
5 years ago
blockchain: Reorg reactor (#3561) * go routines in blockchain reactor * Added reference to the go routine diagram * Initial commit * cleanup * Undo testing_logger change, committed by mistake * Fix the test loggers * pulled some fsm code into pool.go * added pool tests * changes to the design added block requests under peer moved the request trigger in the reactor poolRoutine, triggered now by a ticker in general moved everything required for making block requests smarter in the poolRoutine added a simple map of heights to keep track of what will need to be requested next added a few more tests * send errors to FSM in a different channel than blocks send errors (RemovePeer) from switch on a different channel than the one receiving blocks renamed channels added more pool tests * more pool tests * lint errors * more tests * more tests * switch fast sync to new implementation * fixed data race in tests * cleanup * finished fsm tests * address golangci comments :) * address golangci comments :) * Added timeout on next block needed to advance * updating docs and cleanup * fix issue in test from previous cleanup * cleanup * Added termination scenarios, tests and more cleanup * small fixes to adr, comments and cleanup * Fix bug in sendRequest() If we tried to send a request to a peer not present in the switch, a missing continue statement caused the request to be blackholed in a peer that was removed and never retried. While this bug was manifesting, the reactor kept asking for other blocks that would be stored and never consumed. Added the number of unconsumed blocks in the math for requesting blocks ahead of current processing height so eventually there will be no more blocks requested until the already received ones are consumed. * remove bpPeer's didTimeout field * Use distinct err codes for peer timeout and FSM timeouts * Don't allow peers to update with lower height * review comments from Ethan and Zarko * some cleanup, renaming, comments * Move block execution in separate goroutine * Remove pool's numPending * review comments * fix lint, remove old blockchain reactor and duplicates in fsm tests * small reorg around peer after review comments * add the reactor spec * verify block only once * review comments * change to int for max number of pending requests * cleanup and godoc * Add configuration flag fast sync version * golangci fixes * fix config template * move both reactor versions under blockchain * cleanup, golint, renaming stuff * updated documentation, fixed more golint warnings * integrate with behavior package * sync with master * gofmt * add changelog_pending entry * move to improvments * suggestion to changelog entry
5 years ago
blockchain: Reorg reactor (#3561) * go routines in blockchain reactor * Added reference to the go routine diagram * Initial commit * cleanup * Undo testing_logger change, committed by mistake * Fix the test loggers * pulled some fsm code into pool.go * added pool tests * changes to the design added block requests under peer moved the request trigger in the reactor poolRoutine, triggered now by a ticker in general moved everything required for making block requests smarter in the poolRoutine added a simple map of heights to keep track of what will need to be requested next added a few more tests * send errors to FSM in a different channel than blocks send errors (RemovePeer) from switch on a different channel than the one receiving blocks renamed channels added more pool tests * more pool tests * lint errors * more tests * more tests * switch fast sync to new implementation * fixed data race in tests * cleanup * finished fsm tests * address golangci comments :) * address golangci comments :) * Added timeout on next block needed to advance * updating docs and cleanup * fix issue in test from previous cleanup * cleanup * Added termination scenarios, tests and more cleanup * small fixes to adr, comments and cleanup * Fix bug in sendRequest() If we tried to send a request to a peer not present in the switch, a missing continue statement caused the request to be blackholed in a peer that was removed and never retried. While this bug was manifesting, the reactor kept asking for other blocks that would be stored and never consumed. Added the number of unconsumed blocks in the math for requesting blocks ahead of current processing height so eventually there will be no more blocks requested until the already received ones are consumed. * remove bpPeer's didTimeout field * Use distinct err codes for peer timeout and FSM timeouts * Don't allow peers to update with lower height * review comments from Ethan and Zarko * some cleanup, renaming, comments * Move block execution in separate goroutine * Remove pool's numPending * review comments * fix lint, remove old blockchain reactor and duplicates in fsm tests * small reorg around peer after review comments * add the reactor spec * verify block only once * review comments * change to int for max number of pending requests * cleanup and godoc * Add configuration flag fast sync version * golangci fixes * fix config template * move both reactor versions under blockchain * cleanup, golint, renaming stuff * updated documentation, fixed more golint warnings * integrate with behavior package * sync with master * gofmt * add changelog_pending entry * move to improvments * suggestion to changelog entry
5 years ago
blockchain: Reorg reactor (#3561) * go routines in blockchain reactor * Added reference to the go routine diagram * Initial commit * cleanup * Undo testing_logger change, committed by mistake * Fix the test loggers * pulled some fsm code into pool.go * added pool tests * changes to the design added block requests under peer moved the request trigger in the reactor poolRoutine, triggered now by a ticker in general moved everything required for making block requests smarter in the poolRoutine added a simple map of heights to keep track of what will need to be requested next added a few more tests * send errors to FSM in a different channel than blocks send errors (RemovePeer) from switch on a different channel than the one receiving blocks renamed channels added more pool tests * more pool tests * lint errors * more tests * more tests * switch fast sync to new implementation * fixed data race in tests * cleanup * finished fsm tests * address golangci comments :) * address golangci comments :) * Added timeout on next block needed to advance * updating docs and cleanup * fix issue in test from previous cleanup * cleanup * Added termination scenarios, tests and more cleanup * small fixes to adr, comments and cleanup * Fix bug in sendRequest() If we tried to send a request to a peer not present in the switch, a missing continue statement caused the request to be blackholed in a peer that was removed and never retried. While this bug was manifesting, the reactor kept asking for other blocks that would be stored and never consumed. Added the number of unconsumed blocks in the math for requesting blocks ahead of current processing height so eventually there will be no more blocks requested until the already received ones are consumed. * remove bpPeer's didTimeout field * Use distinct err codes for peer timeout and FSM timeouts * Don't allow peers to update with lower height * review comments from Ethan and Zarko * some cleanup, renaming, comments * Move block execution in separate goroutine * Remove pool's numPending * review comments * fix lint, remove old blockchain reactor and duplicates in fsm tests * small reorg around peer after review comments * add the reactor spec * verify block only once * review comments * change to int for max number of pending requests * cleanup and godoc * Add configuration flag fast sync version * golangci fixes * fix config template * move both reactor versions under blockchain * cleanup, golint, renaming stuff * updated documentation, fixed more golint warnings * integrate with behavior package * sync with master * gofmt * add changelog_pending entry * move to improvments * suggestion to changelog entry
5 years ago
limit number of /subscribe clients and queries per client (#3269) * limit number of /subscribe clients and queries per client Add the following config variables (under [rpc] section): * max_subscription_clients * max_subscriptions_per_client * timeout_broadcast_tx_commit Fixes #2826 new HTTPClient interface for subscriptions finalize HTTPClient events interface remove EventSubscriber fix data race ``` WARNING: DATA RACE Read at 0x00c000a36060 by goroutine 129: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe.func1() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:168 +0x1f0 Previous write at 0x00c000a36060 by goroutine 132: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:191 +0x4e0 github.com/tendermint/tendermint/rpc/client.WaitForOneEvent() /go/src/github.com/tendermint/tendermint/rpc/client/helpers.go:64 +0x178 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync.func1() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:139 +0x298 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 Goroutine 129 (running) created at: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:164 +0x4b7 github.com/tendermint/tendermint/rpc/client.WaitForOneEvent() /go/src/github.com/tendermint/tendermint/rpc/client/helpers.go:64 +0x178 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync.func1() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:139 +0x298 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 Goroutine 132 (running) created at: testing.(*T).Run() /usr/local/go/src/testing/testing.go:878 +0x659 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:119 +0x186 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 ================== ``` lite client works (tested manually) godoc comments httpclient: do not close the out channel use TimeoutBroadcastTxCommit no timeout for unsubscribe but 1s Local (5s HTTP) timeout for resubscribe format code change Subscribe#out cap to 1 and replace config vars with RPCConfig TimeoutBroadcastTxCommit can't be greater than rpcserver.WriteTimeout rpc: Context as first parameter to all functions reformat code fixes after my own review fixes after Ethan's review add test stubs fix config.toml * fixes after manual testing - rpc: do not recommend to use BroadcastTxCommit because it's slow and wastes Tendermint resources (pubsub) - rpc: better error in Subscribe and BroadcastTxCommit - HTTPClient: do not resubscribe if err = ErrAlreadySubscribed * fixes after Ismail's review * Update rpc/grpc/grpc_test.go Co-Authored-By: melekes <anton.kalyaev@gmail.com>
5 years ago
limit number of /subscribe clients and queries per client (#3269) * limit number of /subscribe clients and queries per client Add the following config variables (under [rpc] section): * max_subscription_clients * max_subscriptions_per_client * timeout_broadcast_tx_commit Fixes #2826 new HTTPClient interface for subscriptions finalize HTTPClient events interface remove EventSubscriber fix data race ``` WARNING: DATA RACE Read at 0x00c000a36060 by goroutine 129: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe.func1() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:168 +0x1f0 Previous write at 0x00c000a36060 by goroutine 132: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:191 +0x4e0 github.com/tendermint/tendermint/rpc/client.WaitForOneEvent() /go/src/github.com/tendermint/tendermint/rpc/client/helpers.go:64 +0x178 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync.func1() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:139 +0x298 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 Goroutine 129 (running) created at: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:164 +0x4b7 github.com/tendermint/tendermint/rpc/client.WaitForOneEvent() /go/src/github.com/tendermint/tendermint/rpc/client/helpers.go:64 +0x178 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync.func1() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:139 +0x298 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 Goroutine 132 (running) created at: testing.(*T).Run() /usr/local/go/src/testing/testing.go:878 +0x659 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:119 +0x186 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 ================== ``` lite client works (tested manually) godoc comments httpclient: do not close the out channel use TimeoutBroadcastTxCommit no timeout for unsubscribe but 1s Local (5s HTTP) timeout for resubscribe format code change Subscribe#out cap to 1 and replace config vars with RPCConfig TimeoutBroadcastTxCommit can't be greater than rpcserver.WriteTimeout rpc: Context as first parameter to all functions reformat code fixes after my own review fixes after Ethan's review add test stubs fix config.toml * fixes after manual testing - rpc: do not recommend to use BroadcastTxCommit because it's slow and wastes Tendermint resources (pubsub) - rpc: better error in Subscribe and BroadcastTxCommit - HTTPClient: do not resubscribe if err = ErrAlreadySubscribed * fixes after Ismail's review * Update rpc/grpc/grpc_test.go Co-Authored-By: melekes <anton.kalyaev@gmail.com>
5 years ago
deps: update gogo/protobuf version from v1.2.1 to v1.3.0 (#3947) * update gogo/protobuf version from v1.2.1 to v1.3.0 Also errcheck from v1.1.0 to v1.2.0 See full diff in - https://github.com/gogo/protobuf/compare/v1.2.1...v1.3.0 - https://github.com/kisielk/errcheck/compare/v1.1.0...v1.2.0 Changelog: Tested versions: go 1.12.9 protoc 3.7.1 Improvements: plugin/stringer - Handle repeated and/or nullable types a bit better now. plugin/size - Remove the loop in sovXXX by using bit twiddling. Thanks: https://github.com/apelisse plugin/marshalto - Implemented a reverse marshal strategy which allows for faster marshalling. This now avoids a recursive (and repeated) call to Size(). Thanks: https://github.com/apelisse plugin/compare - Added support for for oneof types. Bug fixes: protoc-gen-gogo/generator - Fix assignment to entry in nil map. Thanks: https://github.com/tgulacsi protoc-gen-gogo/generator - Allows plugins to call RecordTypeUse without panicking. Thanks: https://github.com/fedenusy proto/extensions - Fixed set extension regression. We did not clear the extensions before setting. io/uint32 - fix uint32reader bug that causes ReadMsg to recreate buffer when lengths are the same. Thanks: https://github.com/SebiSujar proto/table_merge: Fix merge of non-nullable slices. Thanks: https://github.com/euroelessar Upstream commits: merged in golang/protobuf commit 318d17de72747ed1c16502681db4b2bb709a92d0 - Add UnimplementedServer for server interface merged in golang/protobuf commit b85cd75de734650db18a99a943fe351d41387800 - protoc-gen-go/grpc: inline errUnimplemented function merged in golang/protobuf commit d3c38a4eb4970272b87a425ae00ccc4548e2f9bb - protoc-gen-go/grpc: use status and code packages only if needed merged in golang/protobuf commit e91709a02e0e8ff8b86b7aa913fdc9ae9498e825 - fix indentation in jsonpb with Any messages merged in golang/protobuf commit 8d0c54c1246661d9a51ca0ba455d22116d485eaa - protoc-gen-go: generate XXX_OneofWrappers instead of XXX_OneofFuncs Misc: extensions.md - Markdown update. Thanks: https://github.com/TennyZhuang Readme.md - Added user. go/protoc update - Updated to go1.12.x and protoc 3.7.1 Makefile update - fix go vet shadow tool reference test/mixbench - Update mixbench tool. Expose runnable benchmarks via flags. * update certstrap * update golangci-lint from v1.13.2 to v1.17.1 * update gox as well * test * comment out golangci temporary * comment out go-deadlock deps
5 years ago
limit number of /subscribe clients and queries per client (#3269) * limit number of /subscribe clients and queries per client Add the following config variables (under [rpc] section): * max_subscription_clients * max_subscriptions_per_client * timeout_broadcast_tx_commit Fixes #2826 new HTTPClient interface for subscriptions finalize HTTPClient events interface remove EventSubscriber fix data race ``` WARNING: DATA RACE Read at 0x00c000a36060 by goroutine 129: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe.func1() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:168 +0x1f0 Previous write at 0x00c000a36060 by goroutine 132: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:191 +0x4e0 github.com/tendermint/tendermint/rpc/client.WaitForOneEvent() /go/src/github.com/tendermint/tendermint/rpc/client/helpers.go:64 +0x178 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync.func1() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:139 +0x298 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 Goroutine 129 (running) created at: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:164 +0x4b7 github.com/tendermint/tendermint/rpc/client.WaitForOneEvent() /go/src/github.com/tendermint/tendermint/rpc/client/helpers.go:64 +0x178 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync.func1() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:139 +0x298 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 Goroutine 132 (running) created at: testing.(*T).Run() /usr/local/go/src/testing/testing.go:878 +0x659 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:119 +0x186 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 ================== ``` lite client works (tested manually) godoc comments httpclient: do not close the out channel use TimeoutBroadcastTxCommit no timeout for unsubscribe but 1s Local (5s HTTP) timeout for resubscribe format code change Subscribe#out cap to 1 and replace config vars with RPCConfig TimeoutBroadcastTxCommit can't be greater than rpcserver.WriteTimeout rpc: Context as first parameter to all functions reformat code fixes after my own review fixes after Ethan's review add test stubs fix config.toml * fixes after manual testing - rpc: do not recommend to use BroadcastTxCommit because it's slow and wastes Tendermint resources (pubsub) - rpc: better error in Subscribe and BroadcastTxCommit - HTTPClient: do not resubscribe if err = ErrAlreadySubscribed * fixes after Ismail's review * Update rpc/grpc/grpc_test.go Co-Authored-By: melekes <anton.kalyaev@gmail.com>
5 years ago
limit number of /subscribe clients and queries per client (#3269) * limit number of /subscribe clients and queries per client Add the following config variables (under [rpc] section): * max_subscription_clients * max_subscriptions_per_client * timeout_broadcast_tx_commit Fixes #2826 new HTTPClient interface for subscriptions finalize HTTPClient events interface remove EventSubscriber fix data race ``` WARNING: DATA RACE Read at 0x00c000a36060 by goroutine 129: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe.func1() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:168 +0x1f0 Previous write at 0x00c000a36060 by goroutine 132: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:191 +0x4e0 github.com/tendermint/tendermint/rpc/client.WaitForOneEvent() /go/src/github.com/tendermint/tendermint/rpc/client/helpers.go:64 +0x178 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync.func1() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:139 +0x298 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 Goroutine 129 (running) created at: github.com/tendermint/tendermint/rpc/client.(*Local).Subscribe() /go/src/github.com/tendermint/tendermint/rpc/client/localclient.go:164 +0x4b7 github.com/tendermint/tendermint/rpc/client.WaitForOneEvent() /go/src/github.com/tendermint/tendermint/rpc/client/helpers.go:64 +0x178 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync.func1() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:139 +0x298 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 Goroutine 132 (running) created at: testing.(*T).Run() /usr/local/go/src/testing/testing.go:878 +0x659 github.com/tendermint/tendermint/rpc/client_test.TestTxEventsSentWithBroadcastTxSync() /go/src/github.com/tendermint/tendermint/rpc/client/event_test.go:119 +0x186 testing.tRunner() /usr/local/go/src/testing/testing.go:827 +0x162 ================== ``` lite client works (tested manually) godoc comments httpclient: do not close the out channel use TimeoutBroadcastTxCommit no timeout for unsubscribe but 1s Local (5s HTTP) timeout for resubscribe format code change Subscribe#out cap to 1 and replace config vars with RPCConfig TimeoutBroadcastTxCommit can't be greater than rpcserver.WriteTimeout rpc: Context as first parameter to all functions reformat code fixes after my own review fixes after Ethan's review add test stubs fix config.toml * fixes after manual testing - rpc: do not recommend to use BroadcastTxCommit because it's slow and wastes Tendermint resources (pubsub) - rpc: better error in Subscribe and BroadcastTxCommit - HTTPClient: do not resubscribe if err = ErrAlreadySubscribed * fixes after Ismail's review * Update rpc/grpc/grpc_test.go Co-Authored-By: melekes <anton.kalyaev@gmail.com>
5 years ago
blockchain: Reorg reactor (#3561) * go routines in blockchain reactor * Added reference to the go routine diagram * Initial commit * cleanup * Undo testing_logger change, committed by mistake * Fix the test loggers * pulled some fsm code into pool.go * added pool tests * changes to the design added block requests under peer moved the request trigger in the reactor poolRoutine, triggered now by a ticker in general moved everything required for making block requests smarter in the poolRoutine added a simple map of heights to keep track of what will need to be requested next added a few more tests * send errors to FSM in a different channel than blocks send errors (RemovePeer) from switch on a different channel than the one receiving blocks renamed channels added more pool tests * more pool tests * lint errors * more tests * more tests * switch fast sync to new implementation * fixed data race in tests * cleanup * finished fsm tests * address golangci comments :) * address golangci comments :) * Added timeout on next block needed to advance * updating docs and cleanup * fix issue in test from previous cleanup * cleanup * Added termination scenarios, tests and more cleanup * small fixes to adr, comments and cleanup * Fix bug in sendRequest() If we tried to send a request to a peer not present in the switch, a missing continue statement caused the request to be blackholed in a peer that was removed and never retried. While this bug was manifesting, the reactor kept asking for other blocks that would be stored and never consumed. Added the number of unconsumed blocks in the math for requesting blocks ahead of current processing height so eventually there will be no more blocks requested until the already received ones are consumed. * remove bpPeer's didTimeout field * Use distinct err codes for peer timeout and FSM timeouts * Don't allow peers to update with lower height * review comments from Ethan and Zarko * some cleanup, renaming, comments * Move block execution in separate goroutine * Remove pool's numPending * review comments * fix lint, remove old blockchain reactor and duplicates in fsm tests * small reorg around peer after review comments * add the reactor spec * verify block only once * review comments * change to int for max number of pending requests * cleanup and godoc * Add configuration flag fast sync version * golangci fixes * fix config template * move both reactor versions under blockchain * cleanup, golint, renaming stuff * updated documentation, fixed more golint warnings * integrate with behavior package * sync with master * gofmt * add changelog_pending entry * move to improvments * suggestion to changelog entry
5 years ago
  1. package config
  2. import (
  3. "fmt"
  4. "net/http"
  5. "os"
  6. "path/filepath"
  7. "time"
  8. "github.com/pkg/errors"
  9. )
  10. const (
  11. // FuzzModeDrop is a mode in which we randomly drop reads/writes, connections or sleep
  12. FuzzModeDrop = iota
  13. // FuzzModeDelay is a mode in which we randomly sleep
  14. FuzzModeDelay
  15. // LogFormatPlain is a format for colored text
  16. LogFormatPlain = "plain"
  17. // LogFormatJSON is a format for json output
  18. LogFormatJSON = "json"
  19. )
  20. // NOTE: Most of the structs & relevant comments + the
  21. // default configuration options were used to manually
  22. // generate the config.toml. Please reflect any changes
  23. // made here in the defaultConfigTemplate constant in
  24. // config/toml.go
  25. // NOTE: libs/cli must know to look in the config dir!
  26. var (
  27. DefaultTendermintDir = ".tendermint"
  28. defaultConfigDir = "config"
  29. defaultDataDir = "data"
  30. defaultConfigFileName = "config.toml"
  31. defaultGenesisJSONName = "genesis.json"
  32. defaultPrivValKeyName = "priv_validator_key.json"
  33. defaultPrivValStateName = "priv_validator_state.json"
  34. defaultNodeKeyName = "node_key.json"
  35. defaultAddrBookName = "addrbook.json"
  36. defaultConfigFilePath = filepath.Join(defaultConfigDir, defaultConfigFileName)
  37. defaultGenesisJSONPath = filepath.Join(defaultConfigDir, defaultGenesisJSONName)
  38. defaultPrivValKeyPath = filepath.Join(defaultConfigDir, defaultPrivValKeyName)
  39. defaultPrivValStatePath = filepath.Join(defaultDataDir, defaultPrivValStateName)
  40. defaultNodeKeyPath = filepath.Join(defaultConfigDir, defaultNodeKeyName)
  41. defaultAddrBookPath = filepath.Join(defaultConfigDir, defaultAddrBookName)
  42. )
  43. var (
  44. oldPrivVal = "priv_validator.json"
  45. oldPrivValPath = filepath.Join(defaultConfigDir, oldPrivVal)
  46. )
  47. // Config defines the top level configuration for a Tendermint node
  48. type Config struct {
  49. // Top level options use an anonymous struct
  50. BaseConfig `mapstructure:",squash"`
  51. // Options for services
  52. RPC *RPCConfig `mapstructure:"rpc"`
  53. P2P *P2PConfig `mapstructure:"p2p"`
  54. Mempool *MempoolConfig `mapstructure:"mempool"`
  55. FastSync *FastSyncConfig `mapstructure:"fastsync"`
  56. Consensus *ConsensusConfig `mapstructure:"consensus"`
  57. TxIndex *TxIndexConfig `mapstructure:"tx_index"`
  58. Instrumentation *InstrumentationConfig `mapstructure:"instrumentation"`
  59. }
  60. // DefaultConfig returns a default configuration for a Tendermint node
  61. func DefaultConfig() *Config {
  62. return &Config{
  63. BaseConfig: DefaultBaseConfig(),
  64. RPC: DefaultRPCConfig(),
  65. P2P: DefaultP2PConfig(),
  66. Mempool: DefaultMempoolConfig(),
  67. FastSync: DefaultFastSyncConfig(),
  68. Consensus: DefaultConsensusConfig(),
  69. TxIndex: DefaultTxIndexConfig(),
  70. Instrumentation: DefaultInstrumentationConfig(),
  71. }
  72. }
  73. // TestConfig returns a configuration that can be used for testing
  74. func TestConfig() *Config {
  75. return &Config{
  76. BaseConfig: TestBaseConfig(),
  77. RPC: TestRPCConfig(),
  78. P2P: TestP2PConfig(),
  79. Mempool: TestMempoolConfig(),
  80. FastSync: TestFastSyncConfig(),
  81. Consensus: TestConsensusConfig(),
  82. TxIndex: TestTxIndexConfig(),
  83. Instrumentation: TestInstrumentationConfig(),
  84. }
  85. }
  86. // SetRoot sets the RootDir for all Config structs
  87. func (cfg *Config) SetRoot(root string) *Config {
  88. cfg.BaseConfig.RootDir = root
  89. cfg.RPC.RootDir = root
  90. cfg.P2P.RootDir = root
  91. cfg.Mempool.RootDir = root
  92. cfg.Consensus.RootDir = root
  93. return cfg
  94. }
  95. // ValidateBasic performs basic validation (checking param bounds, etc.) and
  96. // returns an error if any check fails.
  97. func (cfg *Config) ValidateBasic() error {
  98. if err := cfg.BaseConfig.ValidateBasic(); err != nil {
  99. return err
  100. }
  101. if err := cfg.RPC.ValidateBasic(); err != nil {
  102. return errors.Wrap(err, "Error in [rpc] section")
  103. }
  104. if err := cfg.P2P.ValidateBasic(); err != nil {
  105. return errors.Wrap(err, "Error in [p2p] section")
  106. }
  107. if err := cfg.Mempool.ValidateBasic(); err != nil {
  108. return errors.Wrap(err, "Error in [mempool] section")
  109. }
  110. if err := cfg.FastSync.ValidateBasic(); err != nil {
  111. return errors.Wrap(err, "Error in [fastsync] section")
  112. }
  113. if err := cfg.Consensus.ValidateBasic(); err != nil {
  114. return errors.Wrap(err, "Error in [consensus] section")
  115. }
  116. return errors.Wrap(
  117. cfg.Instrumentation.ValidateBasic(),
  118. "Error in [instrumentation] section",
  119. )
  120. }
  121. //-----------------------------------------------------------------------------
  122. // BaseConfig
  123. // BaseConfig defines the base configuration for a Tendermint node
  124. type BaseConfig struct {
  125. // chainID is unexposed and immutable but here for convenience
  126. chainID string
  127. // The root directory for all data.
  128. // This should be set in viper so it can unmarshal into this struct
  129. RootDir string `mapstructure:"home"`
  130. // TCP or UNIX socket address of the ABCI application,
  131. // or the name of an ABCI application compiled in with the Tendermint binary
  132. ProxyApp string `mapstructure:"proxy_app"`
  133. // A custom human readable name for this node
  134. Moniker string `mapstructure:"moniker"`
  135. // If this node is many blocks behind the tip of the chain, FastSync
  136. // allows them to catchup quickly by downloading blocks in parallel
  137. // and verifying their commits
  138. FastSyncMode bool `mapstructure:"fast_sync"`
  139. // Database backend: goleveldb | cleveldb | boltdb
  140. // * goleveldb (github.com/syndtr/goleveldb - most popular implementation)
  141. // - pure go
  142. // - stable
  143. // * cleveldb (uses levigo wrapper)
  144. // - fast
  145. // - requires gcc
  146. // - use cleveldb build tag (go build -tags cleveldb)
  147. // * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt)
  148. // - EXPERIMENTAL
  149. // - may be faster is some use-cases (random reads - indexer)
  150. // - use boltdb build tag (go build -tags boltdb)
  151. DBBackend string `mapstructure:"db_backend"`
  152. // Database directory
  153. DBPath string `mapstructure:"db_dir"`
  154. // Output level for logging
  155. LogLevel string `mapstructure:"log_level"`
  156. // Output format: 'plain' (colored text) or 'json'
  157. LogFormat string `mapstructure:"log_format"`
  158. // Path to the JSON file containing the initial validator set and other meta data
  159. Genesis string `mapstructure:"genesis_file"`
  160. // Path to the JSON file containing the private key to use as a validator in the consensus protocol
  161. PrivValidatorKey string `mapstructure:"priv_validator_key_file"`
  162. // Path to the JSON file containing the last sign state of a validator
  163. PrivValidatorState string `mapstructure:"priv_validator_state_file"`
  164. // TCP or UNIX socket address for Tendermint to listen on for
  165. // connections from an external PrivValidator process
  166. PrivValidatorListenAddr string `mapstructure:"priv_validator_laddr"`
  167. // A JSON file containing the private key to use for p2p authenticated encryption
  168. NodeKey string `mapstructure:"node_key_file"`
  169. // Mechanism to connect to the ABCI application: socket | grpc
  170. ABCI string `mapstructure:"abci"`
  171. // TCP or UNIX socket address for the profiling server to listen on
  172. ProfListenAddress string `mapstructure:"prof_laddr"`
  173. // If true, query the ABCI app on connecting to a new peer
  174. // so the app can decide if we should keep the connection or not
  175. FilterPeers bool `mapstructure:"filter_peers"` // false
  176. }
  177. // DefaultBaseConfig returns a default base configuration for a Tendermint node
  178. func DefaultBaseConfig() BaseConfig {
  179. return BaseConfig{
  180. Genesis: defaultGenesisJSONPath,
  181. PrivValidatorKey: defaultPrivValKeyPath,
  182. PrivValidatorState: defaultPrivValStatePath,
  183. NodeKey: defaultNodeKeyPath,
  184. Moniker: defaultMoniker,
  185. ProxyApp: "tcp://127.0.0.1:26658",
  186. ABCI: "socket",
  187. LogLevel: DefaultPackageLogLevels(),
  188. LogFormat: LogFormatPlain,
  189. ProfListenAddress: "",
  190. FastSyncMode: true,
  191. FilterPeers: false,
  192. DBBackend: "goleveldb",
  193. DBPath: "data",
  194. }
  195. }
  196. // TestBaseConfig returns a base configuration for testing a Tendermint node
  197. func TestBaseConfig() BaseConfig {
  198. cfg := DefaultBaseConfig()
  199. cfg.chainID = "tendermint_test"
  200. cfg.ProxyApp = "kvstore"
  201. cfg.FastSyncMode = false
  202. cfg.DBBackend = "memdb"
  203. return cfg
  204. }
  205. func (cfg BaseConfig) ChainID() string {
  206. return cfg.chainID
  207. }
  208. // GenesisFile returns the full path to the genesis.json file
  209. func (cfg BaseConfig) GenesisFile() string {
  210. return rootify(cfg.Genesis, cfg.RootDir)
  211. }
  212. // PrivValidatorKeyFile returns the full path to the priv_validator_key.json file
  213. func (cfg BaseConfig) PrivValidatorKeyFile() string {
  214. return rootify(cfg.PrivValidatorKey, cfg.RootDir)
  215. }
  216. // PrivValidatorFile returns the full path to the priv_validator_state.json file
  217. func (cfg BaseConfig) PrivValidatorStateFile() string {
  218. return rootify(cfg.PrivValidatorState, cfg.RootDir)
  219. }
  220. // OldPrivValidatorFile returns the full path of the priv_validator.json from pre v0.28.0.
  221. // TODO: eventually remove.
  222. func (cfg BaseConfig) OldPrivValidatorFile() string {
  223. return rootify(oldPrivValPath, cfg.RootDir)
  224. }
  225. // NodeKeyFile returns the full path to the node_key.json file
  226. func (cfg BaseConfig) NodeKeyFile() string {
  227. return rootify(cfg.NodeKey, cfg.RootDir)
  228. }
  229. // DBDir returns the full path to the database directory
  230. func (cfg BaseConfig) DBDir() string {
  231. return rootify(cfg.DBPath, cfg.RootDir)
  232. }
  233. // ValidateBasic performs basic validation (checking param bounds, etc.) and
  234. // returns an error if any check fails.
  235. func (cfg BaseConfig) ValidateBasic() error {
  236. switch cfg.LogFormat {
  237. case LogFormatPlain, LogFormatJSON:
  238. default:
  239. return errors.New("unknown log_format (must be 'plain' or 'json')")
  240. }
  241. return nil
  242. }
  243. // DefaultLogLevel returns a default log level of "error"
  244. func DefaultLogLevel() string {
  245. return "error"
  246. }
  247. // DefaultPackageLogLevels returns a default log level setting so all packages
  248. // log at "error", while the `state` and `main` packages log at "info"
  249. func DefaultPackageLogLevels() string {
  250. return fmt.Sprintf("main:info,state:info,*:%s", DefaultLogLevel())
  251. }
  252. //-----------------------------------------------------------------------------
  253. // RPCConfig
  254. // RPCConfig defines the configuration options for the Tendermint RPC server
  255. type RPCConfig struct {
  256. RootDir string `mapstructure:"home"`
  257. // TCP or UNIX socket address for the RPC server to listen on
  258. ListenAddress string `mapstructure:"laddr"`
  259. // A list of origins a cross-domain request can be executed from.
  260. // If the special '*' value is present in the list, all origins will be allowed.
  261. // An origin may contain a wildcard (*) to replace 0 or more characters (i.e.: http://*.domain.com).
  262. // Only one wildcard can be used per origin.
  263. CORSAllowedOrigins []string `mapstructure:"cors_allowed_origins"`
  264. // A list of methods the client is allowed to use with cross-domain requests.
  265. CORSAllowedMethods []string `mapstructure:"cors_allowed_methods"`
  266. // A list of non simple headers the client is allowed to use with cross-domain requests.
  267. CORSAllowedHeaders []string `mapstructure:"cors_allowed_headers"`
  268. // TCP or UNIX socket address for the gRPC server to listen on
  269. // NOTE: This server only supports /broadcast_tx_commit
  270. GRPCListenAddress string `mapstructure:"grpc_laddr"`
  271. // Maximum number of simultaneous connections.
  272. // Does not include RPC (HTTP&WebSocket) connections. See max_open_connections
  273. // If you want to accept a larger number than the default, make sure
  274. // you increase your OS limits.
  275. // 0 - unlimited.
  276. GRPCMaxOpenConnections int `mapstructure:"grpc_max_open_connections"`
  277. // Activate unsafe RPC commands like /dial_persistent_peers and /unsafe_flush_mempool
  278. Unsafe bool `mapstructure:"unsafe"`
  279. // Maximum number of simultaneous connections (including WebSocket).
  280. // Does not include gRPC connections. See grpc_max_open_connections
  281. // If you want to accept a larger number than the default, make sure
  282. // you increase your OS limits.
  283. // 0 - unlimited.
  284. // Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
  285. // 1024 - 40 - 10 - 50 = 924 = ~900
  286. MaxOpenConnections int `mapstructure:"max_open_connections"`
  287. // Maximum number of unique clientIDs that can /subscribe
  288. // If you're using /broadcast_tx_commit, set to the estimated maximum number
  289. // of broadcast_tx_commit calls per block.
  290. MaxSubscriptionClients int `mapstructure:"max_subscription_clients"`
  291. // Maximum number of unique queries a given client can /subscribe to
  292. // If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set
  293. // to the estimated maximum number of broadcast_tx_commit calls per block.
  294. MaxSubscriptionsPerClient int `mapstructure:"max_subscriptions_per_client"`
  295. // How long to wait for a tx to be committed during /broadcast_tx_commit
  296. // WARNING: Using a value larger than 10s will result in increasing the
  297. // global HTTP write timeout, which applies to all connections and endpoints.
  298. // See https://github.com/tendermint/tendermint/issues/3435
  299. TimeoutBroadcastTxCommit time.Duration `mapstructure:"timeout_broadcast_tx_commit"`
  300. // Maximum size of request body, in bytes
  301. MaxBodyBytes int64 `mapstructure:"max_body_bytes"`
  302. // Maximum size of request header, in bytes
  303. MaxHeaderBytes int `mapstructure:"max_header_bytes"`
  304. // The path to a file containing certificate that is used to create the HTTPS server.
  305. // Migth be either absolute path or path related to tendermint's config directory.
  306. //
  307. // If the certificate is signed by a certificate authority,
  308. // the certFile should be the concatenation of the server's certificate, any intermediates,
  309. // and the CA's certificate.
  310. //
  311. // NOTE: both tls_cert_file and tls_key_file must be present for Tendermint to create HTTPS server. Otherwise, HTTP server is run.
  312. TLSCertFile string `mapstructure:"tls_cert_file"`
  313. // The path to a file containing matching private key that is used to create the HTTPS server.
  314. // Migth be either absolute path or path related to tendermint's config directory.
  315. //
  316. // NOTE: both tls_cert_file and tls_key_file must be present for Tendermint to create HTTPS server. Otherwise, HTTP server is run.
  317. TLSKeyFile string `mapstructure:"tls_key_file"`
  318. }
  319. // DefaultRPCConfig returns a default configuration for the RPC server
  320. func DefaultRPCConfig() *RPCConfig {
  321. return &RPCConfig{
  322. ListenAddress: "tcp://127.0.0.1:26657",
  323. CORSAllowedOrigins: []string{},
  324. CORSAllowedMethods: []string{http.MethodHead, http.MethodGet, http.MethodPost},
  325. CORSAllowedHeaders: []string{"Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time"},
  326. GRPCListenAddress: "",
  327. GRPCMaxOpenConnections: 900,
  328. Unsafe: false,
  329. MaxOpenConnections: 900,
  330. MaxSubscriptionClients: 100,
  331. MaxSubscriptionsPerClient: 5,
  332. TimeoutBroadcastTxCommit: 10 * time.Second,
  333. MaxBodyBytes: int64(1000000), // 1MB
  334. MaxHeaderBytes: 1 << 20, // same as the net/http default
  335. TLSCertFile: "",
  336. TLSKeyFile: "",
  337. }
  338. }
  339. // TestRPCConfig returns a configuration for testing the RPC server
  340. func TestRPCConfig() *RPCConfig {
  341. cfg := DefaultRPCConfig()
  342. cfg.ListenAddress = "tcp://0.0.0.0:36657"
  343. cfg.GRPCListenAddress = "tcp://0.0.0.0:36658"
  344. cfg.Unsafe = true
  345. return cfg
  346. }
  347. // ValidateBasic performs basic validation (checking param bounds, etc.) and
  348. // returns an error if any check fails.
  349. func (cfg *RPCConfig) ValidateBasic() error {
  350. if cfg.GRPCMaxOpenConnections < 0 {
  351. return errors.New("grpc_max_open_connections can't be negative")
  352. }
  353. if cfg.MaxOpenConnections < 0 {
  354. return errors.New("max_open_connections can't be negative")
  355. }
  356. if cfg.MaxSubscriptionClients < 0 {
  357. return errors.New("max_subscription_clients can't be negative")
  358. }
  359. if cfg.MaxSubscriptionsPerClient < 0 {
  360. return errors.New("max_subscriptions_per_client can't be negative")
  361. }
  362. if cfg.TimeoutBroadcastTxCommit < 0 {
  363. return errors.New("timeout_broadcast_tx_commit can't be negative")
  364. }
  365. if cfg.MaxBodyBytes < 0 {
  366. return errors.New("max_body_bytes can't be negative")
  367. }
  368. if cfg.MaxHeaderBytes < 0 {
  369. return errors.New("max_header_bytes can't be negative")
  370. }
  371. return nil
  372. }
  373. // IsCorsEnabled returns true if cross-origin resource sharing is enabled.
  374. func (cfg *RPCConfig) IsCorsEnabled() bool {
  375. return len(cfg.CORSAllowedOrigins) != 0
  376. }
  377. func (cfg RPCConfig) KeyFile() string {
  378. path := cfg.TLSKeyFile
  379. if filepath.IsAbs(path) {
  380. return path
  381. }
  382. return rootify(filepath.Join(defaultConfigDir, path), cfg.RootDir)
  383. }
  384. func (cfg RPCConfig) CertFile() string {
  385. path := cfg.TLSCertFile
  386. if filepath.IsAbs(path) {
  387. return path
  388. }
  389. return rootify(filepath.Join(defaultConfigDir, path), cfg.RootDir)
  390. }
  391. func (cfg RPCConfig) IsTLSEnabled() bool {
  392. return cfg.TLSCertFile != "" && cfg.TLSKeyFile != ""
  393. }
  394. //-----------------------------------------------------------------------------
  395. // P2PConfig
  396. // P2PConfig defines the configuration options for the Tendermint peer-to-peer networking layer
  397. type P2PConfig struct {
  398. RootDir string `mapstructure:"home"`
  399. // Address to listen for incoming connections
  400. ListenAddress string `mapstructure:"laddr"`
  401. // Address to advertise to peers for them to dial
  402. ExternalAddress string `mapstructure:"external_address"`
  403. // Comma separated list of seed nodes to connect to
  404. // We only use these if we can’t connect to peers in the addrbook
  405. Seeds string `mapstructure:"seeds"`
  406. // Comma separated list of nodes to keep persistent connections to
  407. PersistentPeers string `mapstructure:"persistent_peers"`
  408. // UPNP port forwarding
  409. UPNP bool `mapstructure:"upnp"`
  410. // Path to address book
  411. AddrBook string `mapstructure:"addr_book_file"`
  412. // Set true for strict address routability rules
  413. // Set false for private or local networks
  414. AddrBookStrict bool `mapstructure:"addr_book_strict"`
  415. // Maximum number of inbound peers
  416. MaxNumInboundPeers int `mapstructure:"max_num_inbound_peers"`
  417. // Maximum number of outbound peers to connect to, excluding persistent peers
  418. MaxNumOutboundPeers int `mapstructure:"max_num_outbound_peers"`
  419. // Time to wait before flushing messages out on the connection
  420. FlushThrottleTimeout time.Duration `mapstructure:"flush_throttle_timeout"`
  421. // Maximum size of a message packet payload, in bytes
  422. MaxPacketMsgPayloadSize int `mapstructure:"max_packet_msg_payload_size"`
  423. // Rate at which packets can be sent, in bytes/second
  424. SendRate int64 `mapstructure:"send_rate"`
  425. // Rate at which packets can be received, in bytes/second
  426. RecvRate int64 `mapstructure:"recv_rate"`
  427. // Set true to enable the peer-exchange reactor
  428. PexReactor bool `mapstructure:"pex"`
  429. // Seed mode, in which node constantly crawls the network and looks for
  430. // peers. If another node asks it for addresses, it responds and disconnects.
  431. //
  432. // Does not work if the peer-exchange reactor is disabled.
  433. SeedMode bool `mapstructure:"seed_mode"`
  434. // Comma separated list of peer IDs to keep private (will not be gossiped to
  435. // other peers)
  436. PrivatePeerIDs string `mapstructure:"private_peer_ids"`
  437. // Toggle to disable guard against peers connecting from the same ip.
  438. AllowDuplicateIP bool `mapstructure:"allow_duplicate_ip"`
  439. // Peer connection configuration.
  440. HandshakeTimeout time.Duration `mapstructure:"handshake_timeout"`
  441. DialTimeout time.Duration `mapstructure:"dial_timeout"`
  442. // Testing params.
  443. // Force dial to fail
  444. TestDialFail bool `mapstructure:"test_dial_fail"`
  445. // FUzz connection
  446. TestFuzz bool `mapstructure:"test_fuzz"`
  447. TestFuzzConfig *FuzzConnConfig `mapstructure:"test_fuzz_config"`
  448. }
  449. // DefaultP2PConfig returns a default configuration for the peer-to-peer layer
  450. func DefaultP2PConfig() *P2PConfig {
  451. return &P2PConfig{
  452. ListenAddress: "tcp://0.0.0.0:26656",
  453. ExternalAddress: "",
  454. UPNP: false,
  455. AddrBook: defaultAddrBookPath,
  456. AddrBookStrict: true,
  457. MaxNumInboundPeers: 40,
  458. MaxNumOutboundPeers: 10,
  459. FlushThrottleTimeout: 100 * time.Millisecond,
  460. MaxPacketMsgPayloadSize: 1024, // 1 kB
  461. SendRate: 5120000, // 5 mB/s
  462. RecvRate: 5120000, // 5 mB/s
  463. PexReactor: true,
  464. SeedMode: false,
  465. AllowDuplicateIP: false,
  466. HandshakeTimeout: 20 * time.Second,
  467. DialTimeout: 3 * time.Second,
  468. TestDialFail: false,
  469. TestFuzz: false,
  470. TestFuzzConfig: DefaultFuzzConnConfig(),
  471. }
  472. }
  473. // TestP2PConfig returns a configuration for testing the peer-to-peer layer
  474. func TestP2PConfig() *P2PConfig {
  475. cfg := DefaultP2PConfig()
  476. cfg.ListenAddress = "tcp://0.0.0.0:36656"
  477. cfg.FlushThrottleTimeout = 10 * time.Millisecond
  478. cfg.AllowDuplicateIP = true
  479. return cfg
  480. }
  481. // AddrBookFile returns the full path to the address book
  482. func (cfg *P2PConfig) AddrBookFile() string {
  483. return rootify(cfg.AddrBook, cfg.RootDir)
  484. }
  485. // ValidateBasic performs basic validation (checking param bounds, etc.) and
  486. // returns an error if any check fails.
  487. func (cfg *P2PConfig) ValidateBasic() error {
  488. if cfg.MaxNumInboundPeers < 0 {
  489. return errors.New("max_num_inbound_peers can't be negative")
  490. }
  491. if cfg.MaxNumOutboundPeers < 0 {
  492. return errors.New("max_num_outbound_peers can't be negative")
  493. }
  494. if cfg.FlushThrottleTimeout < 0 {
  495. return errors.New("flush_throttle_timeout can't be negative")
  496. }
  497. if cfg.MaxPacketMsgPayloadSize < 0 {
  498. return errors.New("max_packet_msg_payload_size can't be negative")
  499. }
  500. if cfg.SendRate < 0 {
  501. return errors.New("send_rate can't be negative")
  502. }
  503. if cfg.RecvRate < 0 {
  504. return errors.New("recv_rate can't be negative")
  505. }
  506. return nil
  507. }
  508. // FuzzConnConfig is a FuzzedConnection configuration.
  509. type FuzzConnConfig struct {
  510. Mode int
  511. MaxDelay time.Duration
  512. ProbDropRW float64
  513. ProbDropConn float64
  514. ProbSleep float64
  515. }
  516. // DefaultFuzzConnConfig returns the default config.
  517. func DefaultFuzzConnConfig() *FuzzConnConfig {
  518. return &FuzzConnConfig{
  519. Mode: FuzzModeDrop,
  520. MaxDelay: 3 * time.Second,
  521. ProbDropRW: 0.2,
  522. ProbDropConn: 0.00,
  523. ProbSleep: 0.00,
  524. }
  525. }
  526. //-----------------------------------------------------------------------------
  527. // MempoolConfig
  528. // MempoolConfig defines the configuration options for the Tendermint mempool
  529. type MempoolConfig struct {
  530. RootDir string `mapstructure:"home"`
  531. Recheck bool `mapstructure:"recheck"`
  532. Broadcast bool `mapstructure:"broadcast"`
  533. WalPath string `mapstructure:"wal_dir"`
  534. Size int `mapstructure:"size"`
  535. MaxTxsBytes int64 `mapstructure:"max_txs_bytes"`
  536. CacheSize int `mapstructure:"cache_size"`
  537. MaxTxBytes int `mapstructure:"max_tx_bytes"`
  538. }
  539. // DefaultMempoolConfig returns a default configuration for the Tendermint mempool
  540. func DefaultMempoolConfig() *MempoolConfig {
  541. return &MempoolConfig{
  542. Recheck: true,
  543. Broadcast: true,
  544. WalPath: "",
  545. // Each signature verification takes .5ms, Size reduced until we implement
  546. // ABCI Recheck
  547. Size: 5000,
  548. MaxTxsBytes: 1024 * 1024 * 1024, // 1GB
  549. CacheSize: 10000,
  550. MaxTxBytes: 1024 * 1024, // 1MB
  551. }
  552. }
  553. // TestMempoolConfig returns a configuration for testing the Tendermint mempool
  554. func TestMempoolConfig() *MempoolConfig {
  555. cfg := DefaultMempoolConfig()
  556. cfg.CacheSize = 1000
  557. return cfg
  558. }
  559. // WalDir returns the full path to the mempool's write-ahead log
  560. func (cfg *MempoolConfig) WalDir() string {
  561. return rootify(cfg.WalPath, cfg.RootDir)
  562. }
  563. // WalEnabled returns true if the WAL is enabled.
  564. func (cfg *MempoolConfig) WalEnabled() bool {
  565. return cfg.WalPath != ""
  566. }
  567. // ValidateBasic performs basic validation (checking param bounds, etc.) and
  568. // returns an error if any check fails.
  569. func (cfg *MempoolConfig) ValidateBasic() error {
  570. if cfg.Size < 0 {
  571. return errors.New("size can't be negative")
  572. }
  573. if cfg.MaxTxsBytes < 0 {
  574. return errors.New("max_txs_bytes can't be negative")
  575. }
  576. if cfg.CacheSize < 0 {
  577. return errors.New("cache_size can't be negative")
  578. }
  579. if cfg.MaxTxBytes < 0 {
  580. return errors.New("max_tx_bytes can't be negative")
  581. }
  582. return nil
  583. }
  584. //-----------------------------------------------------------------------------
  585. // FastSyncConfig
  586. // FastSyncConfig defines the configuration for the Tendermint fast sync service
  587. type FastSyncConfig struct {
  588. Version string `mapstructure:"version"`
  589. }
  590. // DefaultFastSyncConfig returns a default configuration for the fast sync service
  591. func DefaultFastSyncConfig() *FastSyncConfig {
  592. return &FastSyncConfig{
  593. Version: "v0",
  594. }
  595. }
  596. // TestFastSyncConfig returns a default configuration for the fast sync.
  597. func TestFastSyncConfig() *FastSyncConfig {
  598. return DefaultFastSyncConfig()
  599. }
  600. // ValidateBasic performs basic validation.
  601. func (cfg *FastSyncConfig) ValidateBasic() error {
  602. switch cfg.Version {
  603. case "v0":
  604. return nil
  605. case "v1":
  606. return nil
  607. default:
  608. return fmt.Errorf("unknown fastsync version %s", cfg.Version)
  609. }
  610. }
  611. //-----------------------------------------------------------------------------
  612. // ConsensusConfig
  613. // ConsensusConfig defines the configuration for the Tendermint consensus service,
  614. // including timeouts and details about the WAL and the block structure.
  615. type ConsensusConfig struct {
  616. RootDir string `mapstructure:"home"`
  617. WalPath string `mapstructure:"wal_file"`
  618. walFile string // overrides WalPath if set
  619. TimeoutPropose time.Duration `mapstructure:"timeout_propose"`
  620. TimeoutProposeDelta time.Duration `mapstructure:"timeout_propose_delta"`
  621. TimeoutPrevote time.Duration `mapstructure:"timeout_prevote"`
  622. TimeoutPrevoteDelta time.Duration `mapstructure:"timeout_prevote_delta"`
  623. TimeoutPrecommit time.Duration `mapstructure:"timeout_precommit"`
  624. TimeoutPrecommitDelta time.Duration `mapstructure:"timeout_precommit_delta"`
  625. TimeoutCommit time.Duration `mapstructure:"timeout_commit"`
  626. // Make progress as soon as we have all the precommits (as if TimeoutCommit = 0)
  627. SkipTimeoutCommit bool `mapstructure:"skip_timeout_commit"`
  628. // EmptyBlocks mode and possible interval between empty blocks
  629. CreateEmptyBlocks bool `mapstructure:"create_empty_blocks"`
  630. CreateEmptyBlocksInterval time.Duration `mapstructure:"create_empty_blocks_interval"`
  631. // Reactor sleep duration parameters
  632. PeerGossipSleepDuration time.Duration `mapstructure:"peer_gossip_sleep_duration"`
  633. PeerQueryMaj23SleepDuration time.Duration `mapstructure:"peer_query_maj23_sleep_duration"`
  634. }
  635. // DefaultConsensusConfig returns a default configuration for the consensus service
  636. func DefaultConsensusConfig() *ConsensusConfig {
  637. return &ConsensusConfig{
  638. WalPath: filepath.Join(defaultDataDir, "cs.wal", "wal"),
  639. TimeoutPropose: 3000 * time.Millisecond,
  640. TimeoutProposeDelta: 500 * time.Millisecond,
  641. TimeoutPrevote: 1000 * time.Millisecond,
  642. TimeoutPrevoteDelta: 500 * time.Millisecond,
  643. TimeoutPrecommit: 1000 * time.Millisecond,
  644. TimeoutPrecommitDelta: 500 * time.Millisecond,
  645. TimeoutCommit: 1000 * time.Millisecond,
  646. SkipTimeoutCommit: false,
  647. CreateEmptyBlocks: true,
  648. CreateEmptyBlocksInterval: 0 * time.Second,
  649. PeerGossipSleepDuration: 100 * time.Millisecond,
  650. PeerQueryMaj23SleepDuration: 2000 * time.Millisecond,
  651. }
  652. }
  653. // TestConsensusConfig returns a configuration for testing the consensus service
  654. func TestConsensusConfig() *ConsensusConfig {
  655. cfg := DefaultConsensusConfig()
  656. cfg.TimeoutPropose = 40 * time.Millisecond
  657. cfg.TimeoutProposeDelta = 1 * time.Millisecond
  658. cfg.TimeoutPrevote = 10 * time.Millisecond
  659. cfg.TimeoutPrevoteDelta = 1 * time.Millisecond
  660. cfg.TimeoutPrecommit = 10 * time.Millisecond
  661. cfg.TimeoutPrecommitDelta = 1 * time.Millisecond
  662. cfg.TimeoutCommit = 10 * time.Millisecond
  663. cfg.SkipTimeoutCommit = true
  664. cfg.PeerGossipSleepDuration = 5 * time.Millisecond
  665. cfg.PeerQueryMaj23SleepDuration = 250 * time.Millisecond
  666. return cfg
  667. }
  668. // WaitForTxs returns true if the consensus should wait for transactions before entering the propose step
  669. func (cfg *ConsensusConfig) WaitForTxs() bool {
  670. return !cfg.CreateEmptyBlocks || cfg.CreateEmptyBlocksInterval > 0
  671. }
  672. // Propose returns the amount of time to wait for a proposal
  673. func (cfg *ConsensusConfig) Propose(round int) time.Duration {
  674. return time.Duration(
  675. cfg.TimeoutPropose.Nanoseconds()+cfg.TimeoutProposeDelta.Nanoseconds()*int64(round),
  676. ) * time.Nanosecond
  677. }
  678. // Prevote returns the amount of time to wait for straggler votes after receiving any +2/3 prevotes
  679. func (cfg *ConsensusConfig) Prevote(round int) time.Duration {
  680. return time.Duration(
  681. cfg.TimeoutPrevote.Nanoseconds()+cfg.TimeoutPrevoteDelta.Nanoseconds()*int64(round),
  682. ) * time.Nanosecond
  683. }
  684. // Precommit returns the amount of time to wait for straggler votes after receiving any +2/3 precommits
  685. func (cfg *ConsensusConfig) Precommit(round int) time.Duration {
  686. return time.Duration(
  687. cfg.TimeoutPrecommit.Nanoseconds()+cfg.TimeoutPrecommitDelta.Nanoseconds()*int64(round),
  688. ) * time.Nanosecond
  689. }
  690. // Commit returns the amount of time to wait for straggler votes after receiving +2/3 precommits for a single block (ie. a commit).
  691. func (cfg *ConsensusConfig) Commit(t time.Time) time.Time {
  692. return t.Add(cfg.TimeoutCommit)
  693. }
  694. // WalFile returns the full path to the write-ahead log file
  695. func (cfg *ConsensusConfig) WalFile() string {
  696. if cfg.walFile != "" {
  697. return cfg.walFile
  698. }
  699. return rootify(cfg.WalPath, cfg.RootDir)
  700. }
  701. // SetWalFile sets the path to the write-ahead log file
  702. func (cfg *ConsensusConfig) SetWalFile(walFile string) {
  703. cfg.walFile = walFile
  704. }
  705. // ValidateBasic performs basic validation (checking param bounds, etc.) and
  706. // returns an error if any check fails.
  707. func (cfg *ConsensusConfig) ValidateBasic() error {
  708. if cfg.TimeoutPropose < 0 {
  709. return errors.New("timeout_propose can't be negative")
  710. }
  711. if cfg.TimeoutProposeDelta < 0 {
  712. return errors.New("timeout_propose_delta can't be negative")
  713. }
  714. if cfg.TimeoutPrevote < 0 {
  715. return errors.New("timeout_prevote can't be negative")
  716. }
  717. if cfg.TimeoutPrevoteDelta < 0 {
  718. return errors.New("timeout_prevote_delta can't be negative")
  719. }
  720. if cfg.TimeoutPrecommit < 0 {
  721. return errors.New("timeout_precommit can't be negative")
  722. }
  723. if cfg.TimeoutPrecommitDelta < 0 {
  724. return errors.New("timeout_precommit_delta can't be negative")
  725. }
  726. if cfg.TimeoutCommit < 0 {
  727. return errors.New("timeout_commit can't be negative")
  728. }
  729. if cfg.CreateEmptyBlocksInterval < 0 {
  730. return errors.New("create_empty_blocks_interval can't be negative")
  731. }
  732. if cfg.PeerGossipSleepDuration < 0 {
  733. return errors.New("peer_gossip_sleep_duration can't be negative")
  734. }
  735. if cfg.PeerQueryMaj23SleepDuration < 0 {
  736. return errors.New("peer_query_maj23_sleep_duration can't be negative")
  737. }
  738. return nil
  739. }
  740. //-----------------------------------------------------------------------------
  741. // TxIndexConfig
  742. // TxIndexConfig defines the configuration for the transaction indexer,
  743. // including tags to index.
  744. type TxIndexConfig struct {
  745. // What indexer to use for transactions
  746. //
  747. // Options:
  748. // 1) "null"
  749. // 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend).
  750. Indexer string `mapstructure:"indexer"`
  751. // Comma-separated list of tags to index (by default the only tag is "tx.hash")
  752. //
  753. // You can also index transactions by height by adding "tx.height" tag here.
  754. //
  755. // It's recommended to index only a subset of tags due to possible memory
  756. // bloat. This is, of course, depends on the indexer's DB and the volume of
  757. // transactions.
  758. IndexTags string `mapstructure:"index_tags"`
  759. // When set to true, tells indexer to index all tags (predefined tags:
  760. // "tx.hash", "tx.height" and all tags from DeliverTx responses).
  761. //
  762. // Note this may be not desirable (see the comment above). IndexTags has a
  763. // precedence over IndexAllTags (i.e. when given both, IndexTags will be
  764. // indexed).
  765. IndexAllTags bool `mapstructure:"index_all_tags"`
  766. }
  767. // DefaultTxIndexConfig returns a default configuration for the transaction indexer.
  768. func DefaultTxIndexConfig() *TxIndexConfig {
  769. return &TxIndexConfig{
  770. Indexer: "kv",
  771. IndexTags: "",
  772. IndexAllTags: false,
  773. }
  774. }
  775. // TestTxIndexConfig returns a default configuration for the transaction indexer.
  776. func TestTxIndexConfig() *TxIndexConfig {
  777. return DefaultTxIndexConfig()
  778. }
  779. //-----------------------------------------------------------------------------
  780. // InstrumentationConfig
  781. // InstrumentationConfig defines the configuration for metrics reporting.
  782. type InstrumentationConfig struct {
  783. // When true, Prometheus metrics are served under /metrics on
  784. // PrometheusListenAddr.
  785. // Check out the documentation for the list of available metrics.
  786. Prometheus bool `mapstructure:"prometheus"`
  787. // Address to listen for Prometheus collector(s) connections.
  788. PrometheusListenAddr string `mapstructure:"prometheus_listen_addr"`
  789. // Maximum number of simultaneous connections.
  790. // If you want to accept a larger number than the default, make sure
  791. // you increase your OS limits.
  792. // 0 - unlimited.
  793. MaxOpenConnections int `mapstructure:"max_open_connections"`
  794. // Instrumentation namespace.
  795. Namespace string `mapstructure:"namespace"`
  796. }
  797. // DefaultInstrumentationConfig returns a default configuration for metrics
  798. // reporting.
  799. func DefaultInstrumentationConfig() *InstrumentationConfig {
  800. return &InstrumentationConfig{
  801. Prometheus: false,
  802. PrometheusListenAddr: ":26660",
  803. MaxOpenConnections: 3,
  804. Namespace: "tendermint",
  805. }
  806. }
  807. // TestInstrumentationConfig returns a default configuration for metrics
  808. // reporting.
  809. func TestInstrumentationConfig() *InstrumentationConfig {
  810. return DefaultInstrumentationConfig()
  811. }
  812. // ValidateBasic performs basic validation (checking param bounds, etc.) and
  813. // returns an error if any check fails.
  814. func (cfg *InstrumentationConfig) ValidateBasic() error {
  815. if cfg.MaxOpenConnections < 0 {
  816. return errors.New("max_open_connections can't be negative")
  817. }
  818. return nil
  819. }
  820. //-----------------------------------------------------------------------------
  821. // Utils
  822. // helper function to make config creation independent of root dir
  823. func rootify(path, root string) string {
  824. if filepath.IsAbs(path) {
  825. return path
  826. }
  827. return filepath.Join(root, path)
  828. }
  829. //-----------------------------------------------------------------------------
  830. // Moniker
  831. var defaultMoniker = getDefaultMoniker()
  832. // getDefaultMoniker returns a default moniker, which is the host name. If runtime
  833. // fails to get the host name, "anonymous" will be returned.
  834. func getDefaultMoniker() string {
  835. moniker, err := os.Hostname()
  836. if err != nil {
  837. moniker = "anonymous"
  838. }
  839. return moniker
  840. }