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.
		
		
		
		
		
			
		
			
				
					
					
						
							40 lines
						
					
					
						
							971 B
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							40 lines
						
					
					
						
							971 B
						
					
					
				| package mount | |
| 
 | |
| import "sync/atomic" | |
| 
 | |
| type WriterPattern struct { | |
| 	isSequentialCounter int64 | |
| 	lastWriteStopOffset int64 | |
| 	chunkSize           int64 | |
| } | |
| 
 | |
| const ModeChangeLimit = 3 | |
| 
 | |
| // For streaming write: only cache the first chunk | |
| // For random write: fall back to temp file approach | |
|  | |
| func NewWriterPattern(chunkSize int64) *WriterPattern { | |
| 	return &WriterPattern{ | |
| 		isSequentialCounter: 0, | |
| 		lastWriteStopOffset: 0, | |
| 		chunkSize:           chunkSize, | |
| 	} | |
| } | |
| 
 | |
| func (rp *WriterPattern) MonitorWriteAt(offset int64, size int) { | |
| 	lastOffset := atomic.SwapInt64(&rp.lastWriteStopOffset, offset+int64(size)) | |
| 	counter := atomic.LoadInt64(&rp.isSequentialCounter) | |
| 	if lastOffset == offset { | |
| 		if counter < ModeChangeLimit { | |
| 			atomic.AddInt64(&rp.isSequentialCounter, 1) | |
| 		} | |
| 	} else { | |
| 		if counter > -ModeChangeLimit { | |
| 			atomic.AddInt64(&rp.isSequentialCounter, -1) | |
| 		} | |
| 	} | |
| } | |
| 
 | |
| func (rp *WriterPattern) IsSequentialMode() bool { | |
| 	return atomic.LoadInt64(&rp.isSequentialCounter) >= 0 | |
| }
 |