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.
		
		
		
		
		
			
		
			
				
					
					
						
							92 lines
						
					
					
						
							2.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							92 lines
						
					
					
						
							2.2 KiB
						
					
					
				| package mount | |
| 
 | |
| import ( | |
| 	"github.com/seaweedfs/seaweedfs/weed/glog" | |
| 	"github.com/seaweedfs/seaweedfs/weed/mount/page_writer" | |
| ) | |
| 
 | |
| type PageWriter struct { | |
| 	fh            *FileHandle | |
| 	collection    string | |
| 	replication   string | |
| 	chunkSize     int64 | |
| 	writerPattern *WriterPattern | |
| 
 | |
| 	randomWriter page_writer.DirtyPages | |
| } | |
| 
 | |
| var ( | |
| 	_ = page_writer.DirtyPages(&PageWriter{}) | |
| ) | |
| 
 | |
| func newPageWriter(fh *FileHandle, chunkSize int64) *PageWriter { | |
| 	pw := &PageWriter{ | |
| 		fh:            fh, | |
| 		chunkSize:     chunkSize, | |
| 		writerPattern: NewWriterPattern(chunkSize), | |
| 		randomWriter:  newMemoryChunkPages(fh, chunkSize), | |
| 	} | |
| 	return pw | |
| } | |
| 
 | |
| func (pw *PageWriter) AddPage(offset int64, data []byte, isSequential bool, tsNs int64) { | |
| 
 | |
| 	glog.V(4).Infof("%v AddPage [%d, %d)", pw.fh.fh, offset, offset+int64(len(data))) | |
| 
 | |
| 	chunkIndex := offset / pw.chunkSize | |
| 	for i := chunkIndex; len(data) > 0; i++ { | |
| 		writeSize := min(int64(len(data)), (i+1)*pw.chunkSize-offset) | |
| 		pw.addToOneChunk(i, offset, data[:writeSize], isSequential, tsNs) | |
| 		offset += writeSize | |
| 		data = data[writeSize:] | |
| 	} | |
| } | |
| 
 | |
| func (pw *PageWriter) addToOneChunk(chunkIndex, offset int64, data []byte, isSequential bool, tsNs int64) { | |
| 	pw.randomWriter.AddPage(offset, data, isSequential, tsNs) | |
| } | |
| 
 | |
| func (pw *PageWriter) FlushData() error { | |
| 	return pw.randomWriter.FlushData() | |
| } | |
| 
 | |
| func (pw *PageWriter) ReadDirtyDataAt(data []byte, offset int64, tsNs int64) (maxStop int64) { | |
| 	glog.V(4).Infof("ReadDirtyDataAt %v [%d, %d)", pw.fh.inode, offset, offset+int64(len(data))) | |
| 
 | |
| 	chunkIndex := offset / pw.chunkSize | |
| 	for i := chunkIndex; len(data) > 0; i++ { | |
| 		readSize := min(int64(len(data)), (i+1)*pw.chunkSize-offset) | |
| 
 | |
| 		maxStop = pw.randomWriter.ReadDirtyDataAt(data[:readSize], offset, tsNs) | |
| 
 | |
| 		offset += readSize | |
| 		data = data[readSize:] | |
| 	} | |
| 
 | |
| 	return | |
| } | |
| 
 | |
| func (pw *PageWriter) LockForRead(startOffset, stopOffset int64) { | |
| 	pw.randomWriter.LockForRead(startOffset, stopOffset) | |
| } | |
| 
 | |
| func (pw *PageWriter) UnlockForRead(startOffset, stopOffset int64) { | |
| 	pw.randomWriter.UnlockForRead(startOffset, stopOffset) | |
| } | |
| 
 | |
| func (pw *PageWriter) Destroy() { | |
| 	pw.randomWriter.Destroy() | |
| } | |
| 
 | |
| func max(x, y int64) int64 { | |
| 	if x > y { | |
| 		return x | |
| 	} | |
| 	return y | |
| } | |
| func min(x, y int64) int64 { | |
| 	if x < y { | |
| 		return x | |
| 	} | |
| 	return y | |
| }
 |