func (d *ddl) verifyOwner(t *meta.TMeta) error { owner, err := t.GetDDLOwner() if err != nil { return errors.Trace(err) } if owner == nil { owner = &model.Owner{} // try to set onwer owner.OwnerID = d.uuid } now := time.Now().Unix() maxTimeout := int64(4 * d.lease) if owner.OwnerID == d.uuid || now-owner.LastUpdateTS > maxTimeout { owner.OwnerID = d.uuid owner.LastUpdateTS = now // update or try to set itself as owner. if err = t.SetDDLOwner(owner); err != nil { return errors.Trace(err) } } if owner.OwnerID != d.uuid { return errors.Trace(ErrNotOwner) } return nil }
// every time we enter another state, we must call this function. func (d *ddl) updateJob(t *meta.TMeta, job *model.Job) error { err := d.verifyOwner(t) if err != nil { return errors.Trace(err) } err = t.UpdateDDLJob(0, job) return errors.Trace(err) }
func (d *ddl) verifySchemaMetaVersion(t *meta.TMeta, schemaMetaVersion int64) error { curVer, err := t.GetSchemaVersion() if err != nil { return errors.Trace(err) } if curVer != schemaMetaVersion { return errors.Errorf("Schema changed, our version %d, but got %d", schemaMetaVersion, curVer) } // Increment version. _, err = t.GenSchemaVersion() return errors.Trace(err) }
func (do *Domain) loadInfoSchema(m *meta.TMeta) (err error) { schemaMetaVersion, err := m.GetSchemaVersion() if err != nil { return errors.Trace(err) } info := do.infoHandle.Get() if info != nil && schemaMetaVersion > 0 && schemaMetaVersion == info.SchemaMetaVersion() { log.Debugf("schema version is still %d, no need reload", schemaMetaVersion) return nil } schemas, err := m.ListDatabases() if err != nil { return errors.Trace(err) } for _, di := range schemas { tables, err := m.ListTables(di.ID) if err != nil { return errors.Trace(err) } di.Tables = tables } log.Infof("loadInfoSchema %d", schemaMetaVersion) do.infoHandle.Set(schemas, schemaMetaVersion) return }