func (d *ddl) checkOwner(t *meta.Meta) (*model.Owner, error) { owner, err := t.GetDDLOwner() if err != nil { return nil, errors.Trace(err) } if owner == nil { owner = &model.Owner{} // try to set onwer owner.OwnerID = d.uuid } now := time.Now().UnixNano() // we must wait 2 * lease time to guarantee other servers update the schema, // the owner will update its owner status every 2 * lease time, so here we use // 4 * lease to check its timeout. maxTimeout := int64(4 * d.lease) if owner.OwnerID == d.uuid || now-owner.LastUpdateTS > maxTimeout { owner.OwnerID = d.uuid owner.LastUpdateTS = now // update status. if err = t.SetDDLOwner(owner); err != nil { return nil, errors.Trace(err) } log.Debugf("become owner %s", owner.OwnerID) } if owner.OwnerID != d.uuid { log.Debugf("not owner, owner is %s", owner.OwnerID) return nil, errors.Trace(ErrNotOwner) } return owner, nil }
func (d *ddl) verifyOwner(t *meta.Meta) 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 }