possible fix for rare panic

This commit is contained in:
ston1th 2022-10-08 13:45:12 +02:00
commit 88861102fd
4 changed files with 20 additions and 17 deletions

View file

@ -4,6 +4,7 @@ package fs
import ( import (
"cachefs/pkg/provider" "cachefs/pkg/provider"
"cachefs/pkg/provider/crypto"
"context" "context"
"errors" "errors"
"io" "io"
@ -95,13 +96,13 @@ func (f *File) Read(p []byte) (n int, err error) {
return return
} }
if err != nil { if err != nil {
if !IsIOErr(err) { if !IsIOErr(err) && err != crypto.ErrDecrypt {
log.Error(err, "error reading cache file") log.Error(err, "error reading cache file")
return return
} }
n, err = f.readSource(p) n, err = f.readSource(p)
if err != nil { if err != nil {
log.Error(err, "error reading source file") log.Error(err, "error reading fallback source file")
return return
} }
} }

View file

@ -475,9 +475,6 @@ func (md *Metadata) writer() {
} }
func (md *Metadata) WriteAt(data []byte, pos int64) (int, error) { func (md *Metadata) WriteAt(data []byte, pos int64) (int, error) {
if md.ctx.Err() == context.Canceled {
return 0, context.Canceled
}
err := md.err.Load() err := md.err.Load()
if err != nil && err.err != nil { if err != nil && err.err != nil {
return 0, err.err return 0, err.err
@ -488,6 +485,9 @@ func (md *Metadata) WriteAt(data []byte, pos int64) (int, error) {
return 0, err return 0, err
} }
} }
if md.ctx.Err() == context.Canceled {
return 0, context.Canceled
}
wa := writeAt{pos: pos} wa := writeAt{pos: pos}
ret := streamingPool.Get() ret := streamingPool.Get()
n := len(data) n := len(data)
@ -507,6 +507,16 @@ func (md *Metadata) WriteAt(data []byte, pos int64) (int, error) {
return n, nil return n, nil
} }
func (md *Metadata) Stat() (os.FileInfo, error) {
if md.f == nil {
err := md.openCacheFile()
if err != nil {
return nil, err
}
}
return md.f.Stat()
}
func (md *Metadata) openCacheFile() error { func (md *Metadata) openCacheFile() error {
md.mu.Lock() md.mu.Lock()
defer md.mu.Unlock() defer md.mu.Unlock()
@ -525,13 +535,3 @@ func (md *Metadata) openCacheFile() error {
md.writer() md.writer()
return nil return nil
} }
func (md *Metadata) Stat() (os.FileInfo, error) {
if md.f == nil {
err := md.openCacheFile()
if err != nil {
return nil, err
}
}
return md.f.Stat()
}

View file

@ -163,7 +163,7 @@ func (f *file) ReadAt(p []byte, pos int64) (n int, err error) {
defer f.rmu.Unlock() defer f.rmu.Unlock()
cn, _, roff := align(pos) cn, _, roff := align(pos)
var last bool var last bool
if f.r.cn != cn { if f.r.cn != cn || roff >= int64(len(f.r.unread)) {
_, err = f.Seek(pos, io.SeekStart) _, err = f.Seek(pos, io.SeekStart)
if err != nil { if err != nil {
return return

View file

@ -77,6 +77,8 @@ func (r *reader) Read(p []byte) (int, error) {
return n, nil return n, nil
} }
var ErrDecrypt = errors.New("failed to decrypt and authenticate payload chunk")
func (r *reader) readChunk() (last bool, err error) { func (r *reader) readChunk() (last bool, err error) {
if len(r.unread) != 0 { if len(r.unread) != 0 {
panic("stream: internal error: readChunk called with dirty buffer") panic("stream: internal error: readChunk called with dirty buffer")
@ -105,7 +107,7 @@ func (r *reader) readChunk() (last bool, err error) {
out, err = r.a.Open(r.outBuf, r.nonce[:], in, nil) out, err = r.a.Open(r.outBuf, r.nonce[:], in, nil)
} }
if err != nil { if err != nil {
return false, errors.New("failed to decrypt and authenticate payload chunk") return false, ErrDecrypt
} }
incNonce(&r.nonce) incNonce(&r.nonce)