-
Notifications
You must be signed in to change notification settings - Fork 5.8k
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
session: reset CTEStorageMap before txn conflict and retry() #49399
Conversation
Hi @tiancaiamao. Thanks for your PR. PRs from untrusted users cannot be marked as trusted with I understand the commands that are listed here. Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. |
Codecov Report
Additional details and impacted files@@ Coverage Diff @@
## master #49399 +/- ##
================================================
+ Coverage 71.0490% 71.6967% +0.6476%
================================================
Files 1368 1417 +49
Lines 401711 423152 +21441
================================================
+ Hits 285412 303386 +17974
- Misses 96443 100838 +4395
+ Partials 19856 18928 -928
Flags with carried forward coverage won't be shown. Click here to find out more.
|
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
@@ -153,3 +153,19 @@ create table t1(c1 int); | |||
insert into t1 values(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31), (32), (33), (34), (35), (36), (37), (38), (39), (40), (41), (42), (43), (44), (45), (46), (47), (48), (49), (50), (51), (52), (53), (54), (55), (56), (57), (58), (59), (60), (61), (62), (63), (64), (65), (66), (67), (68), (69), (70), (71), (72), (73), (74), (75), (76), (77), (78), (79), (80), (81), (82), (83), (84), (85), (86), (87), (88), (89), (90), (91), (92), (93), (94), (95), (96), (97), (98), (99), (100), (101), (102), (103), (104), (105), (106), (107), (108), (109), (110), (111), (112), (113), (114), (115), (116), (117), (118), (119), (120), (121), (122), (123), (124), (125), (126), (127), (128), (129), (130), (131), (132), (133), (134), (135), (136), (137), (138), (139), (140), (141), (142), (143), (144), (145), (146), (147), (148), (149), (150), (151), (152), (153), (154), (155), (156), (157), (158), (159), (160), (161), (162), (163), (164), (165), (166), (167), (168), (169), (170), (171), (172), (173), (174), (175), (176), (177), (178), (179), (180), (181), (182), (183), (184), (185), (186), (187), (188), (189), (190), (191), (192), (193), (194), (195), (196), (197), (198), (199), (200), (201), (202), (203), (204), (205), (206), (207), (208), (209), (210), (211), (212), (213), (214), (215), (216), (217), (218), (219), (220), (221), (222), (223), (224), (225), (226), (227), (228), (229), (230), (231), (232), (233), (234), (235), (236), (237), (238), (239), (240), (241), (242), (243), (244), (245), (246), (247), (248), (249), (250), (251), (252), (253), (254), (255), (256), (257), (258), (259), (260), (261), (262), (263), (264), (265), (266), (267), (268), (269), (270), (271), (272), (273), (274), (275), (276), (277), (278), (279), (280), (281), (282), (283), (284), (285), (286), (287), (288), (289), (290), (291), (292), (293), (294), (295), (296), (297), (298), (299); | |||
with recursive cte1(c1) as (select c1 from t1 union select c1 + 1 c1 from cte1 limit 1 offset 100) select * from cte1; | |||
set tidb_max_chunk_size=default; | |||
|
|||
# TestIssue46522 |
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 cannot reproduce the original panic in the issue with this test.
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.
This is the error stack,
[err="type assertion for CTEStorageMap failed
github.com/pingcap/tidb/pkg/executor.(*executorBuilder).buildCTE
/home/genius/project/src/github.com/pingcap/tidb/pkg/executor/builder.go:5277
github.com/pingcap/tidb/pkg/executor.(*executorBuilder).build
/home/genius/project/src/github.com/pingcap/tidb/pkg/executor/builder.go:308
github.com/pingcap/tidb/pkg/executor.(*executorBuilder).buildInsert
/home/genius/project/src/github.com/pingcap/tidb/pkg/executor/builder.go:976
github.com/pingcap/tidb/pkg/executor.(*executorBuilder).build
/home/genius/project/src/github.com/pingcap/tidb/pkg/executor/builder.go:194
github.com/pingcap/tidb/pkg/executor.(*ExecStmt).buildExecutor
/home/genius/project/src/github.com/pingcap/tidb/pkg/executor/adapter.go:1203
github.com/pingcap/tidb/pkg/executor.(*ExecStmt).Exec
/home/genius/project/src/github.com/pingcap/tidb/pkg/executor/adapter.go:550
github.com/pingcap/tidb/pkg/session.(*session).retry
/home/genius/project/src/github.com/pingcap/tidb/pkg/session/session.go:1177
github.com/pingcap/tidb/pkg/session.(*session).doCommitWithRetry
/home/genius/project/src/github.com/pingcap/tidb/pkg/session/session.go:898
github.com/pingcap/tidb/pkg/session.(*session).CommitTxn
/home/genius/project/src/github.com/pingcap/tidb/pkg/session/session.go:1001
github.com/pingcap/tidb/pkg/session.autoCommitAfterStmt
/home/genius/project/src/github.com/pingcap/tidb/pkg/session/tidb.go:298
github.com/pingcap/tidb/pkg/session.finishStmt
/home/genius/project/src/github.com/pingcap/tidb/pkg/session/tidb.go:260
github.com/pingcap/tidb/pkg/session.runStmt
/home/genius/project/src/github.com/pingcap/tidb/pkg/session/session.go:2413
github.com/pingcap/tidb/pkg/session.(*session).ExecuteStmt
/home/genius/project/src/github.com/pingcap/tidb/pkg/session/session.go:2236
github.com/pingcap/tidb/pkg/server.(*TiDBContext).ExecuteStmt
/home/genius/project/src/github.com/pingcap/tidb/pkg/server/driver_tidb.go:293
github.com/pingcap/tidb/pkg/server.(*clientConn).handleStmt
/home/genius/project/src/github.com/pingcap/tidb/pkg/server/conn.go:2045
github.com/pingcap/tidb/pkg/server.(*clientConn).handleQuery
/home/genius/project/src/github.com/pingcap/tidb/pkg/server/conn.go:1835
github.com/pingcap/tidb/pkg/server.(*clientConn).dispatch
/home/genius/project/src/github.com/pingcap/tidb/pkg/server/conn.go:1322
github.com/pingcap/tidb/pkg/server.(*clientConn).Run
/home/genius/project/src/github.com/pingcap/tidb/pkg/server/conn.go:1101
github.com/pingcap/tidb/pkg/server.(*Server).onConn
/home/genius/project/src/github.com/pingcap/tidb/pkg/server/server.go:701
runtime.goexit
/home/genius/project/go/src/runtime/asm_amd64.s:1650
previous statement: insert into issue46522 with t1 as (select id+1 from issue46522 where id = 1) select * from t1"]
I think they are the same type. @jackysp
doCommitWithRetry() -> retry() -> ... -> buildCTE() -> type assertion for CTEStorageMap failed
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
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: bb7133 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 |
@@ -1146,6 +1146,7 @@ func (s *session) retry(ctx context.Context, maxCnt uint) (err error) { | |||
for i, sr := range nh.history { | |||
st := sr.st | |||
s.sessionVars.StmtCtx = sr.stmtCtx | |||
s.sessionVars.StmtCtx.CTEStorageMap = map[int]*executor.CTEStorages{} |
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 believe this missing code is a typical example of 'session context' issue of TiDB. /cc @lcwangchao
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.
But I think the actual reason is the code path in retry is different with executing a new statement normally. In normal cases, ResetContextOfStmt
is called when we enter a new statement, but in retry logic, we use ResetForRetry
instead.
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.
Yes, but we cannot totally reset the stmtctx for retry.
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 retry behavior is disabled by default.
It cause lost update #10075
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 really hope one day we can get rid of the legacy code like this.
We can simplify the logic a lot!
In response to a cherrypick label: new pull request created to branch |
Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
In response to a cherrypick label: new pull request created to branch |
Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
In response to a cherrypick label: new pull request created to branch |
Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
In response to a cherrypick label: new pull request created to branch |
Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
In response to a cherrypick label: new pull request created to branch |
Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
What problem does this PR solve?
Issue Number: close #46522
Problem Summary:
sctx.CTEStorageMap
was set tonil
in finishStmt, the code may callretry()
indoCommitWithRetry()
and rebuild the statement, during the rebuild process,sctx.CTEStorageMap
type assertion fail.What changed and how does it work?
Check List
Tests
Side effects
Documentation
Release note
Please refer to Release Notes Language Style Guide to write a quality release note.