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.

315 lines
10 KiB

7 years ago
6 years ago
9 years ago
p2p: fix infinite loop in addrbook (#3232) * failing test * fix infinite loop in addrbook There are cases where we only have a small number of addresses marked good ("old"), but the selection mechanism keeps trying to select more of these addresses, and hence ends up in an infinite loop. Here we fix this to only try and select such "old" addresses if we have enough of them. Note this means, if we don't have enough of them, we may return more "new" addresses than otherwise expected by the newSelectionBias. This whole GetSelectionWithBias method probably needs to be rewritten, but this is a quick fix for the issue. * changelog * fix infinite loop if not enough new addrs * fix another potential infinite loop if a.nNew == 0 -> pickFromOldBucket=true, but we don't have enough items (a.nOld > len(oldBucketToAddrsMap) false) * Revert "fix another potential infinite loop" This reverts commit 146540c1125597162bd89820d611f6531f5e5e4b. * check num addresses instead of buckets, new test * fixed the int division * add slack to bias % in test, lint fixes * Added checks for selection content in test * test cleanup * Apply suggestions from code review Co-Authored-By: ebuchman <ethan@coinculture.info> * address review comments * change after Anton's review comments * use the same docker image we use for testing when building a binary for localnet * switch back to circleci classic * more review comments * more review comments * refactor addrbook_test * build linux binary inside docker in attempt to fix ``` --> Running dep + make build-linux GOOS=linux GOARCH=amd64 make build make[1]: Entering directory `/home/circleci/.go_workspace/src/github.com/tendermint/tendermint' CGO_ENABLED=0 go build -ldflags "-X github.com/tendermint/tendermint/version.GitCommit=`git rev-parse --short=8 HEAD`" -tags 'tendermint' -o build/tendermint ./cmd/tendermint/ p2p/pex/addrbook.go:373:13: undefined: math.Round ``` * change dir from /usr to /go * use concrete Go version for localnet binary * check for nil addresses just to be sure
6 years ago
  1. GOTOOLS = \
  2. github.com/mitchellh/gox \
  3. github.com/golang/dep/cmd/dep \
  4. github.com/golangci/golangci-lint/cmd/golangci-lint \
  5. github.com/gogo/protobuf/protoc-gen-gogo \
  6. github.com/square/certstrap
  7. GOBIN?=${GOPATH}/bin
  8. PACKAGES=$(shell go list ./...)
  9. OUTPUT?=build/tendermint
  10. INCLUDE = -I=. -I=${GOPATH}/src -I=${GOPATH}/src/github.com/gogo/protobuf/protobuf
  11. BUILD_TAGS?='tendermint'
  12. BUILD_FLAGS = -ldflags "-X github.com/tendermint/tendermint/version.GitCommit=`git rev-parse --short=8 HEAD`"
  13. all: check build test install
  14. check: check_tools get_vendor_deps
  15. ########################################
  16. ### Build Tendermint
  17. build:
  18. CGO_ENABLED=0 go build $(BUILD_FLAGS) -tags $(BUILD_TAGS) -o $(OUTPUT) ./cmd/tendermint/
  19. build_c:
  20. CGO_ENABLED=1 go build $(BUILD_FLAGS) -tags "$(BUILD_TAGS) gcc" -o $(OUTPUT) ./cmd/tendermint/
  21. build_race:
  22. CGO_ENABLED=0 go build -race $(BUILD_FLAGS) -tags $(BUILD_TAGS) -o $(OUTPUT) ./cmd/tendermint
  23. install:
  24. CGO_ENABLED=0 go install $(BUILD_FLAGS) -tags $(BUILD_TAGS) ./cmd/tendermint
  25. install_c:
  26. CGO_ENABLED=1 go install $(BUILD_FLAGS) -tags "$(BUILD_TAGS) gcc" ./cmd/tendermint
  27. ########################################
  28. ### Protobuf
  29. protoc_all: protoc_libs protoc_merkle protoc_abci protoc_grpc protoc_proto3types
  30. %.pb.go: %.proto
  31. ## If you get the following error,
  32. ## "error while loading shared libraries: libprotobuf.so.14: cannot open shared object file: No such file or directory"
  33. ## See https://stackoverflow.com/a/25518702
  34. ## Note the $< here is substituted for the %.proto
  35. ## Note the $@ here is substituted for the %.pb.go
  36. protoc $(INCLUDE) $< --gogo_out=Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,plugins=grpc:.
  37. ########################################
  38. ### Build ABCI
  39. # see protobuf section above
  40. protoc_abci: abci/types/types.pb.go
  41. protoc_proto3types: types/proto3/block.pb.go
  42. build_abci:
  43. @go build -i ./abci/cmd/...
  44. install_abci:
  45. @go install ./abci/cmd/...
  46. ########################################
  47. ### Distribution
  48. # dist builds binaries for all platforms and packages them for distribution
  49. # TODO add abci to these scripts
  50. dist:
  51. @BUILD_TAGS=$(BUILD_TAGS) sh -c "'$(CURDIR)/scripts/dist.sh'"
  52. ########################################
  53. ### Tools & dependencies
  54. check_tools:
  55. @# https://stackoverflow.com/a/25668869
  56. @echo "Found tools: $(foreach tool,$(notdir $(GOTOOLS)),\
  57. $(if $(shell which $(tool)),$(tool),$(error "No $(tool) in PATH")))"
  58. get_tools:
  59. @echo "--> Installing tools"
  60. ./scripts/get_tools.sh
  61. update_tools:
  62. @echo "--> Updating tools"
  63. ./scripts/get_tools.sh
  64. #Update dependencies
  65. get_vendor_deps:
  66. @echo "--> Running dep"
  67. @dep ensure
  68. #For ABCI and libs
  69. get_protoc:
  70. @# https://github.com/google/protobuf/releases
  71. curl -L https://github.com/google/protobuf/releases/download/v3.6.1/protobuf-cpp-3.6.1.tar.gz | tar xvz && \
  72. cd protobuf-3.6.1 && \
  73. DIST_LANG=cpp ./configure && \
  74. make && \
  75. make check && \
  76. sudo make install && \
  77. sudo ldconfig && \
  78. cd .. && \
  79. rm -rf protobuf-3.6.1
  80. draw_deps:
  81. @# requires brew install graphviz or apt-get install graphviz
  82. go get github.com/RobotsAndPencils/goviz
  83. @goviz -i github.com/tendermint/tendermint/cmd/tendermint -d 3 | dot -Tpng -o dependency-graph.png
  84. get_deps_bin_size:
  85. @# Copy of build recipe with additional flags to perform binary size analysis
  86. $(eval $(shell go build -work -a $(BUILD_FLAGS) -tags $(BUILD_TAGS) -o $(OUTPUT) ./cmd/tendermint/ 2>&1))
  87. @find $(WORK) -type f -name "*.a" | xargs -I{} du -hxs "{}" | sort -rh | sed -e s:${WORK}/::g > deps_bin_size.log
  88. @echo "Results can be found here: $(CURDIR)/deps_bin_size.log"
  89. ########################################
  90. ### Libs
  91. protoc_libs: libs/common/types.pb.go
  92. gen_certs: clean_certs
  93. ## Generating certificates for TLS testing...
  94. certstrap init --common-name "tendermint.com" --passphrase ""
  95. certstrap request-cert -ip "::" --passphrase ""
  96. certstrap sign "::" --CA "tendermint.com" --passphrase ""
  97. mv out/::.crt out/::.key db/remotedb
  98. clean_certs:
  99. ## Cleaning TLS testing certificates...
  100. rm -rf out
  101. rm -f db/remotedb/::.crt db/remotedb/::.key
  102. test_libs: gen_certs
  103. go test -tags gcc $(PACKAGES)
  104. make clean_certs
  105. grpc_dbserver:
  106. protoc -I db/remotedb/proto/ db/remotedb/proto/defs.proto --go_out=plugins=grpc:db/remotedb/proto
  107. protoc_grpc: rpc/grpc/types.pb.go
  108. protoc_merkle: crypto/merkle/merkle.pb.go
  109. ########################################
  110. ### Testing
  111. ## required to be run first by most tests
  112. build_docker_test_image:
  113. docker build -t tester -f ./test/docker/Dockerfile .
  114. ### coverage, app, persistence, and libs tests
  115. test_cover:
  116. # run the go unit tests with coverage
  117. bash test/test_cover.sh
  118. test_apps:
  119. # run the app tests using bash
  120. # requires `abci-cli` and `tendermint` binaries installed
  121. bash test/app/test.sh
  122. test_abci_apps:
  123. bash abci/tests/test_app/test.sh
  124. test_abci_cli:
  125. # test the cli against the examples in the tutorial at:
  126. # ./docs/abci-cli.md
  127. # if test fails, update the docs ^
  128. @ bash abci/tests/test_cli/test.sh
  129. test_persistence:
  130. # run the persistence tests using bash
  131. # requires `abci-cli` installed
  132. docker run --name run_persistence -t tester bash test/persist/test_failure_indices.sh
  133. # TODO undockerize
  134. # bash test/persist/test_failure_indices.sh
  135. test_p2p:
  136. docker rm -f rsyslog || true
  137. rm -rf test/logs || true
  138. mkdir test/logs
  139. cd test/
  140. docker run -d -v "logs:/var/log/" -p 127.0.0.1:5514:514/udp --name rsyslog voxxit/rsyslog
  141. cd ..
  142. # requires 'tester' the image from above
  143. bash test/p2p/test.sh tester
  144. # the `docker cp` takes a really long time; uncomment for debugging
  145. #
  146. # mkdir -p test/p2p/logs && docker cp rsyslog:/var/log test/p2p/logs
  147. test_integrations:
  148. make build_docker_test_image
  149. make get_tools
  150. make get_vendor_deps
  151. make install
  152. make test_cover
  153. make test_apps
  154. make test_abci_apps
  155. make test_abci_cli
  156. make test_libs
  157. make test_persistence
  158. make test_p2p
  159. test_release:
  160. @go test -tags release $(PACKAGES)
  161. test100:
  162. @for i in {1..100}; do make test; done
  163. vagrant_test:
  164. vagrant up
  165. vagrant ssh -c 'make test_integrations'
  166. ### go tests
  167. test:
  168. @echo "--> Running go test"
  169. @go test -p 1 $(PACKAGES)
  170. test_race:
  171. @echo "--> Running go test --race"
  172. @go test -p 1 -v -race $(PACKAGES)
  173. # uses https://github.com/sasha-s/go-deadlock/ to detect potential deadlocks
  174. test_with_deadlock:
  175. make set_with_deadlock
  176. make test
  177. make cleanup_after_test_with_deadlock
  178. set_with_deadlock:
  179. find . -name "*.go" | grep -v "vendor/" | xargs -n 1 sed -i.bak 's/sync.RWMutex/deadlock.RWMutex/'
  180. find . -name "*.go" | grep -v "vendor/" | xargs -n 1 sed -i.bak 's/sync.Mutex/deadlock.Mutex/'
  181. find . -name "*.go" | grep -v "vendor/" | xargs -n 1 goimports -w
  182. # cleanes up after you ran test_with_deadlock
  183. cleanup_after_test_with_deadlock:
  184. find . -name "*.go" | grep -v "vendor/" | xargs -n 1 sed -i.bak 's/deadlock.RWMutex/sync.RWMutex/'
  185. find . -name "*.go" | grep -v "vendor/" | xargs -n 1 sed -i.bak 's/deadlock.Mutex/sync.Mutex/'
  186. find . -name "*.go" | grep -v "vendor/" | xargs -n 1 goimports -w
  187. ########################################
  188. ### Formatting, linting, and vetting
  189. fmt:
  190. @go fmt ./...
  191. lint:
  192. @echo "--> Running linter"
  193. @golangci-lint run
  194. DESTINATION = ./index.html.md
  195. rpc-docs:
  196. cat rpc/core/slate_header.txt > $(DESTINATION)
  197. godoc2md -template rpc/core/doc_template.txt github.com/tendermint/tendermint/rpc/core | grep -v -e "pipe.go" -e "routes.go" -e "dev.go" | sed 's,/src/target,https://github.com/tendermint/tendermint/tree/master/rpc/core,' >> $(DESTINATION)
  198. check_dep:
  199. dep status >> /dev/null
  200. !(grep -n branch Gopkg.toml)
  201. ###########################################################
  202. ### Docker image
  203. build-docker:
  204. cp $(OUTPUT) DOCKER/tendermint
  205. docker build --label=tendermint --tag="tendermint/tendermint" DOCKER
  206. rm -rf DOCKER/tendermint
  207. ###########################################################
  208. ### Local testnet using docker
  209. # Build linux binary on other platforms
  210. build-linux: get_tools get_vendor_deps
  211. GOOS=linux GOARCH=amd64 $(MAKE) build
  212. build-docker-localnode:
  213. @cd networks/local && make
  214. # Run a 4-node testnet locally
  215. localnet-start: localnet-stop
  216. @if ! [ -f build/node0/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode testnet --v 4 --o . --populate-persistent-peers --starting-ip-address 192.167.10.2 ; fi
  217. docker-compose up
  218. # Stop testnet
  219. localnet-stop:
  220. docker-compose down
  221. ###########################################################
  222. ### Remote full-nodes (sentry) using terraform and ansible
  223. # Server management
  224. sentry-start:
  225. @if [ -z "$(DO_API_TOKEN)" ]; then echo "DO_API_TOKEN environment variable not set." ; false ; fi
  226. @if ! [ -f $(HOME)/.ssh/id_rsa.pub ]; then ssh-keygen ; fi
  227. cd networks/remote/terraform && terraform init && terraform apply -var DO_API_TOKEN="$(DO_API_TOKEN)" -var SSH_KEY_FILE="$(HOME)/.ssh/id_rsa.pub"
  228. @if ! [ -f $(CURDIR)/build/node0/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode testnet --v 0 --n 4 --o . ; fi
  229. cd networks/remote/ansible && ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i inventory/digital_ocean.py -l sentrynet install.yml
  230. @echo "Next step: Add your validator setup in the genesis.json and config.tml files and run \"make sentry-config\". (Public key of validator, chain ID, peer IP and node ID.)"
  231. # Configuration management
  232. sentry-config:
  233. cd networks/remote/ansible && ansible-playbook -i inventory/digital_ocean.py -l sentrynet config.yml -e BINARY=$(CURDIR)/build/tendermint -e CONFIGDIR=$(CURDIR)/build
  234. sentry-stop:
  235. @if [ -z "$(DO_API_TOKEN)" ]; then echo "DO_API_TOKEN environment variable not set." ; false ; fi
  236. cd networks/remote/terraform && terraform destroy -var DO_API_TOKEN="$(DO_API_TOKEN)" -var SSH_KEY_FILE="$(HOME)/.ssh/id_rsa.pub"
  237. # meant for the CI, inspect script & adapt accordingly
  238. build-slate:
  239. bash scripts/slate.sh
  240. # To avoid unintended conflicts with file names, always add to .PHONY
  241. # unless there is a reason not to.
  242. # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html
  243. .PHONY: check build build_race build_abci dist install install_abci check_dep check_tools get_tools update_tools get_vendor_deps draw_deps get_protoc protoc_abci protoc_libs gen_certs clean_certs grpc_dbserver test_cover test_apps test_persistence test_p2p test test_race test_integrations test_release test100 vagrant_test fmt rpc-docs build-linux localnet-start localnet-stop build-docker build-docker-localnode sentry-start sentry-config sentry-stop build-slate protoc_grpc protoc_all build_c install_c test_with_deadlock cleanup_after_test_with_deadlock lint