From f0adfbfde682f9338a6837660d82951df5430198 Mon Sep 17 00:00:00 2001 From: wjhuang2016 Date: Mon, 20 Jun 2022 14:44:45 +0800 Subject: [PATCH 1/3] done Signed-off-by: wjhuang2016 --- ddl/ddl.go | 21 ++++++++++++--------- owner/manager.go | 29 +++++++++++++++++++---------- owner/mock.go | 12 +++++++++--- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/ddl/ddl.go b/ddl/ddl.go index c724068080db3..d086eed2e704d 100644 --- a/ddl/ddl.go +++ b/ddl/ddl.go @@ -389,6 +389,18 @@ func (d *ddl) Start(ctxPool *pools.ResourcePool) error { // If RunWorker is true, we need campaign owner and do DDL job. // Otherwise, we needn't do that. if RunWorker { + d.ownerManager.SetBeOwnerHook(func() { + err := kv.RunInNewTxn(d.ctx, d.store, true, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + var err error + d.ddlSeqNumMu.seqNum, err = t.GetHistoryDDLCount() + return err + }) + if err != nil { + logutil.BgLogger().Error("error when getting the ddl history count", zap.Error(err)) + } + }) + err := d.ownerManager.CampaignOwner() if err != nil { return errors.Trace(err) @@ -410,15 +422,6 @@ func (d *ddl) Start(ctxPool *pools.ResourcePool) error { asyncNotify(worker.ddlJobCh) } - err = kv.RunInNewTxn(d.ctx, d.store, true, func(ctx context.Context, txn kv.Transaction) error { - t := meta.NewMeta(txn) - d.ddlSeqNumMu.seqNum, err = t.GetHistoryDDLCount() - return err - }) - if err != nil { - return err - } - go d.schemaSyncer.StartCleanWork() if config.TableLockEnabled() { d.wg.Add(1) diff --git a/owner/manager.go b/owner/manager.go index f90dd4cebdd2d..78dc917468f77 100644 --- a/owner/manager.go +++ b/owner/manager.go @@ -54,6 +54,9 @@ type Manager interface { Cancel() // RequireOwner requires the ownerManager is owner. RequireOwner(ctx context.Context) error + + // SetBeOwnerHook sets a hook for be an owner. The hook is called before becoming an owner. + SetBeOwnerHook(hook func()) } const ( @@ -68,16 +71,17 @@ type DDLOwnerChecker interface { // ownerManager represents the structure which is used for electing owner. type ownerManager struct { - id string // id is the ID of the manager. - key string - ctx context.Context - prompt string - logPrefix string - logCtx context.Context - etcdCli *clientv3.Client - cancel context.CancelFunc - elec unsafe.Pointer - wg sync.WaitGroup + id string // id is the ID of the manager. + key string + ctx context.Context + prompt string + logPrefix string + logCtx context.Context + etcdCli *clientv3.Client + cancel context.CancelFunc + elec unsafe.Pointer + wg sync.WaitGroup + beOwnerHook func() } // NewOwnerManager creates a new Manager. @@ -117,6 +121,10 @@ func (m *ownerManager) RequireOwner(ctx context.Context) error { return nil } +func (m *ownerManager) SetBeOwnerHook(hook func()) { + m.beOwnerHook = hook +} + // ManagerSessionTTL is the etcd session's TTL in seconds. It's exported for testing. var ManagerSessionTTL = 60 @@ -166,6 +174,7 @@ func (m *ownerManager) ResignOwner(ctx context.Context) error { } func (m *ownerManager) toBeOwner(elec *concurrency.Election) { + m.beOwnerHook() atomic.StorePointer(&m.elec, unsafe.Pointer(elec)) } diff --git a/owner/mock.go b/owner/mock.go index c13ff88f3fdf6..3433853e61fd6 100644 --- a/owner/mock.go +++ b/owner/mock.go @@ -27,9 +27,10 @@ var _ Manager = &mockManager{} // It's used for local store and testing. // So this worker will always be the owner. type mockManager struct { - owner int32 - id string // id is the ID of manager. - cancel context.CancelFunc + owner int32 + id string // id is the ID of manager. + cancel context.CancelFunc + beOwnerHook func() } // NewMockManager creates a new mock Manager. @@ -52,6 +53,7 @@ func (m *mockManager) IsOwner() bool { } func (m *mockManager) toBeOwner() { + m.beOwnerHook() atomic.StoreInt32(&m.owner, 1) } @@ -91,3 +93,7 @@ func (m *mockManager) ResignOwner(ctx context.Context) error { func (m *mockManager) RequireOwner(context.Context) error { return nil } + +func (m *mockManager) SetBeOwnerHook(hook func()) { + m.beOwnerHook = hook +} From ee357408713d89068589d0738842750e54aaeb4f Mon Sep 17 00:00:00 2001 From: wjhuang2016 Date: Mon, 20 Jun 2022 14:58:07 +0800 Subject: [PATCH 2/3] refine comment Signed-off-by: wjhuang2016 --- owner/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owner/manager.go b/owner/manager.go index 78dc917468f77..7f0394a961590 100644 --- a/owner/manager.go +++ b/owner/manager.go @@ -55,7 +55,7 @@ type Manager interface { // RequireOwner requires the ownerManager is owner. RequireOwner(ctx context.Context) error - // SetBeOwnerHook sets a hook for be an owner. The hook is called before becoming an owner. + // SetBeOwnerHook sets a hook. The hook is called before becoming an owner. SetBeOwnerHook(hook func()) } From c011728d382bced4861ebbf201bb04544ad822e5 Mon Sep 17 00:00:00 2001 From: wjhuang2016 Date: Mon, 20 Jun 2022 15:59:00 +0800 Subject: [PATCH 3/3] fix test Signed-off-by: wjhuang2016 --- owner/manager.go | 4 +++- owner/mock.go | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/owner/manager.go b/owner/manager.go index 7f0394a961590..1f4eae6c11786 100644 --- a/owner/manager.go +++ b/owner/manager.go @@ -174,7 +174,9 @@ func (m *ownerManager) ResignOwner(ctx context.Context) error { } func (m *ownerManager) toBeOwner(elec *concurrency.Election) { - m.beOwnerHook() + if m.beOwnerHook != nil { + m.beOwnerHook() + } atomic.StorePointer(&m.elec, unsafe.Pointer(elec)) } diff --git a/owner/mock.go b/owner/mock.go index 3433853e61fd6..559c46650d080 100644 --- a/owner/mock.go +++ b/owner/mock.go @@ -53,7 +53,9 @@ func (m *mockManager) IsOwner() bool { } func (m *mockManager) toBeOwner() { - m.beOwnerHook() + if m.beOwnerHook != nil { + m.beOwnerHook() + } atomic.StoreInt32(&m.owner, 1) }