client-go icon indicating copy to clipboard operation
client-go copied to clipboard

membuffer: fix data race when `IsReadOnly` and Set may be concurrently invoked

Open you06 opened this issue 1 year ago • 5 comments

ref pingcap/tidb#56178

TiDB concurrently call IsReadOnly and some write operations in union statement, so we need to avoid data race by mutex.

you06 avatar Oct 17 '24 11:10 you06

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: cfzjywxk

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment Approvers can cancel approval by writing /approve cancel in a comment

ti-chi-bot[bot] avatar Oct 18 '24 08:10 ti-chi-bot[bot]

[LGTM Timeline notifier]

Timeline:

  • 2024-10-18 08:12:09.98758155 +0000 UTC m=+604327.136491367: :ballot_box_with_check: agreed by cfzjywxk.

ti-chi-bot[bot] avatar Oct 18 '24 08:10 ti-chi-bot[bot]

I understand it fixes the data race. I'm just wondering whether it means we are using it correctly. What is the expected behavior when dirty is accessed concurrently?

I haven't checked the case yet but a first rough thought might be like:

Thread-1 gets dirty = false
Thread-2 writes dirty = true
Thread-1 does something that depends on dirty = false? // this can be problematic?

ekexium avatar Oct 18 '24 08:10 ekexium

Is there a test case in tidb to verify the fix?

There is a test case in the issue.

you06 avatar Oct 23 '24 02:10 you06

I understand it fixes the data race. I'm just wondering whether it means we are using it correctly. What is the expected behavior when dirty is accessed concurrently?

I haven't checked the case yet but a first rough thought might be like:

Thread-1 gets dirty = false
Thread-2 writes dirty = true
Thread-1 does something that depends on dirty = false? // this can be problematic?

For this question, we're just avoiding the race between UpdateFlags and IsDirty, if IsDirty() == true, the result from membuffer will be not-exist error and it finally read from the store.

This is a large topic because TiDB used to pretend it's executor is running in serial mode. So there may be some hidden issues with high possibility.

you06 avatar Oct 23 '24 07:10 you06