Skip to content
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

[BugFix] use db lock in follower or cbo_use_db_lock is true #40725

Merged
merged 2 commits into from
Feb 5, 2024

Conversation

packy92
Copy link
Contributor

@packy92 packy92 commented Feb 5, 2024

Why I'm doing:

What I'm doing:
use db lock in follower or cbo_use_db_lock is true

Fixes #issue

What type of PR is this:

  • BugFix
  • Feature
  • Enhancement
  • Refactor
  • UT
  • Doc
  • Tool

Does this PR entail a change in behavior?

  • Yes, this PR will result in a change in behavior.
  • No, this PR will not result in a change in behavior.

If yes, please specify the type of change:

  • Interface/UI changes: syntax, type conversion, expression evaluation, display information
  • Parameter changes: default values, similar parameters but with different default values
  • Policy changes: use new policy to replace old one, functionality automatically enabled
  • Feature removed
  • Miscellaneous: upgrade & downgrade compatibility, etc.

Checklist:

  • I have added test cases for my bug fix or my new feature
  • This pr needs user documentation (for new or modified features or behaviors)
    • I have added documentation for my new feature or new function
  • This is a backport pr

Bugfix cherry-pick branch check:

  • I have checked the version labels which the pr will be auto-backported to the target branch
    • 3.2
    • 3.1
    • 3.0
    • 2.5

@mergify mergify bot assigned packy92 Feb 5, 2024
Signed-off-by: packy92 <wangchao@starrocks.com>
// 3. cbo_use_lock_db = false
return isOnlyOlapTable
&& GlobalStateMgr.getCurrentState().isLeader()
&& !session.getSessionVariable().isCboUseDBLock();
}

private static ExecPlan createQueryPlan(Relation relation,
Copy link

Choose a reason for hiding this comment

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

The most risky bug in this code is:
Potential deadlock or incorrect lock release when isLockFree condition changes after unlocking.

You can modify the code like this:

boolean lockReleased = false;
try {
    if (stmt instanceof QueryStatement) {
        QueryStatement queryStmt = (QueryStatement) stmt;
        resultSinkType = queryStmt.hasOutFileClause() ? TResultSinkType.FILE : resultSinkType;
        ExecPlan plan;

        // Check isLockFree before releasing the lock
        boolean lockFreeCondition = isLockFree(isOnlyOlapTableQueries, session);
        
        // Ensure that we only unlock and set needWholePhaseLock once based on the lock-free condition
        if (lockFreeCondition) {
            unLock(locker, dbs);
            lockReleased = true;
            needWholePhaseLock = false;
            plan = createQueryPlanWithReTry(queryStmt, session, resultSinkType);
        } else {
            plan = createQueryPlan(queryStmt.getQueryRelation(), session, resultSinkType);
        }

        setOutfileSink(queryStmt, plan);
        return plan;
    } else if (stmt instanceof InsertStmt) {
        // Handle other statement types...
    }
    // Continuing with the rest of the method...
} finally {
    // Ensure locks are properly released in case of exceptions before the manual unlock
    if (!lockReleased) {
        unLock(locker, dbs);
    }
}

Explanation: The main issue comes from changing the needWholePhaseLock condition and releasing locks based on runtime conditions which might change unexpectedly or could be subject to race conditions. It's crucial to ensure locks are correctly managed across all execution paths, including error handling. Adding a try-finally block ensures that resources are appropriately cleaned up even when exceptions occur. This modification doesn't directly solve concurrency issues but rather ensures that locks get released consistently, avoiding potential deadlocks or prematurely releasing locks. Further investigation might be needed to address the thread safety of isLockFree checks and their impacts comprehensively.

Signed-off-by: packy92 <wangchao@starrocks.com>
Copy link

sonarcloud bot commented Feb 5, 2024

Copy link

github-actions bot commented Feb 5, 2024

[FE Incremental Coverage Report]

pass : 12 / 12 (100.00%)

file detail

path covered_line new_line coverage not_covered_line_detail
🔵 com/starrocks/sql/StatementPlanner.java 12 12 100.00% []

Copy link

github-actions bot commented Feb 5, 2024

[BE Incremental Coverage Report]

pass : 0 / 0 (0%)

@kangkaisen kangkaisen merged commit 8fae880 into StarRocks:main Feb 5, 2024
62 of 64 checks passed
Copy link

github-actions bot commented Feb 5, 2024

@Mergifyio backport branch-3.1

Copy link

github-actions bot commented Feb 5, 2024

@Mergifyio backport branch-3.0

Copy link

github-actions bot commented Feb 5, 2024

@Mergifyio backport branch-2.5

@github-actions github-actions bot removed the 2.5 label Feb 5, 2024
Copy link
Contributor

mergify bot commented Feb 5, 2024

backport branch-3.1

✅ Backports have been created

Copy link
Contributor

mergify bot commented Feb 5, 2024

backport branch-3.0

✅ Backports have been created

Copy link
Contributor

mergify bot commented Feb 5, 2024

backport branch-2.5

✅ Backports have been created

mergify bot pushed a commit that referenced this pull request Feb 5, 2024
Signed-off-by: packy92 <wangchao@starrocks.com>
(cherry picked from commit 8fae880)

# Conflicts:
#	fe/fe-core/src/main/java/com/starrocks/sql/StatementPlanner.java
mergify bot pushed a commit that referenced this pull request Feb 5, 2024
Signed-off-by: packy92 <wangchao@starrocks.com>
(cherry picked from commit 8fae880)

# Conflicts:
#	fe/fe-core/src/main/java/com/starrocks/sql/StatementPlanner.java
mergify bot pushed a commit that referenced this pull request Feb 5, 2024
Signed-off-by: packy92 <wangchao@starrocks.com>
(cherry picked from commit 8fae880)

# Conflicts:
#	fe/fe-core/src/main/java/com/starrocks/sql/StatementPlanner.java
wanpengfei-git pushed a commit that referenced this pull request Feb 5, 2024
…40725) (#40752)

Signed-off-by: packy92 <wangchao@starrocks.com>
Co-authored-by: packy92 <110370499+packy92@users.noreply.github.com>
Co-authored-by: packy92 <wangchao@starrocks.com>
wanpengfei-git pushed a commit that referenced this pull request Feb 5, 2024
…40725) (#40753)

Signed-off-by: packy92 <wangchao@starrocks.com>
Co-authored-by: packy92 <110370499+packy92@users.noreply.github.com>
Co-authored-by: packy92 <wangchao@starrocks.com>
wanpengfei-git pushed a commit that referenced this pull request Feb 5, 2024
…40725) (#40751)

Signed-off-by: packy92 <wangchao@starrocks.com>
Co-authored-by: packy92 <110370499+packy92@users.noreply.github.com>
Co-authored-by: packy92 <wangchao@starrocks.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants