neo-go/pkg/network
Roman Khimov 119b4200ac network: add fail-fast route for tx double processing
When transaction spreads through the network many nodes are likely to get it
in roughly the same time. They will rebroadcast it also in roughly the same
time. As we have a number of peers it's quite likely that we'd get an Inv with
the same transaction from multiple peers simultaneously. We will ask them for
this transaction (independently!) and again we're likely to get it in roughly
the same time. So we can easily end up with multiple threads processing the
same transaction. Only one will succeed, but we can actually easily avoid
doing it in the first place saving some CPU cycles for other things.

Notice that we can't do it _before_ receiving a transaction because nothing
guarantees that the peer will respond to our transaction request, so
communication overhead is unavoidable at the moment, but saving on processing
already gives quite interesting results.

Baseline, four nodes with 10 workers:

RPS    7176.784 7014.511 6139.663 7191.280 7080.852 ≈ 6921   ± 5.72%
TPS    6945.409 6562.756 5927.050 6681.187 6821.794 ≈ 6588   ± 5.38%
CPU %    44.400   43.842   40.418   49.211   49.370 ≈   45.4 ± 7.53%
Mem MB 2693.414 2640.602 2472.007 2731.482 2707.879 ≈ 2649   ± 3.53%

Patched:

RPS ≈  7791.675 7996.559 7834.504 7746.705 7891.614 ≈ 7852   ±  1.10% ↑ 13.45%
TPS ≈  7241.497 7711.765 7520.211 7425.890 7334.443 ≈ 7447   ±  2.17% ↑ 13.04%
CPU %    29.853   39.936   39.945   36.371   39.999 ≈   37.2 ± 10.57% ↓ 18.06%
Mem MB 2749.635 2791.609 2828.610 2910.431 2863.344 ≈ 2829   ±  1.97% ↑  6.80%
2021-08-06 21:10:25 +03:00
..
capability *: enable godot linter and fix all its warnings 2021-05-12 23:17:03 +03:00
extpool *: increase GAS for verification 2021-07-14 10:27:09 +03:00
metrics cli,pkg: use zap.Logger 2020-01-10 11:14:27 +03:00
payload rpc: allow to track notary requests via Notification subsystem 2021-06-01 16:29:04 +03:00
blockqueue.go network: restrict block queue size 2020-09-02 17:04:49 +03:00
blockqueue_test.go block: replace Base with Header 2021-03-10 13:38:44 +03:00
compress.go network: handle length mismatch in decompression routine 2020-08-03 22:38:55 +03:00
discovery.go *: enable godot linter and fix all its warnings 2021-05-12 23:17:03 +03:00
discovery_test.go network: optimize waiting in test 2021-07-08 11:14:35 +03:00
helper_test.go *: drop unused structure fields 2021-05-12 19:41:23 +03:00
message.go network: use optimized decoder for transactions 2021-08-04 23:49:07 +03:00
message_string.go network: replace ConsensusType with ExtensibleType 2021-01-22 10:38:33 +03:00
message_test.go network: drop Network from Message 2021-03-26 13:45:18 +03:00
notary_feer.go core: introduce mempool notifications 2021-02-02 22:01:32 +03:00
peer.go network: support non-blocking broadcast 2020-12-25 14:36:52 +03:00
prometheus.go monitoring: add prometheus monitoring 2019-10-29 20:51:17 +03:00
server.go network: add fail-fast route for tx double processing 2021-08-06 21:10:25 +03:00
server_config.go network: limit message number from the same sender 2021-05-12 10:52:11 +03:00
server_test.go network: only ask mempool for intersections with received Inv 2021-08-06 20:53:02 +03:00
tcp_peer.go network: handle incoming message in a separate goroutine 2021-08-06 19:37:37 +03:00
tcp_peer_test.go protocol: add capabilities to version payload 2020-05-27 19:01:14 +03:00
tcp_transport.go network: don't log transport errors on exit 2021-07-08 10:40:54 +03:00
transport.go protocol: add capabilities to version payload 2020-05-27 19:01:14 +03:00