Skip to content

Commit

Permalink
feat: p2p sockets adapt cleanPeers
Browse files Browse the repository at this point in the history
  • Loading branch information
air1one committed Mar 21, 2019
1 parent a9d25b4 commit efc4fe6
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 28 deletions.
4 changes: 1 addition & 3 deletions packages/core-interfaces/src/core-p2p/monitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,8 @@ export interface IMonitor {
/**
* Clear peers which aren't responding.
* @param {Boolean} fast
* @param {Boolean} tracker
* @param {Boolean} forcePing
*/
cleanPeers(fast?: boolean, forcePing?: boolean): Promise<void>;
cleanPeers(fast?: boolean): Promise<void>;

/**
* Suspend an existing peer.
Expand Down
41 changes: 16 additions & 25 deletions packages/core-p2p/src/monitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -212,47 +212,38 @@ export class Monitor implements P2P.IMonitor {
/**
* Clear peers which aren't responding.
* @param {Boolean} fast
* @param {Boolean} tracker
* @param {Boolean} forcePing
*/
public async cleanPeers(fast = false, forcePing = false) {
public async cleanPeers(fast = false) {
const keys = Object.keys(this.peers);
let unresponsivePeers = 0;
const pingDelay = fast ? 1500 : localConfig.get("globalTimeout");
const max = keys.length;
const maxDelay = fast ? 1500 : localConfig.get("globalTimeout") || 1500;
const peersCount = keys.length;

this.logger.info(`Checking ${max} peers`);
const peerErrors = {};
this.logger.info(`Checking ${peersCount} peers`);
await Promise.all(
keys.map(async ip => {
const peer = this.getPeer(ip);
try {
await peer.ping(pingDelay, forcePing);
} catch (error) {
unresponsivePeers++;

if (peerErrors[error]) {
peerErrors[error].push(peer);
} else {
peerErrors[error] = [peer];
}
if (
peer.socket.getState() !== peer.socket.OPEN ||
peer.delay === -1 || // means last socket message timed out
peer.delay > maxDelay
) {
unresponsivePeers++;

this.emitter.emit("peer.removed", peer);

this.removePeer(peer);

return null;
}
}),
);

Object.keys(peerErrors).forEach((key: any) => {
const peerCount = peerErrors[key].length;
this.logger.debug(`Removed ${peerCount} ${pluralize("peers", peerCount)} because of "${key}"`);
});
if (unresponsivePeers) {
this.logger.debug(`Removed ${unresponsivePeers} unresponsive ${pluralize("peer", unresponsivePeers)}`);
}

if (this.initializing) {
this.logger.info(`${max - unresponsivePeers} of ${max} peers on the network are responsive`);
this.logger.info(`${peersCount - unresponsivePeers} of ${peersCount} peers on the network are responsive`);
this.logger.info(`Median Network Height: ${this.getNetworkHeight().toLocaleString()}`);
this.logger.info(`Network PBFT status: ${this.getPBFTForgingStatus()}`);
}
Expand Down Expand Up @@ -383,7 +374,7 @@ export class Monitor implements P2P.IMonitor {

public async getNetworkState(): Promise<NetworkState> {
if (!this.__isColdStartActive()) {
await this.cleanPeers(true, true);
await this.cleanPeers(true);
}

return NetworkState.analyze(this);
Expand Down Expand Up @@ -512,7 +503,7 @@ export class Monitor implements P2P.IMonitor {
*/
public async checkNetworkHealth(): Promise<P2P.INetworkStatus> {
if (!this.__isColdStartActive()) {
await this.cleanPeers(true, true);
await this.cleanPeers(true);
await this.guard.resetSuspendedPeers();
}

Expand Down

0 comments on commit efc4fe6

Please sign in to comment.