func (d *ddl) checkOwner(t *meta.Meta, flag JobType) (*model.Owner, error) { var owner *model.Owner var err error switch flag { case ddlJobFlag: owner, err = t.GetDDLJobOwner() case bgJobFlag: owner, err = t.GetBgJobOwner() default: err = errInvalidJobFlag } 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. switch flag { case ddlJobFlag: err = t.SetDDLJobOwner(owner) case bgJobFlag: err = t.SetBgJobOwner(owner) } if err != nil { return nil, errors.Trace(err) } log.Debugf("[ddl] become %s job owner %s", flag, owner.OwnerID) } if owner.OwnerID != d.uuid { log.Debugf("[ddl] not %s job owner, owner is %s", flag, owner.OwnerID) return nil, errors.Trace(errNotOwner) } return owner, nil }
func (d *ddl) checkOwner(t *meta.Meta, flag JobType) (*model.Owner, error) { owner, err := d.getJobOwner(t, flag) 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() maxTimeout := d.getCheckOwnerTimeout(flag) sub := now - owner.LastUpdateTS if owner.OwnerID == d.uuid || sub > maxTimeout { owner.OwnerID = d.uuid owner.LastUpdateTS = now // update status. switch flag { case ddlJobFlag: err = t.SetDDLJobOwner(owner) case bgJobFlag: err = t.SetBgJobOwner(owner) } if err != nil { return nil, errors.Trace(err) } log.Debugf("[ddl] become %s job owner, owner is %s sub %vs", flag, owner, sub/1e9) } if owner.OwnerID != d.uuid { log.Debugf("[ddl] not %s job owner, self id %s owner is %s", flag, d.uuid, owner.OwnerID) return nil, errors.Trace(errNotOwner) } return owner, nil }