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:
committed by
Facebook Github Bot
parent
410e6d14c8
commit
e3ac7f4e36
@@ -8,9 +8,13 @@ matrix:
|
||||
node_js:
|
||||
- "10"
|
||||
|
||||
script:
|
||||
install:
|
||||
- cd website
|
||||
- yarn
|
||||
- cd ..
|
||||
|
||||
script:
|
||||
- cd website
|
||||
- yarn build
|
||||
- cd ..
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user