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
This commit is contained in:
Daniel Büchele
2018-08-03 08:31:17 -07:00
committed by Facebook Github Bot
parent 410e6d14c8
commit e3ac7f4e36
2 changed files with 20 additions and 5 deletions

View File

@@ -8,9 +8,13 @@ matrix:
node_js:
- "10"
script:
install:
- cd website
- yarn
- cd ..
script:
- cd website
- yarn build
- cd ..

View File

@@ -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, {
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 {