OpenAtomFoundation / pika

Pika is a Redis-Compatible database developed by Qihoo's infrastructure team.
BSD 3-Clause "New" or "Revised" License
5.76k stars 1.19k forks source link

fix: timer task is time out or enqueue queue_, should run task immediately #2761

Closed wang007987 closed 1 week ago

wang007987 commented 1 week ago

Summary by CodeRabbit

coderabbitai[bot] commented 1 week ago

Walkthrough

The ThreadPool class in src/net/src/thread_pool.cc now includes a new boolean variable rsignal_wait in the runInThread() method. This variable determines whether the thread should wait for specific conditions on a condition variable rsignal_ before proceeding, thus enabling more flexible control over thread execution.

Changes

File Change Summary
src/net/src/thread_pool.cc Added a boolean variable rsignal_wait to the runInThread() method. Modified rsignal_.wait() to use conditional checks.

Sequence Diagram(s)

sequenceDiagram
    participant Thread as Thread
    participant ThreadPool as ThreadPool
    participant RSignal as RSignal

    Thread->>ThreadPool: start runInThread()
    ThreadPool->>RSignal: rsignal_wait check
    alt rsignal_wait is true
        ThreadPool->>RSignal: wait()
        RSignal-->>ThreadPool: signal received
    else rsignal_wait is false
        ThreadPool->>ThreadPool: continue without wait
    end
    ThreadPool->>Thread: execute task

Poem

In the realm of threads, a signal's cue,
With rsignal_wait, a change anew.
Some paths will pause, others flow,
Immediate tasks, with speed they go.
Threads dance wisely, in sync with fate,
A tune of code they orchestrate.

     ~ Coderabbit 🐇✨

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)
Tips ### Chat There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai): - Review comments: Directly reply to a review comment made by CodeRabbit. Example: - `I pushed a fix in commit .` - `Generate unit testing code for this file.` - `Open a follow-up GitHub issue for this discussion.` - Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples: - `@coderabbitai generate unit testing code for this file.` - `@coderabbitai modularize this function.` - PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples: - `@coderabbitai generate interesting stats about this repository and render them as a table.` - `@coderabbitai show all the console.log statements in this repository.` - `@coderabbitai read src/utils.ts and generate unit testing code.` - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.` - `@coderabbitai help me debug CodeRabbit configuration file.` Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. ### CodeRabbit Commands (invoked as PR comments) - `@coderabbitai pause` to pause the reviews on a PR. - `@coderabbitai resume` to resume the paused reviews. - `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository. - `@coderabbitai full review` to do a full review from scratch and review all the files again. - `@coderabbitai summary` to regenerate the summary of the PR. - `@coderabbitai resolve` resolve all the CodeRabbit review comments. - `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository. - `@coderabbitai help` to get help. Additionally, you can add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed. ### CodeRabbit Configration File (`.coderabbit.yaml`) - You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository. - Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information. - If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json` ### Documentation and Community - Visit our [Documentation](https://coderabbit.ai/docs) for detailed information on how to use CodeRabbit. - Join our [Discord Community](https://discord.com/invite/GsXnASn26c) to get help, request features, and share feedback. - Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.
AlexStocks commented 1 week ago

@CodiumAI-Agent /review

CodiumAI-Agent commented 1 week ago

PR Reviewer Guide 🔍

⏱️ Estimated effort to review [1-5] 3
🧪 Relevant tests No
🔒 Security concerns No
⚡ Key issues to review Possible Bug:
The logic to reset rsignal_wait to true after waiting might lead to unexpected behavior or race conditions. It's important to ensure that the condition !queue_.empty() || !time_queue_.empty() || should_stop() is still valid after the lock is released and before it's acquired again.
Performance Concern:
The use of rsignal_.wait_for with a dynamic wait time based on exec_time - unow could lead to performance issues if not handled correctly, especially in a high-load scenario. This needs careful review to ensure it does not introduce latency or inefficiency.
AlexStocks commented 1 week ago

@wang007987 thank you for your PR. U have done a great job. Have u joined our Wechat group?

wangshao1 commented 1 week ago

加上这个逻辑之后,线程还是优先执行到期的timertask吧? 感觉这两个应该拆开,在一个线程中执行不太好。 另外,现在pika中应该是没有用到timer_task。

Issues-translate-bot commented 1 week ago

Bot detected the issue body's language is not English, translate it automatically.


After adding this logic, the thread should still give priority to executing the expired timertask, right? It feels like these two should be separated, and it is not very good to execute them in one thread. In addition, timer_task should not be used in pika now.

QlQlqiqi commented 1 week ago

sry, I think your pr maybe unuseful. I guess that u maybe wanna do task immediately after waiting for timer task. Because it costs much time for waiting. When jumping into wait function, if task is not empty, the wait function will be out immediately and if task is empty, the wait function will be waiting. So i think there is no bug in logic.

不好意思,我认为你的 pr 作用不大,我认为你也许是想在等待完 timer task 后立刻执行 task,因为等待需要花费很长时间。当进入 wait 函数的时候,如果 task 为空,wait 函数会直接返回,如果不为空,就继续等。所以我认为这里没有逻辑 bug。