pool: rename outbound/inbound. remove co.wait() in scheduleRequests.

This commit is contained in:
Christopher Jeffrey 2016-11-28 18:52:02 -08:00
parent bc4a9b3f14
commit 01e7fd3902
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
6 changed files with 78 additions and 54 deletions

View File

@ -42,8 +42,8 @@ bip151: true
# ignore-discovery: false
# port: 8333
listen: true
max-peers: 8
max-leeches: 30
max-outbound: 8
max-inbound: 30
bip150: false
identity-key: 74b4147957813b62cc8987f2b711ddb31f8cb46dcbf71502033da66053c8780a
auth-peers: ./authorized-peers

View File

@ -571,6 +571,7 @@ HTTPServer.prototype._init = function _init() {
this.get('/', function(req, res, send, next) {
var totalTX = this.mempool ? this.mempool.totalTX : 0;
var size = this.mempool ? this.mempool.getSize() : 0;
var loader = this.pool.peers.load ? 1 : 0;
send(200, {
version: constants.USER_VERSION,
@ -579,9 +580,9 @@ HTTPServer.prototype._init = function _init() {
network: this.network.type,
height: this.chain.height,
tip: this.chain.tip.rhash,
peers: this.pool.peers.regular.length + (this.pool.peers.load ? 1 : 0),
pendingPeers: this.pool.peers.pending.length,
leeches: this.pool.peers.leeches.length,
outbound: this.pool.peers.outbound.length + loader,
pending: this.pool.peers.pending.length,
inbound: this.pool.peers.inbound.length,
progress: this.chain.getProgress(),
mempoolTX: totalTX,
mempoolSize: size,

View File

@ -37,7 +37,7 @@ var request = require('../http/request');
* @param {Object} options
* @param {Chain} options.chain
* @param {Mempool?} options.mempool
* @param {Number?} [options.maxPeers=8] - Maximum number of peers.
* @param {Number?} [options.maxOutbound=8] - Maximum number of peers.
* @param {Boolean?} options.spv - Do an SPV sync.
* @param {Boolean?} options.relay - Whether to ask
* for relayed transactions.
@ -107,8 +107,8 @@ function Pool(options) {
this.port = this.network.port;
this.server = null;
this.maxPeers = 8;
this.maxLeeches = 8;
this.maxOutbound = 8;
this.maxInbound = 8;
this.connected = false;
this.uid = 0;
this.createServer = null;
@ -181,11 +181,11 @@ Pool.prototype._initOptions = function _initOptions() {
this.address.services = this.services;
this.address.setPort(this.port);
if (this.options.maxPeers != null)
this.maxPeers = this.options.maxPeers;
if (this.options.maxOutbound != null)
this.maxOutbound = this.options.maxOutbound;
if (this.options.maxLeeches != null)
this.maxLeeches = this.options.maxLeeches;
if (this.options.maxInbound != null)
this.maxInbound = this.options.maxInbound;
this.createServer = this.options.createServer;
this.proxyServer = this.options.proxyServer;
@ -273,6 +273,10 @@ Pool.prototype._init = function _init() {
self.emit('orphan', block, height);
});
this.chain.on('reset', function() {
self.forceSync();
});
this.chain.on('full', function() {
self.stopTimeout();
self.stopInterval();
@ -307,7 +311,7 @@ Pool.prototype._open = co(function* _open() {
else
yield this.chain.open();
this.logger.info('Pool loaded (maxpeers=%d).', this.maxPeers);
this.logger.info('Pool loaded (maxpeers=%d).', this.maxOutbound);
if (this.identityKey) {
key = ec.publicKeyCreate(this.identityKey, true);
@ -463,8 +467,8 @@ Pool.prototype._handleLeech = function _handleLeech(socket) {
addr = NetworkAddress.fromSocket(socket, this.network);
if (this.peers.leeches.length >= this.maxLeeches) {
this.logger.debug('Ignoring leech: too many leeches (%s).', addr.hostname);
if (this.peers.inbound.length >= this.maxInbound) {
this.logger.debug('Ignoring leech: too many inbound (%s).', addr.hostname);
socket.destroy();
return;
}
@ -676,8 +680,28 @@ Pool.prototype.sync = function sync() {
if (this.peers.load)
this.peers.load.trySync();
for (i = 0; i < this.peers.regular.length; i++)
this.peers.regular[i].trySync();
for (i = 0; i < this.peers.outbound.length; i++)
this.peers.outbound[i].trySync();
};
/**
* Force sending a sync to each peer.
* @private
*/
Pool.prototype.forceSync = function forceSync() {
var i, peer;
if (this.peers.load) {
this.peers.load.syncSent = false;
this.peers.load.trySync();
}
for (i = 0; i < this.peers.outbound.length; i++) {
peer = this.peers.outbound[i];
peer.syncSent = false;
peer.trySync();
}
};
/**
@ -701,8 +725,8 @@ Pool.prototype.stopSync = function stopSync() {
if (this.peers.load)
this.peers.load.syncSent = false;
for (i = 0; i < this.peers.regular.length; i++)
this.peers.regular[i].syncSent = false;
for (i = 0; i < this.peers.outbound.length; i++)
this.peers.outbound[i].syncSent = false;
};
/**
@ -995,8 +1019,8 @@ Pool.prototype.sendMempool = function sendMempool() {
if (this.peers.load)
this.peers.load.sendMempool();
for (i = 0; i < this.peers.regular.length; i++)
this.peers.regular[i].sendMempool();
for (i = 0; i < this.peers.outbound.length; i++)
this.peers.outbound[i].sendMempool();
};
/**
@ -1010,11 +1034,11 @@ Pool.prototype.sendAlert = function sendAlert(alert) {
if (this.peers.load)
this.peers.load.sendAlert(alert);
for (i = 0; i < this.peers.regular.length; i++)
this.peers.regular[i].sendAlert(alert);
for (i = 0; i < this.peers.outbound.length; i++)
this.peers.outbound[i].sendAlert(alert);
for (i = 0; i < this.peers.leeches.length; i++)
this.peers.leeches[i].sendAlert(alert);
for (i = 0; i < this.peers.inbound.length; i++)
this.peers.inbound[i].sendAlert(alert);
};
/**
@ -1032,7 +1056,7 @@ Pool.prototype.createPeer = function createPeer(addr, socket) {
if (!peer.outbound)
return;
// Attempt to promote from pending->regular
// Attempt to promote from pending->outbound
self.peers.promote(peer);
// If we don't have an ack'd loader yet, use this peer.
@ -1398,7 +1422,7 @@ Pool.prototype.addLeech = function addLeech(addr, socket) {
};
/**
* Create a regular non-loader peer. These primarily
* Create a outbound non-loader peer. These primarily
* exist for transaction relaying.
* @private
*/
@ -1440,10 +1464,10 @@ Pool.prototype.fillPeers = function fillPeers() {
var i;
this.logger.debug('Refilling peers (%d/%d).',
this.peers.all.length - this.peers.leeches.length,
this.maxPeers);
this.peers.all.length - this.peers.inbound.length,
this.maxOutbound);
for (i = 0; i < this.maxPeers - 1; i++)
for (i = 0; i < this.maxOutbound - 1; i++)
this.addPeer();
};
@ -1527,8 +1551,8 @@ Pool.prototype.updateWatch = function updateWatch() {
if (self.peers.load)
self.peers.load.updateWatch();
for (i = 0; i < self.peers.regular.length; i++)
self.peers.regular[i].updateWatch();
for (i = 0; i < self.peers.outbound.length; i++)
self.peers.outbound[i].updateWatch();
}, 50);
};
@ -1674,7 +1698,6 @@ Pool.prototype.scheduleRequests = co(function* scheduleRequests(peer) {
this.scheduled = true;
yield this.chain.onDrain();
yield co.wait();
this.sendRequests(peer);
this.scheduled = false;
@ -1782,8 +1805,8 @@ Pool.prototype.announce = function announce(msg) {
if (this.peers.load)
this.peers.load.tryAnnounce(msg);
for (i = 0; i < this.peers.regular.length; i++)
this.peers.regular[i].tryAnnounce(msg);
for (i = 0; i < this.peers.outbound.length; i++)
this.peers.outbound[i].tryAnnounce(msg);
};
/**
@ -1799,8 +1822,8 @@ Pool.prototype.setFeeRate = function setFeeRate(rate) {
if (this.peers.load)
this.peers.load.sendFeeRate(rate);
for (i = 0; i < this.peers.regular.length; i++)
this.peers.regular[i].sendFeeRate(rate);
for (i = 0; i < this.peers.outbound.length; i++)
this.peers.outbound[i].sendFeeRate(rate);
};
/**
@ -1957,11 +1980,11 @@ Pool.prototype.getIP2 = co(function* getIP2() {
function PeerList(pool) {
this.pool = pool;
// Peers that are loading blocks themselves
this.regular = [];
this.outbound = [];
// Peers that are still connecting
this.pending = [];
// Peers that connected to us
this.leeches = [];
this.inbound = [];
// Peers that are loading block ids
this.load = null;
// All peers
@ -1985,7 +2008,7 @@ PeerList.prototype.addPending = function addPending(peer) {
};
PeerList.prototype.addLeech = function addLeech(peer) {
this.leeches.push(peer);
this.inbound.push(peer);
this.all.push(peer);
assert(!this.map[peer.hostname]);
this.map[peer.hostname] = peer;
@ -1993,13 +2016,13 @@ PeerList.prototype.addLeech = function addLeech(peer) {
PeerList.prototype.promote = function promote(peer) {
if (util.binaryRemove(this.pending, peer, compare))
util.binaryInsert(this.regular, peer, compare);
util.binaryInsert(this.outbound, peer, compare);
};
PeerList.prototype.remove = function remove(peer) {
util.binaryRemove(this.pending, peer, compare);
util.binaryRemove(this.regular, peer, compare);
util.binaryRemove(this.leeches, peer, compare);
util.binaryRemove(this.outbound, peer, compare);
util.binaryRemove(this.inbound, peer, compare);
util.binaryRemove(this.all, peer, compare);
assert(this.map[peer.hostname]);
@ -2016,7 +2039,7 @@ PeerList.prototype.demoteLoader = function demoteLoader() {
assert(peer);
this.load = null;
if (peer.ack)
util.binaryInsert(this.regular, peer, compare);
util.binaryInsert(this.outbound, peer, compare);
else
util.binaryInsert(this.pending, peer, compare);
};
@ -2030,7 +2053,7 @@ PeerList.prototype.repurpose = function repurpose(peer) {
this.demoteLoader();
r1 = util.binaryRemove(this.pending, peer, compare);
r2 = util.binaryRemove(this.regular, peer, compare);
r2 = util.binaryRemove(this.outbound, peer, compare);
assert(r1 || r2);
@ -2038,11 +2061,11 @@ PeerList.prototype.repurpose = function repurpose(peer) {
};
PeerList.prototype.isFull = function isFull() {
return this.size() >= this.pool.maxPeers - 1;
return this.size() >= this.pool.maxOutbound - 1;
};
PeerList.prototype.size = function size() {
return this.regular.length + this.pending.length;
return this.outbound.length + this.pending.length;
};
PeerList.prototype.get = function get(addr) {
@ -2055,7 +2078,7 @@ PeerList.prototype.destroy = function destroy() {
if (this.load)
this.load.destroy();
peers = this.regular.slice();
peers = this.outbound.slice();
for (i = 0; i < peers.length; i++)
peers[i].destroy();
@ -2065,7 +2088,7 @@ PeerList.prototype.destroy = function destroy() {
for (i = 0; i < peers.length; i++)
peers[i].destroy();
peers = this.leeches.slice();
peers = this.inbound.slice();
for (i = 0; i < peers.length; i++)
peers[i].destroy();

View File

@ -184,8 +184,8 @@ config.parseData = function parseData(data, prefix, dirname) {
options.identityKey = key(data.identitykey);
options.proxyServer = str(data.proxyserver);
options.preferredSeed = str(data.preferredseed);
options.maxPeers = num(data.maxpeers);
options.maxLeeches = num(data.maxleeches);
options.maxOutbound = num(data.maxoutbound);
options.maxInbound = num(data.maxinbound);
options.ignoreDiscovery = bool(data.ignorediscovery);
options.port = num(data.port);
options.listen = bool(data.listen);

View File

@ -112,8 +112,8 @@ function FullNode(options) {
authPeers: this.options.authPeers,
knownPeers: this.options.knownPeers,
identityKey: this.options.identityKey,
maxPeers: this.options.maxPeers,
maxLeeches: this.options.maxLeeches,
maxOutbound: this.options.maxOutbound,
maxInbound: this.options.maxInbound,
proxyServer: this.options.proxyServer,
preferredSeed: this.options.preferredSeed,
ignoreDiscovery: this.options.ignoreDiscovery,

View File

@ -69,7 +69,7 @@ function SPVNode(options) {
authPeers: this.options.authPeers,
knownPeers: this.options.knownPeers,
identityKey: this.options.identityKey,
maxPeers: this.options.maxPeers,
maxOutbound: this.options.maxOutbound,
ignoreDiscovery: this.options.ignoreDiscovery,
headers: this.options.headers,
selfish: true,