code: func (t *Tracker) Consume(bytes int64) {
  	var rootExceed *Tracker
  	for tracker := t; tracker != nil; tracker = tracker.parent {
  		if atomic.AddInt64(&tracker.bytesConsumed, bytes) >= tracker.bytesLimit && tracker.bytesLimit > 0 {
  			rootExceed = tracker
  		}
  
  		if tracker.parent == nil {
  			// since we only need a total memory usage during execution,
  			// we only record max consumed bytes in root(statement-level) for performance.
  			for {
  				maxNow := atomic.LoadInt64(&tracker.maxConsumed)
  				consumed := atomic.LoadInt64(&tracker.bytesConsumed)
  				if consumed > maxNow && !atomic.CompareAndSwapInt64(&tracker.maxConsumed, maxNow, consumed) {
  					continue
  				}
  				break
  			}
  		}
  	}
  	if rootExceed != nil {
  		rootExceed.actionOnExceed.Action(rootExceed)
  	}
  }
docs: // Consume is used to consume a memory usage. "bytes" can be a negative value,
  // which means this is a memory release operation.