Skip to content

Conversation

@joehan
Copy link
Contributor

@joehan joehan commented Jul 10, 2025

Description

In a recent PR, I added a top level call to createWriteStream. This is generally no problem, unless you are running in read only file system, in which case it breaks everything. Fixes #8821

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary of Changes

Hello @joehan, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request resolves a critical issue where a top-level file write operation was causing firebase-tools to break in environments with read-only file systems, such as v1 Cloud Functions. My changes refactor the file stream creation to occur only when an associated class instance is initialized, thereby preventing the unconditional write and ensuring compatibility across various deployment environments.

Highlights

  • Problem Resolution: The core issue of firebase-tools failing in read-only file system environments (like v1 Cloud Functions) due to an unconditional top-level fs.createWriteStream call has been addressed.
  • Code Refactoring: The pgliteDebugLog WriteStream is no longer created at the top level of src/emulator/dataconnect/pgliteServer.ts. Instead, it has been moved into the PGliteExtendedQueryPatch class as an instance property, this.pgliteDebugLog.
  • Dependency Management: All subsequent calls to pgliteDebugLog.write have been updated to use the instance-specific this.pgliteDebugLog.write, ensuring the stream is only created when an instance of PGliteExtendedQueryPatch is initialized.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@joehan joehan requested review from aalej and taeold July 10, 2025 16:45
Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

The code changes move the createWriteStream call from the global scope to a class constructor to fix a crash on read-only file systems. However, the stream is not closed, leading to a resource leak. The log file is also truncated with each new connection. The review suggests fixing the log truncation and addressing the resource leak.

Comment on lines +287 to +289
constructor(public connection: PostgresConnection) {
this.pgliteDebugLog = fs.createWriteStream("pglite-debug.log");
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The pgliteDebugLog stream is created upon construction of PGliteExtendedQueryPatch, but is never closed. This can lead to a resource leak if many connections are created and destroyed. Consider adding a close method to PGliteExtendedQueryPatch to close the stream, and call this method when the connection is terminated. Also, the log file is truncated with each new connection, losing valuable debugging information. Use the append flag ('a') to prevent this.

this.pgliteDebugLog = fs.createWriteStream("pglite-debug.log", { flags: "a" });

Copy link
Contributor

@aalej aalej left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Tested deploying functions with these dependencies

  "dependencies": {
    "firebase-admin": "^12.6.0",
    "firebase-functions": "^6.0.1",
    "firebase-tools": "github:firebase/firebase-tools#jh-fix-v1-funcs"
  },

With code

const functions = require("firebase-functions/v1");
const logger = require("firebase-functions/logger");
const firebaseTools = require("firebase-tools")

exports.helloWorldV1 = functions.https.onRequest((request, response) => {
    logger.info("Hello logs!", { structuredData: true });
    const appsListDesc = firebaseTools.getCommand("apps:list").description()
    logger.log(appsListDesc)
    response.send(`Hello from Firebase! using v1 functions<br>app:list - ` + appsListDesc);
});

Invoking function outputs

image

@joehan joehan merged commit e1b8272 into master Jul 10, 2025
47 of 50 checks passed
@github-project-automation github-project-automation bot moved this from Approved [PR] to Done in [Cloud] Extensions + Functions Jul 10, 2025
@joehan joehan deleted the jh-fix-v1-funcs branch July 10, 2025 18:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

uncaughtException: EROFS: read-only file system, open 'pglite-debug.log'

3 participants