From 492e0df543c6944e82b4c14bd7166eba6c764258 Mon Sep 17 00:00:00 2001 From: Lynn Date: Mon, 17 Jul 2023 16:57:46 +0800 Subject: [PATCH] domain: fix a bug when reloading take a long time in domain.Init (#45170) close pingcap/tidb#45176 --- domain/domain.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/domain/domain.go b/domain/domain.go index 5cd5077d8c66c..3a601f12310c1 100644 --- a/domain/domain.go +++ b/domain/domain.go @@ -1197,6 +1197,7 @@ func (do *Domain) Init( if err != nil { return err } + startReloadTime := time.Now() // step 2: domain reload the infoSchema. err = do.Reload() if err != nil { @@ -1212,6 +1213,17 @@ func (do *Domain) Init( // Only when the store is local that the lease value is 0. // If the store is local, it doesn't need loadSchemaInLoop. if ddlLease > 0 { + sub := time.Since(startReloadTime) + // The reload(in step 2) operation takes more than ddlLease and a new reload operation was not performed, + // the next query will respond by ErrInfoSchemaExpired error. So we do a new reload to update schemaValidator.latestSchemaExpire. + if sub > (ddlLease / 2) { + logutil.BgLogger().Warn("loading schema takes a long time, we do a new reload", zap.Duration("take time", sub)) + err = do.Reload() + if err != nil { + return err + } + } + // Local store needs to get the change information for every DDL state in each session. do.wg.Run(func() { do.loadSchemaInLoop(ctx, ddlLease)