code: func (w *watchCache) waitUntilFreshAndBlock(resourceVersion uint64, trace *utiltrace.Trace) error {
  	startTime := w.clock.Now()
  	go func() {
  		// Wake us up when the time limit has expired.  The docs
  		// promise that time.After (well, NewTimer, which it calls)
  		// will wait *at least* the duration given. Since this go
  		// routine starts sometime after we record the start time, and
  		// it will wake up the loop below sometime after the broadcast,
  		// we don't need to worry about waking it up before the time
  		// has expired accidentally.
  		<-w.clock.After(blockTimeout)
  		w.cond.Broadcast()
  	}()
  
  	w.RLock()
  	if trace != nil {
  		trace.Step("watchCache locked acquired")
  	}
  	for w.resourceVersion < resourceVersion {
  		if w.clock.Since(startTime) >= blockTimeout {
  			// Timeout with retry after 1 second.
  			return errors.NewTimeoutError(fmt.Sprintf("Too large resource version: %v, current: %v", resourceVersion, w.resourceVersion), 1)
  		}
  		w.cond.Wait()
  	}
  	if trace != nil {
  		trace.Step("watchCache fresh enough")
  	}
  	return nil
  }
docs: // waitUntilFreshAndBlock waits until cache is at least as fresh as given <resourceVersion>.
  // NOTE: This function acquired lock and doesn't release it.
  // You HAVE TO explicitly call w.RUnlock() after this function.