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
							 | 
						|
								}
							 |