net: more stall behavior.
This commit is contained in:
parent
75877d2f22
commit
7b516ddd1e
@ -528,7 +528,7 @@ RPC.prototype.getpeerinfo = co(function* getpeerinfo(args, help) {
|
|||||||
lastrecv: peer.lastRecv / 1000 | 0,
|
lastrecv: peer.lastRecv / 1000 | 0,
|
||||||
bytessent: peer.socket.bytesWritten,
|
bytessent: peer.socket.bytesWritten,
|
||||||
bytesrecv: peer.socket.bytesRead,
|
bytesrecv: peer.socket.bytesRead,
|
||||||
conntime: peer.ts !== 0 ? util.now() - peer.ts : 0,
|
conntime: peer.ts !== 0 ? (util.ms() - peer.ts) / 1000 | 0 : 0,
|
||||||
timeoffset: offset,
|
timeoffset: offset,
|
||||||
pingtime: peer.lastPong !== -1
|
pingtime: peer.lastPong !== -1
|
||||||
? (peer.lastPong - peer.lastPing) / 1000
|
? (peer.lastPong - peer.lastPing) / 1000
|
||||||
|
|||||||
@ -37,6 +37,14 @@ exports.MIN_VERSION = 70001;
|
|||||||
|
|
||||||
exports.HEADERS_VERSION = 31800;
|
exports.HEADERS_VERSION = 31800;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimum version for pong.
|
||||||
|
* @const {Number}
|
||||||
|
* @default
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.PONG_VERSION = 60000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Minimum version for bip37.
|
* Minimum version for bip37.
|
||||||
* @const {Number}
|
* @const {Number}
|
||||||
|
|||||||
@ -207,6 +207,14 @@ Peer.BLOCK_TIMEOUT = 120000;
|
|||||||
|
|
||||||
Peer.MAX_REQUESTS = 5000;
|
Peer.MAX_REQUESTS = 5000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic timeout interval.
|
||||||
|
* @const {Number}
|
||||||
|
* @default
|
||||||
|
*/
|
||||||
|
|
||||||
|
Peer.TIMEOUT_INTERVAL = 20 * 60000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create inbound peer from socket.
|
* Create inbound peer from socket.
|
||||||
* @param {PeerOptions} options
|
* @param {PeerOptions} options
|
||||||
@ -410,7 +418,7 @@ Peer.prototype.accept = function accept(socket) {
|
|||||||
|
|
||||||
this.address = NetAddress.fromSocket(socket, this.network);
|
this.address = NetAddress.fromSocket(socket, this.network);
|
||||||
this.address.services = 0;
|
this.address.services = 0;
|
||||||
this.ts = util.now();
|
this.ts = util.ms();
|
||||||
this.outbound = false;
|
this.outbound = false;
|
||||||
this.connected = true;
|
this.connected = true;
|
||||||
|
|
||||||
@ -434,7 +442,6 @@ Peer.prototype.connect = function connect(addr) {
|
|||||||
socket = this.options.createSocket(addr.port, addr.host);
|
socket = this.options.createSocket(addr.port, addr.host);
|
||||||
|
|
||||||
this.address = addr;
|
this.address = addr;
|
||||||
this.ts = util.now();
|
|
||||||
this.outbound = true;
|
this.outbound = true;
|
||||||
this.connected = false;
|
this.connected = false;
|
||||||
|
|
||||||
@ -526,7 +533,7 @@ Peer.prototype.initConnect = function initConnect() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.socket.once('connect', function() {
|
self.socket.once('connect', function() {
|
||||||
self.ts = util.now();
|
self.ts = util.ms();
|
||||||
self.connected = true;
|
self.connected = true;
|
||||||
self.emit('connect');
|
self.emit('connect');
|
||||||
|
|
||||||
@ -998,7 +1005,7 @@ Peer.prototype.sendPing = function sendPing() {
|
|||||||
if (!this.handshake)
|
if (!this.handshake)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (this.version <= 60000) {
|
if (this.version <= common.PONG_VERSION) {
|
||||||
this.send(new packets.PingPacket());
|
this.send(new packets.PingPacket());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1286,7 +1293,7 @@ Peer.prototype.fulfill = function fulfill(packet) {
|
|||||||
Peer.prototype.maybeTimeout = function maybeTimeout() {
|
Peer.prototype.maybeTimeout = function maybeTimeout() {
|
||||||
var keys = this.responseMap.keys();
|
var keys = this.responseMap.keys();
|
||||||
var now = util.ms();
|
var now = util.ms();
|
||||||
var i, key, entry, name;
|
var i, key, entry, name, ts, mult;
|
||||||
|
|
||||||
for (i = 0; i < keys.length; i++) {
|
for (i = 0; i < keys.length; i++) {
|
||||||
key = keys[i];
|
key = keys[i];
|
||||||
@ -1327,14 +1334,44 @@ Peer.prototype.maybeTimeout = function maybeTimeout() {
|
|||||||
|
|
||||||
for (i = 0; i < keys.length; i++) {
|
for (i = 0; i < keys.length; i++) {
|
||||||
key = keys[i];
|
key = keys[i];
|
||||||
entry = this.requestMap.get(key);
|
ts = this.requestMap.get(key);
|
||||||
if (now > entry + Peer.BLOCK_TIMEOUT) {
|
if (now > ts + Peer.BLOCK_TIMEOUT) {
|
||||||
this.error('Peer is stalling (block).');
|
this.error('Peer is stalling (block).');
|
||||||
this.destroy();
|
this.destroy();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (now > this.ts + 60000) {
|
||||||
|
assert(this.ts !== 0);
|
||||||
|
|
||||||
|
if (this.lastRecv === 0 || this.lastSend === 0) {
|
||||||
|
this.error('Peer is stalling (no message).');
|
||||||
|
this.destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (now > this.lastSend + Peer.TIMEOUT_INTERVAL) {
|
||||||
|
this.error('Peer is stalling (send).');
|
||||||
|
this.destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mult = this.version <= common.PONG_VERSION ? 4 : 1;
|
||||||
|
|
||||||
|
if (now > this.lastRecv + Peer.TIMEOUT_INTERVAL * mult) {
|
||||||
|
this.error('Peer is stalling (recv).');
|
||||||
|
this.destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.challenge && now > this.lastPing + Peer.TIMEOUT_INTERVAL) {
|
||||||
|
this.error('Peer is stalling (ping).');
|
||||||
|
this.destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user