fix(cafs): create the locker once per process (#6836)

ref #6817
This commit is contained in:
Zoltan Kochan
2023-07-19 01:52:40 +03:00
committed by GitHub
parent c570abb192
commit 4bbf482d1e
6 changed files with 28 additions and 8 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/cafs": patch
---
The content-addressable store locker should be only created once per process. This fixes an issue that started happening after merging [#6817](https://github.com/pnpm/pnpm/pull/6817)

View File

@@ -34,14 +34,20 @@ export {
type PackageFilesIndex,
}
export function createCafs (cafsDir: string, ignore?: ((filename: string) => boolean)) {
const locker = new Map()
const _writeBufferToCafs = writeBufferToCafs.bind(null, locker, cafsDir)
export type CafsLocker = Map<string, number>
export interface CreateCafsOpts {
ignoreFile?: (filename: string) => boolean
cafsLocker?: CafsLocker
}
export function createCafs (cafsDir: string, { ignoreFile, cafsLocker }: CreateCafsOpts = {}) {
const _writeBufferToCafs = writeBufferToCafs.bind(null, cafsLocker ?? new Map(), cafsDir)
const addStream = addStreamToCafs.bind(null, _writeBufferToCafs)
const addBuffer = addBufferToCafs.bind(null, _writeBufferToCafs)
return {
addFilesFromDir: addFilesFromDir.bind(null, { addBuffer, addStream }),
addFilesFromTarball: addFilesFromTarball.bind(null, addStream, ignore ?? null),
addFilesFromTarball: addFilesFromTarball.bind(null, addStream, ignoreFile ?? null),
getFilePathInCafs: getFilePathInCafs.bind(null, cafsDir),
getFilePathByModeInCafs: getFilePathByModeInCafs.bind(null, cafsDir),
}

View File

@@ -1,6 +1,7 @@
import { promises as fs } from 'fs'
import path from 'path'
import {
type CafsLocker,
createCafs,
getFilePathByModeInCafs,
} from '@pnpm/cafs'
@@ -15,6 +16,8 @@ import memoize from 'mem'
import pathTemp from 'path-temp'
import mapValues from 'ramda/src/map'
export { type CafsLocker }
function createPackageImporter (
opts: {
importIndexedPackage?: ImportIndexedPackage
@@ -73,6 +76,7 @@ export function createCafsStore (
ignoreFile?: (filename: string) => boolean
importPackage?: ImportIndexedPackage
packageImportMethod?: 'auto' | 'hardlink' | 'copy' | 'clone' | 'clone-or-copy'
cafsLocker?: CafsLocker
}
): Cafs {
const cafsDir = path.join(storeDir, 'files')
@@ -83,7 +87,7 @@ export function createCafsStore (
cafsDir,
})
return {
...createCafs(cafsDir, opts?.ignoreFile),
...createCafs(cafsDir, opts),
cafsDir,
importPackage,
tempDir: async () => {

View File

@@ -1,3 +1,3 @@
export { createPackageStore } from './storeController'
export { createPackageStore, type CafsLocker } from './storeController'
export * from '@pnpm/store-controller-types'

View File

@@ -1,7 +1,7 @@
import {
type PackageFilesIndex,
} from '@pnpm/cafs'
import { createCafsStore } from '@pnpm/create-cafs-store'
import { createCafsStore, type CafsLocker } from '@pnpm/create-cafs-store'
import { type Fetchers } from '@pnpm/fetcher-base'
import { createPackageRequester } from '@pnpm/package-requester'
import { type ResolveFunction } from '@pnpm/resolver-base'
@@ -14,10 +14,13 @@ import loadJsonFile from 'load-json-file'
import writeJsonFile from 'write-json-file'
import { prune } from './prune'
export { type CafsLocker }
export async function createPackageStore (
resolve: ResolveFunction,
fetchers: Fetchers,
initOpts: {
cafsLocker?: CafsLocker
engineStrict?: boolean
force?: boolean
nodeVersion?: string

View File

@@ -1,7 +1,7 @@
import { promises as fs } from 'fs'
import { createClient, type ClientOptions } from '@pnpm/client'
import { type Config } from '@pnpm/config'
import { createPackageStore } from '@pnpm/package-store'
import { createPackageStore, type CafsLocker } from '@pnpm/package-store'
import { packageManager } from '@pnpm/cli-meta'
type CreateResolverOptions = Pick<Config,
@@ -42,6 +42,7 @@ export type CreateNewStoreControllerOptions = CreateResolverOptions & Pick<Confi
| 'userAgent'
| 'verifyStoreIntegrity'
> & {
cafsLocker?: CafsLocker
ignoreFile?: (filename: string) => boolean
} & Partial<Pick<Config, 'userConfig' | 'deployAllFiles'>> & Pick<ClientOptions, 'resolveSymlinksInInjectedDirs'>
@@ -89,6 +90,7 @@ export async function createNewStoreController (
await fs.mkdir(opts.storeDir, { recursive: true })
return {
ctrl: await createPackageStore(resolve, fetchers, {
cafsLocker: opts.cafsLocker,
engineStrict: opts.engineStrict,
force: opts.force,
nodeVersion: opts.nodeVersion,