| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-26 20:42:27 +03:00
										 |  |  | package eth | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-30 19:05:06 +03:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/metrics" | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 	"github.com/ethereum/go-ethereum/p2p" | 
					
						
							| 
									
										
										
										
											2015-06-30 19:05:06 +03:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-06-26 20:42:27 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 	propTxnInPacketsMeter     = metrics.NewRegisteredMeter("eth/prop/txns/in/packets", nil) | 
					
						
							|  |  |  | 	propTxnInTrafficMeter     = metrics.NewRegisteredMeter("eth/prop/txns/in/traffic", nil) | 
					
						
							|  |  |  | 	propTxnOutPacketsMeter    = metrics.NewRegisteredMeter("eth/prop/txns/out/packets", nil) | 
					
						
							|  |  |  | 	propTxnOutTrafficMeter    = metrics.NewRegisteredMeter("eth/prop/txns/out/traffic", nil) | 
					
						
							|  |  |  | 	propHashInPacketsMeter    = metrics.NewRegisteredMeter("eth/prop/hashes/in/packets", nil) | 
					
						
							|  |  |  | 	propHashInTrafficMeter    = metrics.NewRegisteredMeter("eth/prop/hashes/in/traffic", nil) | 
					
						
							|  |  |  | 	propHashOutPacketsMeter   = metrics.NewRegisteredMeter("eth/prop/hashes/out/packets", nil) | 
					
						
							|  |  |  | 	propHashOutTrafficMeter   = metrics.NewRegisteredMeter("eth/prop/hashes/out/traffic", nil) | 
					
						
							|  |  |  | 	propBlockInPacketsMeter   = metrics.NewRegisteredMeter("eth/prop/blocks/in/packets", nil) | 
					
						
							|  |  |  | 	propBlockInTrafficMeter   = metrics.NewRegisteredMeter("eth/prop/blocks/in/traffic", nil) | 
					
						
							|  |  |  | 	propBlockOutPacketsMeter  = metrics.NewRegisteredMeter("eth/prop/blocks/out/packets", nil) | 
					
						
							|  |  |  | 	propBlockOutTrafficMeter  = metrics.NewRegisteredMeter("eth/prop/blocks/out/traffic", nil) | 
					
						
							|  |  |  | 	reqHeaderInPacketsMeter   = metrics.NewRegisteredMeter("eth/req/headers/in/packets", nil) | 
					
						
							|  |  |  | 	reqHeaderInTrafficMeter   = metrics.NewRegisteredMeter("eth/req/headers/in/traffic", nil) | 
					
						
							|  |  |  | 	reqHeaderOutPacketsMeter  = metrics.NewRegisteredMeter("eth/req/headers/out/packets", nil) | 
					
						
							|  |  |  | 	reqHeaderOutTrafficMeter  = metrics.NewRegisteredMeter("eth/req/headers/out/traffic", nil) | 
					
						
							|  |  |  | 	reqBodyInPacketsMeter     = metrics.NewRegisteredMeter("eth/req/bodies/in/packets", nil) | 
					
						
							|  |  |  | 	reqBodyInTrafficMeter     = metrics.NewRegisteredMeter("eth/req/bodies/in/traffic", nil) | 
					
						
							|  |  |  | 	reqBodyOutPacketsMeter    = metrics.NewRegisteredMeter("eth/req/bodies/out/packets", nil) | 
					
						
							|  |  |  | 	reqBodyOutTrafficMeter    = metrics.NewRegisteredMeter("eth/req/bodies/out/traffic", nil) | 
					
						
							|  |  |  | 	reqStateInPacketsMeter    = metrics.NewRegisteredMeter("eth/req/states/in/packets", nil) | 
					
						
							|  |  |  | 	reqStateInTrafficMeter    = metrics.NewRegisteredMeter("eth/req/states/in/traffic", nil) | 
					
						
							|  |  |  | 	reqStateOutPacketsMeter   = metrics.NewRegisteredMeter("eth/req/states/out/packets", nil) | 
					
						
							|  |  |  | 	reqStateOutTrafficMeter   = metrics.NewRegisteredMeter("eth/req/states/out/traffic", nil) | 
					
						
							|  |  |  | 	reqReceiptInPacketsMeter  = metrics.NewRegisteredMeter("eth/req/receipts/in/packets", nil) | 
					
						
							|  |  |  | 	reqReceiptInTrafficMeter  = metrics.NewRegisteredMeter("eth/req/receipts/in/traffic", nil) | 
					
						
							|  |  |  | 	reqReceiptOutPacketsMeter = metrics.NewRegisteredMeter("eth/req/receipts/out/packets", nil) | 
					
						
							|  |  |  | 	reqReceiptOutTrafficMeter = metrics.NewRegisteredMeter("eth/req/receipts/out/traffic", nil) | 
					
						
							|  |  |  | 	miscInPacketsMeter        = metrics.NewRegisteredMeter("eth/misc/in/packets", nil) | 
					
						
							|  |  |  | 	miscInTrafficMeter        = metrics.NewRegisteredMeter("eth/misc/in/traffic", nil) | 
					
						
							|  |  |  | 	miscOutPacketsMeter       = metrics.NewRegisteredMeter("eth/misc/out/packets", nil) | 
					
						
							|  |  |  | 	miscOutTrafficMeter       = metrics.NewRegisteredMeter("eth/misc/out/traffic", nil) | 
					
						
							| 
									
										
										
										
											2015-06-26 20:42:27 +03:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | // meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of | 
					
						
							|  |  |  | // accumulating the above defined metrics based on the data stream contents. | 
					
						
							|  |  |  | type meteredMsgReadWriter struct { | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 	p2p.MsgReadWriter     // Wrapped message stream to meter | 
					
						
							|  |  |  | 	version           int // Protocol version to select correct meters | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the | 
					
						
							| 
									
										
										
										
											2016-03-15 11:27:49 -07:00
										 |  |  | // metrics system is disabled, this function returns the original object. | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter { | 
					
						
							|  |  |  | 	if !metrics.Enabled { | 
					
						
							|  |  |  | 		return rw | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 	return &meteredMsgReadWriter{MsgReadWriter: rw} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Init sets the protocol version used by the stream to know which meters to | 
					
						
							|  |  |  | // increment in case of overlapping message ids between protocol versions. | 
					
						
							|  |  |  | func (rw *meteredMsgReadWriter) Init(version int) { | 
					
						
							|  |  |  | 	rw.version = version | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) { | 
					
						
							|  |  |  | 	// Read the message and short circuit in case of an error | 
					
						
							|  |  |  | 	msg, err := rw.MsgReadWriter.ReadMsg() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return msg, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Account for the data traffic | 
					
						
							|  |  |  | 	packets, traffic := miscInPacketsMeter, miscInTrafficMeter | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 	switch { | 
					
						
							| 
									
										
										
										
											2016-07-21 11:36:38 +02:00
										 |  |  | 	case msg.Code == BlockHeadersMsg: | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 		packets, traffic = reqHeaderInPacketsMeter, reqHeaderInTrafficMeter | 
					
						
							| 
									
										
										
										
											2016-07-21 11:36:38 +02:00
										 |  |  | 	case msg.Code == BlockBodiesMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 		packets, traffic = reqBodyInPacketsMeter, reqBodyInTrafficMeter | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-14 17:48:26 +03:00
										 |  |  | 	case rw.version >= eth63 && msg.Code == NodeDataMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 		packets, traffic = reqStateInPacketsMeter, reqStateInTrafficMeter | 
					
						
							| 
									
										
										
										
											2015-08-14 17:48:26 +03:00
										 |  |  | 	case rw.version >= eth63 && msg.Code == ReceiptsMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 		packets, traffic = reqReceiptInPacketsMeter, reqReceiptInTrafficMeter | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	case msg.Code == NewBlockHashesMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 		packets, traffic = propHashInPacketsMeter, propHashInTrafficMeter | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 	case msg.Code == NewBlockMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 		packets, traffic = propBlockInPacketsMeter, propBlockInTrafficMeter | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 	case msg.Code == TxMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 		packets, traffic = propTxnInPacketsMeter, propTxnInTrafficMeter | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	packets.Mark(1) | 
					
						
							|  |  |  | 	traffic.Mark(int64(msg.Size)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return msg, err | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error { | 
					
						
							|  |  |  | 	// Account for the data traffic | 
					
						
							|  |  |  | 	packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 	switch { | 
					
						
							| 
									
										
										
										
											2016-07-21 11:36:38 +02:00
										 |  |  | 	case msg.Code == BlockHeadersMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 		packets, traffic = reqHeaderOutPacketsMeter, reqHeaderOutTrafficMeter | 
					
						
							| 
									
										
										
										
											2016-07-21 11:36:38 +02:00
										 |  |  | 	case msg.Code == BlockBodiesMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 		packets, traffic = reqBodyOutPacketsMeter, reqBodyOutTrafficMeter | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-14 17:48:26 +03:00
										 |  |  | 	case rw.version >= eth63 && msg.Code == NodeDataMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 		packets, traffic = reqStateOutPacketsMeter, reqStateOutTrafficMeter | 
					
						
							| 
									
										
										
										
											2015-08-14 17:48:26 +03:00
										 |  |  | 	case rw.version >= eth63 && msg.Code == ReceiptsMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 		packets, traffic = reqReceiptOutPacketsMeter, reqReceiptOutTrafficMeter | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	case msg.Code == NewBlockHashesMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 		packets, traffic = propHashOutPacketsMeter, propHashOutTrafficMeter | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 	case msg.Code == NewBlockMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 		packets, traffic = propBlockOutPacketsMeter, propBlockOutTrafficMeter | 
					
						
							| 
									
										
										
										
											2015-07-02 19:55:18 +03:00
										 |  |  | 	case msg.Code == TxMsg: | 
					
						
							| 
									
										
										
										
											2015-07-02 14:13:46 +03:00
										 |  |  | 		packets, traffic = propTxnOutPacketsMeter, propTxnOutTrafficMeter | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	packets.Mark(1) | 
					
						
							|  |  |  | 	traffic.Mark(int64(msg.Size)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Send the packet to the p2p layer | 
					
						
							|  |  |  | 	return rw.MsgReadWriter.WriteMsg(msg) | 
					
						
							|  |  |  | } |