// tryLoadSchemaDiffs tries to only load latest schema changes. // Returns true if the schema is loaded successfully. // Returns false if the schema can not be loaded by schema diff, then we need to do full load. func (do *Domain) tryLoadSchemaDiffs(m *meta.Meta, usedVersion, newVersion int64) (bool, error) { if usedVersion == initialVersion || newVersion-usedVersion > maxNumberOfDiffsToLoad { // If there isn't any used version, or used version is too old, we do full load. return false, nil } if usedVersion > newVersion { // When user use History Read feature, history schema will be loaded. // usedVersion may be larger than newVersion, full load is needed. return false, nil } var diffs []*model.SchemaDiff for usedVersion < newVersion { usedVersion++ diff, err := m.GetSchemaDiff(usedVersion) if err != nil { return false, errors.Trace(err) } if diff == nil { // If diff is missing for any version between used and new version, we fall back to full reload. return false, nil } diffs = append(diffs, diff) } builder := infoschema.NewBuilder(do.infoHandle).InitWithOldInfoSchema() for _, diff := range diffs { err := builder.ApplyDiff(m, diff) if err != nil { return false, errors.Trace(err) } } builder.Build() return true, nil }