-
-
Notifications
You must be signed in to change notification settings - Fork 89
Add SqliteMessageQueue and related tests #526
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
base: main
Are you sure you want to change the base?
Conversation
Summary of ChangesHello @2chanhaeng, 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 significantly enhances the message queuing capabilities by introducing a new SQLite-based message queue implementation. Concurrently, it establishes a robust and standardized testing framework for message queues, which has been applied to existing implementations. This dual approach not only expands the available message queue options but also improves the consistency, reliability, and maintainability of message queue tests across the project, making future integrations and testing more efficient. Highlights
Using Gemini Code AssistThe 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 by creating a comment using either
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 Limitations & Feedback Gemini Code Assist 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. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. 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
|
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
This pull request introduces a new SqliteMessageQueue and a standardized testing utility, testMessageQueue, to unify message queue tests across the repository. The refactoring of existing tests to use this new utility is a great step towards reducing code duplication and ensuring consistent test coverage.
My review focuses on the new implementations. I've found a couple of critical issues in the SqliteMessageQueue related to race conditions and error handling that could lead to message loss and listener crashes. I've also identified areas for improvement in the new testMessageQueue utility to make it more robust and align with the MessageQueue interface. Additionally, I've suggested a minor improvement to the SQLite test to ensure proper cleanup of temporary database files.
Codecov Report❌ Patch coverage is
... and 3 files with indirect coverage changes 🚀 New features to boost your workflow:
|
- Remove `let Temporal ...` - Export `@fedify/sqlite` - Add missing dependencies
| } | ||
|
|
||
| const dbUrl = process.env.DATABASE_URL; | ||
| const dbUrl = process.env.POSTGRES_URL; |
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.
If this renaming is intentional, could you explain why this is needed?
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 other database URL variable names are matched with their respective database names.(e.g. REDIS_URL for redis) Therefore, to avoid confusion, I've also modified this one to match the naming convention.
|
How about adding |
| // Initialize if needed (e.g., create database tables) | ||
| if (options.initialize != null) { | ||
| await options.initialize(mq1); | ||
| } |
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.
I have some comments of options.initialize():
- If we have to initialise the message queues, why don't we init both
mq1andmq2? - I think message queues such as
SqliteMessageQueueandPostgresMessageQueuealready initialise internally so I don't think it's necessary. - Last, I couldn't find any tests use this (
options.initialize()).
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.
I was going to implement initialize but then decided to remove it and forgot to do so. I'll fix it. Thanks!
| this.#initialized = options.initialized ?? false; | ||
| this.#tableName = options.tableName ?? SqliteMessageQueue.#defaultTableName; | ||
| this.#pollIntervalMs = Temporal.Duration.from( | ||
| options.pollInterval ?? { milliseconds: 500 }, |
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 poll interval for the message queue. 5 seconds by default.
*/
pollInterval?: Temporal.Duration | Temporal.DurationLike;
}
There is a mismatch between in the document(line 31) and the actual default value.
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.
I forgot the comment. Thanks!
| const now = Temporal.Now.instant().epochMilliseconds; | ||
|
|
||
| // Atomically fetch and delete the oldest message that is ready to be | ||
| // processed using DELETE ... RETURNING (SQLite >= 3.35.0) |
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.
Maybe we could put this in the document as well?
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.
OK!
| "Failed to process message {id}: {error}", | ||
| { id: result.id, error }, | ||
| ); | ||
| throw error; |
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.
| Implementation | Handler Error | Result |
|---|---|---|
| Redis | Not caught | Breaks poll(), outer loop retries |
| Postgres | Not caught | Breaks poll(), outer loop retries |
| Sqlite | Caught + re-thrown | Terminates entire listen() |
I found SqliteMessageQueue is inconsistent in error handling. I think it should either:
- Not re-throw (like Redis/Postgres) - let outer loop continue
- Or document this "fail-fast" behavior explicitly
What do you think?
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.
Oh, that's a good point! I'll fix it.
That's a good idea, but it seems to go beyond #477. How about you create a separate issue for it? |
Summary
Introduce the
SqliteMessageQueueclass along with a testing framework formessage queues. Refactor existing tests to utilize the new
testMessageQueueutility for improved test structure and readability.
Related issue
SqliteMessageQueuefor single-node deployments #477Changes
SqliteMessageQueueclass to@fedify/sqlitepackage implementingthe
MessageQueueinterface using SQLite as the backing storetestMessageQueue()utility function to@fedify/testingpackagefor standardized testing of
MessageQueueimplementationswaitFor()andgetRandomKey()helper functions to@fedify/testingtestMessageQueue:@fedify/amqp@fedify/denokv@fedify/postgres@fedify/redisSqliteMessageQueueBenefits
a reusable test harness
MessageQueueimplementationsMessageQueueimplementations in the futurewith standardized testing
Checklist
mise teston your machine?