diff --git a/internal/caches/open_file.go b/internal/caches/open_file.go index f664660..09fbb6b 100644 --- a/internal/caches/open_file.go +++ b/internal/caches/open_file.go @@ -10,13 +10,15 @@ import ( type OpenFile struct { fp *os.File meta []byte + header []byte version int64 } -func NewOpenFile(fp *os.File, meta []byte) *OpenFile { +func NewOpenFile(fp *os.File, meta []byte, header []byte) *OpenFile { return &OpenFile{ - fp: fp, - meta: meta, + fp: fp, + meta: meta, + header: header, } } diff --git a/internal/caches/reader_file.go b/internal/caches/reader_file.go index c3fe12c..f4442ae 100644 --- a/internal/caches/reader_file.go +++ b/internal/caches/reader_file.go @@ -14,7 +14,9 @@ type FileReader struct { openFile *OpenFile openFileCache *OpenFileCache - meta []byte + meta []byte + header []byte + expiresAt int64 status int headerOffset int64 @@ -31,6 +33,11 @@ func NewFileReader(fp *os.File) *FileReader { } func (this *FileReader) Init() error { + if this.openFile != nil { + this.meta = this.openFile.meta + this.header = this.openFile.header + } + isOk := false defer func() { @@ -80,6 +87,21 @@ func (this *FileReader) Init() error { this.bodySize = int64(bodySize) this.bodyOffset = this.headerOffset + int64(headerSize) + // read header + if this.openFileCache != nil && len(this.header) == 0 { + if headerSize > 0 && headerSize <= 512 { + this.header = make([]byte, headerSize) + _, err := this.fp.Seek(this.headerOffset, io.SeekStart) + if err != nil { + return err + } + _, err = this.readToBuff(this.fp, this.header) + if err != nil { + return err + } + } + } + isOk = true return nil @@ -114,6 +136,22 @@ func (this *FileReader) BodySize() int64 { } func (this *FileReader) ReadHeader(buf []byte, callback ReaderFunc) error { + // 使用缓存 + if len(this.header) > 0 && len(buf) >= len(this.header) { + copy(buf, this.header) + _, err := callback(len(this.header)) + if err != nil { + return err + } + + // 移动到Body位置 + _, err = this.fp.Seek(this.bodyOffset, io.SeekStart) + if err != nil { + return err + } + return nil + } + isOk := false defer func() { @@ -335,7 +373,7 @@ func (this *FileReader) Close() error { if this.openFile != nil { this.openFileCache.Put(this.fp.Name(), this.openFile) } else { - this.openFileCache.Put(this.fp.Name(), NewOpenFile(this.fp, this.meta)) + this.openFileCache.Put(this.fp.Name(), NewOpenFile(this.fp, this.meta, this.header)) } return nil } diff --git a/internal/caches/storage_file.go b/internal/caches/storage_file.go index 65477d4..651d9ca 100644 --- a/internal/caches/storage_file.go +++ b/internal/caches/storage_file.go @@ -255,17 +255,16 @@ func (this *FileStorage) openReader(key string, allowMemory bool, useStale bool) } var fp *os.File var err error - var meta []byte - if openFile != nil { - fp, meta = openFile.fp, openFile.meta - } else { + if openFile == nil { fp, err = os.OpenFile(path, os.O_RDONLY, 0444) - } - if err != nil { - if !os.IsNotExist(err) { - return nil, err + if err != nil { + if !os.IsNotExist(err) { + return nil, err + } + return nil, ErrNotFound } - return nil, ErrNotFound + } else { + fp = openFile.fp } defer func() { if !isOk { @@ -274,12 +273,9 @@ func (this *FileStorage) openReader(key string, allowMemory bool, useStale bool) } }() - reader := NewFileReader(fp) + var reader = NewFileReader(fp) reader.openFile = openFile reader.openFileCache = this.openFileCache - if len(meta) > 0 { - reader.meta = meta - } err = reader.Init() if err != nil { return nil, err