mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-07 02:20:25 +08:00
优化open file cache,现在能缓存header
This commit is contained in:
@@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user