code: func (w *GCWorker) leaderTick(ctx context.Context) error {
  	if w.gcIsRunning {
  		logutil.Logger(ctx).Info("[gc worker] there's already a gc job running, skipped",
  			zap.String("leaderTick on", w.uuid))
  		return nil
  	}
  
  	ok, safePoint, err := w.prepare()
  	if err != nil || !ok {
  		if err != nil {
  			metrics.GCJobFailureCounter.WithLabelValues("prepare").Inc()
  		}
  		w.gcIsRunning = false
  		return errors.Trace(err)
  	}
  	// When the worker is just started, or an old GC job has just finished,
  	// wait a while before starting a new job.
  	if time.Since(w.lastFinish) < gcWaitTime {
  		w.gcIsRunning = false
  		logutil.Logger(ctx).Info("[gc worker] another gc job has just finished, skipped.",
  			zap.String("leaderTick on ", w.uuid))
  		return nil
  	}
  
  	w.gcIsRunning = true
  	logutil.Logger(ctx).Info("[gc worker] starts the whole job",
  		zap.String("uuid", w.uuid),
  		zap.Uint64("safePoint", safePoint))
  	go w.runGCJob(ctx, safePoint)
  	return nil
  }
docs: // leaderTick of GC worker checks if it should start a GC job every tick.