Skip to content

Commit 012bfdd

Browse files
authored
ddl: handle context done after sending DDL jobs (#57945) (#57989)
close #57863
1 parent 1df27e0 commit 012bfdd

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

pkg/ddl/ddl.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,6 +1005,7 @@ func (d *ddl) close() {
10051005

10061006
startTime := time.Now()
10071007
d.cancel()
1008+
failpoint.InjectCall("afterDDLCloseCancel")
10081009
d.wg.Wait()
10091010
// when run with real-tikv, the lifecycle of ownerManager is managed by globalOwnerManager,
10101011
// when run with uni-store BreakCampaignLoop is same as Close.

pkg/ddl/executor.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6585,8 +6585,15 @@ func (e *executor) DoDDLJobWrapper(ctx sessionctx.Context, jobW *JobWrapper) (re
65856585
}
65866586
})
65876587

6588-
// worker should restart to continue handling tasks in limitJobCh, and send back through jobW.err
6589-
result := <-jobW.ResultCh[0]
6588+
var result jobSubmitResult
6589+
select {
6590+
case <-e.ctx.Done():
6591+
logutil.DDLLogger().Info("DoDDLJob will quit because context done")
6592+
return e.ctx.Err()
6593+
case res := <-jobW.ResultCh[0]:
6594+
// worker should restart to continue handling tasks in limitJobCh, and send back through jobW.err
6595+
result = res
6596+
}
65906597
// job.ID must be allocated after previous channel receive returns nil.
65916598
jobID, err := result.jobID, result.err
65926599
defer e.delJobDoneCh(jobID)
@@ -6656,7 +6663,7 @@ func (e *executor) DoDDLJobWrapper(ctx sessionctx.Context, jobW *JobWrapper) (re
66566663
ticker = updateTickerInterval(ticker, 10*e.lease, ddlAction, i)
66576664
case <-e.ctx.Done():
66586665
logutil.DDLLogger().Info("DoDDLJob will quit because context done")
6659-
return context.Canceled
6666+
return e.ctx.Err()
66606667
}
66616668

66626669
// If the connection being killed, we need to CANCEL the DDL job.

pkg/ddl/job_submitter_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,3 +581,17 @@ func TestGenGIDAndInsertJobsWithRetryOnErr(t *testing.T) {
581581
require.True(t, ok)
582582
require.Equal(t, newGID-1, jobs[0].TableID)
583583
}
584+
585+
func TestSubmitJobAfterDDLIsClosed(t *testing.T) {
586+
store, dom := testkit.CreateMockStoreAndDomain(t, mockstore.WithStoreType(mockstore.EmbedUnistore))
587+
tk := testkit.NewTestKit(t, store)
588+
589+
var ddlErr error
590+
testfailpoint.EnableCall(t, "github.com/pingcap/tidb/pkg/ddl/afterDDLCloseCancel", func() {
591+
ddlErr = tk.ExecToErr("create database test2;")
592+
})
593+
err := dom.DDL().Stop()
594+
require.NoError(t, err)
595+
require.Error(t, ddlErr)
596+
require.Equal(t, "context canceled", ddlErr.Error())
597+
}

0 commit comments

Comments
 (0)