mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 16:00: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,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,9 @@ type FileReader struct {
 | 
				
			|||||||
	openFile      *OpenFile
 | 
						openFile      *OpenFile
 | 
				
			||||||
	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,17 +255,16 @@ 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 {
 | 
				
			||||||
@@ -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