mirror of
https://github.com/pnpm/pnpm.git
synced 2026-01-11 00:18:32 -05:00
fix: prevent EBUSY caused by parallel dlx (#8604)
This commit is contained in:
6
.changeset/green-bikes-sparkle.md
Normal file
6
.changeset/green-bikes-sparkle.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
"@pnpm/plugin-commands-script-runners": patch
|
||||
"pnpm": patch
|
||||
---
|
||||
|
||||
Prevent `EBUSY` errors caused by calling `symlinkDir` in parallel `dlx` processes.
|
||||
@@ -91,7 +91,17 @@ export async function handler (
|
||||
saveOptional: false,
|
||||
savePeer: false,
|
||||
}, pkgs)
|
||||
await symlinkDir(cachedDir, cacheLink, { overwrite: true })
|
||||
try {
|
||||
await symlinkDir(cachedDir, cacheLink, { overwrite: true })
|
||||
} catch (error) {
|
||||
// EBUSY means that there is another dlx process running in parallel that has acquired the cache link first.
|
||||
// The link created by the other process is just as up-to-date as the link the current process was attempting
|
||||
// to create. Therefore, instead of re-attempting to create the current link again, it is just as good to let
|
||||
// the other link stay. The current process should yield.
|
||||
if (!util.types.isNativeError(error) || !('code' in error) || error.code !== 'EBUSY') {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
}
|
||||
const modulesDir = path.join(cachedDir, 'node_modules')
|
||||
const binsDir = path.join(modulesDir, '.bin')
|
||||
|
||||
Reference in New Issue
Block a user