You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							34 lines
						
					
					
						
							1.1 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							34 lines
						
					
					
						
							1.1 KiB
						
					
					
				| package util | |
| 
 | |
| import "time" | |
| 
 | |
| type WriteThrottler struct { | |
| 	compactionBytePerSecond int64 | |
| 	lastSizeCounter         int64 | |
| 	lastSizeCheckTime       time.Time | |
| } | |
| 
 | |
| func NewWriteThrottler(bytesPerSecond int64) *WriteThrottler { | |
| 	return &WriteThrottler{ | |
| 		compactionBytePerSecond: bytesPerSecond, | |
| 		lastSizeCheckTime:       time.Now(), | |
| 	} | |
| } | |
| 
 | |
| func (wt *WriteThrottler) MaybeSlowdown(delta int64) { | |
| 	if wt.compactionBytePerSecond > 0 { | |
| 		wt.lastSizeCounter += delta | |
| 		now := time.Now() | |
| 		elapsedDuration := now.Sub(wt.lastSizeCheckTime) | |
| 		if elapsedDuration > 100*time.Millisecond { | |
| 			overLimitBytes := wt.lastSizeCounter - wt.compactionBytePerSecond/10 | |
| 			if overLimitBytes > 0 { | |
| 				overRatio := float64(overLimitBytes) / float64(wt.compactionBytePerSecond) | |
| 				sleepTime := time.Duration(overRatio*1000) * time.Millisecond | |
| 				// glog.V(0).Infof("currently %d bytes, limit to %d bytes, over by %d bytes, sleeping %v over %.4f", wt.lastSizeCounter, wt.compactionBytePerSecond/10, overLimitBytes, sleepTime, overRatio) | |
| 				time.Sleep(sleepTime) | |
| 			} | |
| 			wt.lastSizeCounter, wt.lastSizeCheckTime = 0, time.Now() | |
| 		} | |
| 	} | |
| }
 |