github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/diskqueue/qfile_size_reader.go (about)

     1  package diskqueue
     2  
     3  import "context"
     4  
     5  type qfileSizeReaderInterface interface {
     6  	Read(ctx context.Context, sizeBytes []byte) (err error)
     7  	NextOffset() int64
     8  }
     9  
    10  var _ qfileSizeReaderInterface = (*QfileSizeReader)(nil)
    11  
    12  // QfileSizeReader for read qfile by size
    13  type QfileSizeReader struct {
    14  	qf         *qfile
    15  	fileOffset int64
    16  	isLatest   bool
    17  }
    18  
    19  // if ctx is nil, won't wait for commit
    20  func (r *QfileSizeReader) Read(ctx context.Context, sizeBytes []byte) (err error) {
    21  
    22  	_, err = r.qf.mappedFile.ReadRLocked(r.fileOffset, sizeBytes)
    23  	if err != nil {
    24  		if !r.isLatest {
    25  			return
    26  		}
    27  		if ctx == nil {
    28  			// nil means don't wait
    29  			return
    30  		}
    31  		err = r.qf.q.wm.Wait(ctx, r.qf.startOffset+r.fileOffset+int64(len(sizeBytes)))
    32  		if err != nil {
    33  			return
    34  		}
    35  		_, err = r.qf.mappedFile.ReadRLocked(r.fileOffset, sizeBytes)
    36  		if err != nil {
    37  			// 说明换文件了
    38  			return
    39  		}
    40  	}
    41  
    42  	r.fileOffset += int64(len(sizeBytes))
    43  	return
    44  }
    45  
    46  // NextOffset returns the next offset to read from
    47  func (r *QfileSizeReader) NextOffset() int64 {
    48  	return r.qf.startOffset + r.fileOffset
    49  }