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

ddl: fix a bug that 'flashback table' does not handle mysql.gc_delete_range correctly (#38038) #38052

Merged
merged 2 commits into from
Sep 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions ddl/delete_range.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ type delRangeManager interface {
addDelRangeJob(ctx context.Context, job *model.Job) error
// removeFromGCDeleteRange removes the deleting table job from gc_delete_range table by jobID and tableID.
// It's use for recover the table that was mistakenly deleted.
removeFromGCDeleteRange(ctx context.Context, jobID int64, tableID []int64) error
removeFromGCDeleteRange(ctx context.Context, jobID int64) error
start()
clear()
}
Expand Down Expand Up @@ -125,13 +125,13 @@ func insertJobIntoDeleteRangeTableMultiSchema(ctx context.Context, sctx sessionc
}

// removeFromGCDeleteRange implements delRangeManager interface.
func (dr *delRange) removeFromGCDeleteRange(ctx context.Context, jobID int64, tableIDs []int64) error {
func (dr *delRange) removeFromGCDeleteRange(ctx context.Context, jobID int64) error {
sctx, err := dr.sessPool.get()
if err != nil {
return errors.Trace(err)
}
defer dr.sessPool.put(sctx)
err = util.RemoveMultiFromGCDeleteRange(ctx, sctx, jobID, tableIDs)
err = util.RemoveMultiFromGCDeleteRange(ctx, sctx, jobID)
return errors.Trace(err)
}

Expand Down
2 changes: 1 addition & 1 deletion ddl/mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ func (*mockDelRange) addDelRangeJob(_ context.Context, _ *model.Job) error {
}

// removeFromGCDeleteRange implements delRangeManager interface.
func (*mockDelRange) removeFromGCDeleteRange(_ context.Context, _ int64, _ []int64) error {
func (*mockDelRange) removeFromGCDeleteRange(_ context.Context, _ int64) error {
return nil
}

Expand Down
2 changes: 1 addition & 1 deletion ddl/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ func (w *worker) onRecoverTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in
return ver, errors.Wrapf(err, "failed to get old label rules from PD")
}

err = w.delRangeManager.removeFromGCDeleteRange(w.ctx, dropJobID, tids)
err = w.delRangeManager.removeFromGCDeleteRange(w.ctx, dropJobID)
if err != nil {
return ver, errors.Trace(err)
}
Expand Down
18 changes: 3 additions & 15 deletions ddl/util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ const (
loadDeleteRangeSQL = `SELECT HIGH_PRIORITY job_id, element_id, start_key, end_key FROM mysql.%n WHERE ts < %?`
recordDoneDeletedRangeSQL = `INSERT IGNORE INTO mysql.gc_delete_range_done SELECT * FROM mysql.gc_delete_range WHERE job_id = %? AND element_id = %?`
completeDeleteRangeSQL = `DELETE FROM mysql.gc_delete_range WHERE job_id = %? AND element_id = %?`
completeDeleteMultiRangesSQL = `DELETE FROM mysql.gc_delete_range WHERE job_id = %? AND element_id in (` // + idList + ")"
completeDeleteMultiRangesSQL = `DELETE FROM mysql.gc_delete_range WHERE job_id = %?`
updateDeleteRangeSQL = `UPDATE mysql.gc_delete_range SET start_key = %? WHERE job_id = %? AND element_id = %? AND start_key = %?`
deleteDoneRecordSQL = `DELETE FROM mysql.gc_delete_range_done WHERE job_id = %? AND element_id = %?`
loadGlobalVars = `SELECT HIGH_PRIORITY variable_name, variable_value from mysql.global_variables where variable_name in (` // + nameList + ")"
Expand Down Expand Up @@ -151,20 +151,8 @@ func RemoveFromGCDeleteRange(sctx sessionctx.Context, jobID, elementID int64) er
}

// RemoveMultiFromGCDeleteRange is exported for ddl pkg to use.
func RemoveMultiFromGCDeleteRange(ctx context.Context, sctx sessionctx.Context, jobID int64, elementIDs []int64) error {
var buf strings.Builder
buf.WriteString(completeDeleteMultiRangesSQL)
paramIDs := make([]interface{}, 0, 1+len(elementIDs))
paramIDs = append(paramIDs, jobID)
for i, elementID := range elementIDs {
if i > 0 {
buf.WriteString(", ")
}
buf.WriteString("%?")
paramIDs = append(paramIDs, elementID)
}
buf.WriteString(")")
_, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, buf.String(), paramIDs...)
func RemoveMultiFromGCDeleteRange(ctx context.Context, sctx sessionctx.Context, jobID int64) error {
_, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, completeDeleteMultiRangesSQL, jobID)
return errors.Trace(err)
}

Expand Down