possible fix for rare panic
This commit is contained in:
parent
f0af1fb04d
commit
88861102fd
4 changed files with 20 additions and 17 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue