Skip to content

[Bug?]: TypeScript language server fails in vscode due to "No file descriptors available" (zipfs) #5172

@noahnu

Description

@noahnu

Self-service

  • I'd be willing to implement a fix

Describe the bug

Using Yarn 3.3.1 (pnp), TypeScript 4.9.4, and VSCode 1.74.2 (Universal), the TSServer will occasionally crash with "Libzip Error: Can't open file: No file descriptors available".

    Can't open file: No file descriptors available

    Libzip Error: Can't open file: No file descriptors available
        at ZipFS.makeLibzipError (/Users/noah/dev/project/.pnp.cjs:39578:25)
        at new ZipFS (/Users/noah/dev/project/.pnp.cjs:39553:20)
        at ZipOpenFS.getZipSync (/Users/noah/dev/project/.pnp.cjs:41739:18)
        at ZipOpenFS.makeCallSync (/Users/noah/dev/project/.pnp.cjs:41619:17)
        at ZipOpenFS.watchFile (/Users/noah/dev/project/.pnp.cjs:41582:17)
        at VirtualFS.watchFile (/Users/noah/dev/project/.pnp.cjs:40788:24)
        at PosixFS.watchFile (/Users/noah/dev/project/.pnp.cjs:40788:24)
        at NodePathFS.watchFile (/Users/noah/dev/project/.pnp.cjs:40788:24)
        at fsWatchFileWorker (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:7326:21)
        at /Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6897:133
        at createSingleWatcherPerName (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6447:26)
        at pollingWatchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6897:20)
        at watchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6778:28)
        at watchMissingFileSystemEntry (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:7006:24)
        at fsWatchHandlingExistenceOnHost (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6911:17)
        at /Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6900:168
        at createSingleWatcherPerName (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6447:26)
        at fsWatch (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6900:20)
        at Object.watchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6784:28)
        at watchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:118449:90)
        at Object.watchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:118519:115)
        at createFileWatcherWithLogging (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:118492:50)
        at Object.watchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:118475:34)
        at Project.watchAffectingFileLocation (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:173896:57)
        at createFileWatcherOfAffectingLocation (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:124669:32)
        at watchAffectingLocationsOfResolution (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:124638:17)
        at watchFailedLookupLocationOfResolution (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:124626:13)
        at Array.forEach (<anonymous>)
        at watchFailedLookupLocationOfNonRelativeModuleResolutions (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:124702:29)
        at Map.forEach (<anonymous>)
        at Object.finishCachingPerDirectoryResolution (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:124285:50)
        at Project.updateGraphWorker (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:174443:38)
        at Project.updateGraph (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:174368:42)
        at ConfiguredProject.updateGraph (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:175534:63)
        at ProjectService.createLoadAndUpdateConfiguredProject (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:177302:25)
        at ProjectService.assignProjectToOpenedScriptInfo (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:178389:44)
        at /Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:178729:97
        at Object.flatMap (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:524:25)
        at ProjectService.applyChangesInOpenFiles (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:178729:41)
        at Session.handlers.ts.Map.ts.getEntries._a.<computed> (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:180122:46)
        at /Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:182315:96
        at Session.executeWithRequestId (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:182306:28)
        at Session.executeCommand (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:182315:41)
        at Session.onMessage (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:182343:35)
        at IpcIOSession.onMessage (/Users/noah/dev/project/.yarn/sdks/typescript/lib/tsserver.js:199:32)
        at process.<anonymous> (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:186509:31)
        at process.emit (node:events:526:28)
        at process.emit (/Users/noah/dev/project/.pnp.cjs:46881:25)
        at emit (node:internal/child_process:938:14)
        at process.processTicksAndRejections (node:internal/process/task_queues:84:21)
Info 4870 [16:38:55.845] response:
    {"seq":0,"type":"response","command":"updateOpen","request_seq":2,"success":false,"message":"Error processing request. Can't open file: No file descriptors available\nLibzip Error: Can't open file: No file descriptors available\n    at ZipFS.makeLibzipError (/Users/noah/dev/project/.pnp.cjs:39578:25)\n    at new ZipFS (/Users/noah/dev/project/.pnp.cjs:39553:20)\n    at ZipOpenFS.getZipSync (/Users/noah/dev/project/.pnp.cjs:41739:18)\n    at ZipOpenFS.makeCallSync (/Users/noah/dev/project/.pnp.cjs:41619:17)\n    at ZipOpenFS.watchFile (/Users/noah/dev/project/.pnp.cjs:41582:17)\n    at VirtualFS.watchFile (/Users/noah/dev/project/.pnp.cjs:40788:24)\n    at PosixFS.watchFile (/Users/noah/dev/project/.pnp.cjs:40788:24)\n    at NodePathFS.watchFile (/Users/noah/dev/project/.pnp.cjs:40788:24)\n    at fsWatchFileWorker (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:7326:21)\n    at /Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6897:133\n    at createSingleWatcherPerName (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6447:26)\n    at pollingWatchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6897:20)\n    at watchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6778:28)\n    at watchMissingFileSystemEntry (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:7006:24)\n    at fsWatchHandlingExistenceOnHost (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6911:17)\n    at /Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6900:168\n    at createSingleWatcherPerName (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6447:26)\n    at fsWatch (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6900:20)\n    at Object.watchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:6784:28)\n    at watchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:118449:90)\n    at Object.watchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:118519:115)\n    at createFileWatcherWithLogging (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:118492:50)\n    at Object.watchFile (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:118475:34)\n    at Project.watchAffectingFileLocation (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:173896:57)\n    at createFileWatcherOfAffectingLocation (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:124669:32)\n    at watchAffectingLocationsOfResolution (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:124638:17)\n    at watchFailedLookupLocationOfResolution (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:124626:13)\n    at Array.forEach (<anonymous>)\n    at watchFailedLookupLocationOfNonRelativeModuleResolutions (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:124702:29)\n    at Map.forEach (<anonymous>)\n    at Object.finishCachingPerDirectoryResolution (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:124285:50)\n    at Project.updateGraphWorker (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:174443:38)\n    at Project.updateGraph (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:174368:42)\n    at ConfiguredProject.updateGraph (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:175534:63)\n    at ProjectService.createLoadAndUpdateConfiguredProject (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:177302:25)\n    at ProjectService.assignProjectToOpenedScriptInfo (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:178389:44)\n    at /Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:178729:97\n    at Object.flatMap (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:524:25)\n    at ProjectService.applyChangesInOpenFiles (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:178729:41)\n    at Session.handlers.ts.Map.ts.getEntries._a.<computed> (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:180122:46)\n    at /Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:182315:96\n    at Session.executeWithRequestId (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:182306:28)\n    at Session.executeCommand (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:182315:41)\n    at Session.onMessage (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:182343:35)\n    at IpcIOSession.onMessage (/Users/noah/dev/project/.yarn/sdks/typescript/lib/tsserver.js:199:32)\n    at process.<anonymous> (/Users/noah/.yarn/berry/cache/typescript-patch-7bc527fc0a-8.zip/node_modules/typescript/lib/tsserver.js:186509:31)\n    at process.emit (node:events:526:28)\n    at process.emit (/Users/noah/dev/project/.pnp.cjs:46881:25)\n    at emit (node:internal/child_process:938:14)\n    at process.processTicksAndRejections (node:internal/process/task_queues:84:21)"}

From playing around in my private project, it seems to be related to the number of files? Deleting a number of files (doesn't matter which ones) seems to ensure the TSServer starts up successfully. When I add back the files and reload VSCode, the TSServer gets stuck in a restart loop and gives up after 5 attempts.

I'm only experiencing this issue with TS 4.9.3 and 4.9.4. Downgrading to 4.8.4 works.

When I don't delete any files, I actually get "Cannot find module" for all npm modules, though the server doesn't appear to have failed. Looking at the logs, I see:

Info 4700 [16:52:04.779] DirectoryWatcher:: Added:: WatchInfo: /Users/noah/.yarn/berry/cache/gsap-npm-3.10.4-f56e6163df-8.zip/node_modules 1 undefined Project: /Users/noah/dev/project/tsconfig.json WatchType: Failed Lookup Locations
Info 4701 [16:52:04.779] Exception when creating directory watcher: Can't open file: No file descriptors available

which seems related to the above error.

As a workaround, using the old polling mechanism in vscode seems to work:

    "typescript.tsserver.watchOptions": {
        "watchFile": "fixedPollingInterval",
        "watchDirectory": "fixedPollingInterval"
    }

(the default watcher changed in 4.9: microsoft/TypeScript@10a7b4e)

To reproduce

Happens on a large project. Haven't been able to reproduce in a dedicated repo yet.

Environment

System:
    OS: macOS 12.6.2
    CPU: (8) arm64 Apple M1 Pro
  Binaries:
    Node: 16.18.1 - /private/var/folders/5m/4x2x5y6x5x5ck7rnpzq23dlc0000gn/T/xfs-111d8dba/node
    Yarn: 3.3.1 - /private/var/folders/5m/4x2x5y6x5x5ck7rnpzq23dlc0000gn/T/xfs-111d8dba/yarn
    npm: 8.19.2 - ~/.nvm/versions/node/v16.18.1/bin/npm

  VSCode:
    Version: 1.74.2 (Universal)
    Commit: e8a3071ea4344d9d48ef8a4df2c097372b0c5161
    Date: 2022-12-20T10:26:09.430Z
    Electron: 19.1.8
    Chromium: 102.0.5005.167
    Node.js: 16.14.2
    V8: 10.2.154.15-electron.0
    OS: Darwin arm64 21.6.0
    Sandboxed: No

My tsconfig.json:

{
    "compilerOptions": {
        "target": "ESNext",
        "noImplicitAny": true,
        "moduleResolution": "node",
        "allowJs": true,
        "noEmit": true,
        "strict": true,
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "experimentalDecorators": true,
        "downlevelIteration": true,
        "skipLibCheck": true,
        "jsx": "preserve",
        "lib": [
            "esnext",
            "dom",
            "dom.iterable"
        ],
        "resolveJsonModule": true,
        "noErrorTruncation": true
    },
    "include": [
        "src",
        "typings",
    ],
    "exclude": [
        "**/node_modules/*",
    ],
}

Additional context

Possibly related: #4488

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions