code: func (c *baseFlowController) maybeAdjustWindowSize() {
  	bytesReadInEpoch := c.bytesRead - c.epochStartOffset
  	// don't do anything if less than half the window has been consumed
  	if bytesReadInEpoch <= c.receiveWindowSize/2 {
  		return
  	}
  	rtt := c.rttStats.SmoothedRTT()
  	if rtt == 0 {
  		return
  	}
  
  	fraction := float64(bytesReadInEpoch) / float64(c.receiveWindowSize)
  	if time.Since(c.epochStartTime) < time.Duration(4*fraction*float64(rtt)) {
  		// window is consumed too fast, try to increase the window size
  		c.receiveWindowSize = utils.MinByteCount(2*c.receiveWindowSize, c.maxReceiveWindowSize)
  	}
  	c.startNewAutoTuningEpoch()
  }
docs: // maybeAdjustWindowSize increases the receiveWindowSize if we're sending updates too often.
  // For details about auto-tuning, see https://docs.google.com/document/d/1SExkMmGiz8VYzV3s9E35JQlJ73vhzCekKkDi85F1qCE/edit?usp=sharing.