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 }