From e3ac7f4e367c7f928afd937601b5b5f13fda85c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20B=C3=BCchele?= Date: Fri, 3 Aug 2018 08:31:17 -0700 Subject: [PATCH] fix yarn deadlock in postinstall Summary: The script installing the plugin dependencies is executed by yarn itself. This means a yarn instance is running while the script is trying to create another yarn instance to install plugin dependencies. The second yarn instance is waiting for the first to finish, while the second can't start as long as the first hasn't finished. Deadlock. This is why we use a port dirrerent from yarn's default port (31997) for the mutex. Reviewed By: jknoxville Differential Revision: D9149973 fbshipit-source-id: 69790021460fd8ddea9ed84ca8130c77be0a62a9 --- .travis.yml | 6 +++++- scripts/yarn-install.js | 19 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index fcbb7a998..8e79fbc83 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,9 +8,13 @@ matrix: node_js: - "10" - script: + install: - cd website - yarn + - cd .. + + script: + - cd website - yarn build - cd .. diff --git a/scripts/yarn-install.js b/scripts/yarn-install.js index 1157e8128..eb65b8a5e 100644 --- a/scripts/yarn-install.js +++ b/scripts/yarn-install.js @@ -22,10 +22,21 @@ Promise.all( ), ) .then(async packages => { - for (const pkg of packages.reduce((acc, cv) => acc.concat(cv), [])) { - const {stderr} = await exec(YARN_PATH, { - cwd: pkg.replace('/package.json', ''), - }); + packages = packages.reduce((acc, cv) => acc.concat(cv), []); + console.log(`Installing dependencies for ${packages.length} plugins`); + for (const pkg of packages) { + const {stderr} = await exec( + // This script is itself executed by yarn (as postinstall script), + // therefore another yarn instance is running, while we are trying to + // install the plugin dependencies. We are setting a different port + // for the mutex of this yarn instance to make sure, it is not blocked + // by the yarn instance which is executing this script. Otherwise this + // will cause a deadlock. + [YARN_PATH, '--mutex', 'network:30330'].join(' '), + { + cwd: pkg.replace('/package.json', ''), + }, + ); if (stderr) { console.warn(stderr); } else {