-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Fix top level writeStream breaking functions. #8824
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this 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-toolsfailing in read-only file system environments (like v1 Cloud Functions) due to an unconditional top-levelfs.createWriteStreamcall has been addressed. - Code Refactoring: The
pgliteDebugLogWriteStreamis no longer created at the top level ofsrc/emulator/dataconnect/pgliteServer.ts. Instead, it has been moved into thePGliteExtendedQueryPatchclass as an instance property,this.pgliteDebugLog. - Dependency Management: All subsequent calls to
pgliteDebugLog.writehave been updated to use the instance-specificthis.pgliteDebugLog.write, ensuring the stream is only created when an instance ofPGliteExtendedQueryPatchis 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
-
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. ↩
There was a problem hiding this 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.
| constructor(public connection: PostgresConnection) { | ||
| this.pgliteDebugLog = fs.createWriteStream("pglite-debug.log"); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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" });There was a problem hiding this 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
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