Skip to content

Commit

Permalink
fix(core-p2p): timeout promise race (#3158)
Browse files Browse the repository at this point in the history
  • Loading branch information
spkjp authored and faustbrian committed Oct 29, 2019
1 parent c9330a8 commit 3443f3a
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 20 deletions.
3 changes: 2 additions & 1 deletion packages/core-p2p/src/network-monitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -394,7 +394,8 @@ export class NetworkMonitor implements P2P.INetworkMonitor {
}

if (someJobFailed) {
throw new Error(`Prematurely canceled due to another job failure.`);
this.logger.info(`Prematurely canceled due to another job failure.`);
return;
}
}

Expand Down
17 changes: 7 additions & 10 deletions packages/core-p2p/src/socket-server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,15 @@ export const startSocketServer = async (service: P2P.IPeerService, config: Recor
});

// Create a timeout promise so that if socket server is not ready in 10 seconds, it rejects
const timeoutPromise = new Promise((resolve, reject) => {
const id = setTimeout(() => {
clearTimeout(id);
reject("Socket server failed to setup in 10 seconds.");
}, 10000);
});
const timeout: NodeJS.Timeout = setTimeout(() => {
throw new Error("Socket server failed to setup in 10 seconds.");
}, 10000);

const serverReadyPromise = new Promise((resolve, reject) => {
server.on("ready", () => resolve(server));
});
const serverReadyPromise = await new Promise(resolve => server.on("ready", () => resolve(server)));

clearTimeout(timeout);

payloadProcessor.inject(server);

return Promise.race([serverReadyPromise, timeoutPromise]);
return serverReadyPromise;
};
1 change: 0 additions & 1 deletion packages/core-p2p/src/socket-server/worker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,6 @@ export class Worker extends SCWorker {
// Check that blockchain, tx-pool and p2p are ready
const isAppReady: boolean = (await this.sendToMasterAsync("p2p.utils.isAppReady")).data.ready;
if (!isAppReady) {
req.socket.terminate();
return;
}

Expand Down
23 changes: 15 additions & 8 deletions packages/core-p2p/src/utils/socket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,27 @@ export const socketEmit = async (
throw error;
}

const socketEmitPromise = new Promise((resolve, reject) => {
socket.emit(event, req, (err, val) => (err ? reject(err) : resolve(val)));
});
const socketEmitPromise = new Promise((resolve, reject) =>
socket.emit(event, req, (err, val) => (err ? reject(err) : resolve(val))),
);

let timeoutHandle: NodeJS.Timeout;
const timeoutPromiseFn = (_, reject) => {
timeoutHandle = setTimeout(() => {
clearTimeout(timeoutHandle);

const timeoutPromiseFn = (resolve, reject) => {
const id = setTimeout(() => {
clearTimeout(id);
const error = new Error(`Socket emit "${event}" : timed out (${timeout}ms)`);
error.name = SocketErrors.Timeout;

reject(error);
}, timeout);
};

const allPromises = timeout ? [socketEmitPromise, new Promise(timeoutPromiseFn)] : [socketEmitPromise];
const response = await Promise.race(
timeout ? [socketEmitPromise, new Promise(timeoutPromiseFn)] : [socketEmitPromise],
);

clearTimeout(timeoutHandle);

return Promise.race(allPromises);
return response;
};

0 comments on commit 3443f3a

Please sign in to comment.