优化open file cache,现在能缓存header

This commit is contained in:
刘祥超
2022-01-13 15:18:49 +08:00
parent 2a1cc63989
commit 00cd86a8b3
3 changed files with 54 additions and 18 deletions

View File

@@ -10,13 +10,15 @@ import (
type OpenFile struct { type OpenFile struct {
fp *os.File fp *os.File
meta []byte meta []byte
header []byte
version int64 version int64
} }
func NewOpenFile(fp *os.File, meta []byte) *OpenFile { func NewOpenFile(fp *os.File, meta []byte, header []byte) *OpenFile {
return &OpenFile{ return &OpenFile{
fp: fp, fp: fp,
meta: meta, meta: meta,
header: header,
} }
} }

View File

@@ -15,6 +15,8 @@ type FileReader struct {
openFileCache *OpenFileCache openFileCache *OpenFileCache
meta []byte meta []byte
header []byte
expiresAt int64 expiresAt int64
status int status int
headerOffset int64 headerOffset int64
@@ -31,6 +33,11 @@ func NewFileReader(fp *os.File) *FileReader {
} }
func (this *FileReader) Init() error { func (this *FileReader) Init() error {
if this.openFile != nil {
this.meta = this.openFile.meta
this.header = this.openFile.header
}
isOk := false isOk := false
defer func() { defer func() {
@@ -80,6 +87,21 @@ func (this *FileReader) Init() error {
this.bodySize = int64(bodySize) this.bodySize = int64(bodySize)
this.bodyOffset = this.headerOffset + int64(headerSize) 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 isOk = true
return nil return nil
@@ -114,6 +136,22 @@ func (this *FileReader) BodySize() int64 {
} }
func (this *FileReader) ReadHeader(buf []byte, callback ReaderFunc) error { 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 isOk := false
defer func() { defer func() {
@@ -335,7 +373,7 @@ func (this *FileReader) Close() error {
if this.openFile != nil { if this.openFile != nil {
this.openFileCache.Put(this.fp.Name(), this.openFile) this.openFileCache.Put(this.fp.Name(), this.openFile)
} else { } 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 return nil
} }

View File

@@ -255,18 +255,17 @@ func (this *FileStorage) openReader(key string, allowMemory bool, useStale bool)
} }
var fp *os.File var fp *os.File
var err error var err error
var meta []byte if openFile == nil {
if openFile != nil {
fp, meta = openFile.fp, openFile.meta
} else {
fp, err = os.OpenFile(path, os.O_RDONLY, 0444) fp, err = os.OpenFile(path, os.O_RDONLY, 0444)
}
if err != nil { if err != nil {
if !os.IsNotExist(err) { if !os.IsNotExist(err) {
return nil, err return nil, err
} }
return nil, ErrNotFound return nil, ErrNotFound
} }
} else {
fp = openFile.fp
}
defer func() { defer func() {
if !isOk { if !isOk {
_ = fp.Close() _ = fp.Close()
@@ -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.openFile = openFile
reader.openFileCache = this.openFileCache reader.openFileCache = this.openFileCache
if len(meta) > 0 {
reader.meta = meta
}
err = reader.Init() err = reader.Init()
if err != nil { if err != nil {
return nil, err return nil, err