提交 886a6fe1 作者: Kevin Atkinson

filestore: be more specific when there is a problem reading the backing file.

License: MIT
Signed-off-by: 's avatarKevin Atkinson <k@kevina.org>
上级 13f617d1
......@@ -27,8 +27,18 @@ type FileManager struct {
root string
}
type CorruptReferenceCode int
const (
OtherErr CorruptReferenceCode = 0
FileError CorruptReferenceCode = 1
FileMissing CorruptReferenceCode = 2
FileChanged CorruptReferenceCode = 3
)
type CorruptReferenceError struct {
Err error
Code CorruptReferenceCode
Err error
}
func (c CorruptReferenceError) Error() string {
......@@ -127,20 +137,24 @@ func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) {
abspath := filepath.Join(f.root, p)
fi, err := os.Open(abspath)
if err != nil {
return nil, &CorruptReferenceError{err}
if os.IsNotExist(err) {
return nil, &CorruptReferenceError{FileMissing, err}
} else if err != nil {
return nil, &CorruptReferenceError{FileError, err}
}
defer fi.Close()
_, err = fi.Seek(int64(d.GetOffset()), os.SEEK_SET)
if err != nil {
return nil, &CorruptReferenceError{err}
return nil, &CorruptReferenceError{FileError, err}
}
outbuf := make([]byte, d.GetSize_())
_, err = io.ReadFull(fi, outbuf)
if err != nil {
return nil, &CorruptReferenceError{err}
if err == io.EOF || err == io.ErrUnexpectedEOF {
return nil, &CorruptReferenceError{FileChanged, err}
} else if err != nil {
return nil, &CorruptReferenceError{FileError, err}
}
outcid, err := c.Prefix().Sum(outbuf)
......@@ -149,7 +163,8 @@ func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) {
}
if !c.Equals(outcid) {
return nil, &CorruptReferenceError{fmt.Errorf("data in file did not match. %s offset %d", d.GetFilePath(), d.GetOffset())}
return nil, &CorruptReferenceError{FileChanged,
fmt.Errorf("data in file did not match. %s offset %d", d.GetFilePath(), d.GetOffset())}
}
return outbuf, nil
......
......@@ -16,12 +16,12 @@ import (
type Status int32
const (
StatusOk Status = 0
StatusFileError Status = 10 // Backing File Error
//StatusFileNotFound Status = 11 // Backing File Not Found
//StatusFileChanged Status = 12 // Contents of the file changed
StatusOtherError Status = 20 // Internal Error, likely corrupt entry
StatusKeyNotFound Status = 30
StatusOk Status = 0
StatusFileError Status = 10 // Backing File Error
StatusFileNotFound Status = 11 // Backing File Not Found
StatusFileChanged Status = 12 // Contents of the file changed
StatusOtherError Status = 20 // Internal Error, likely corrupt entry
StatusKeyNotFound Status = 30
)
func (s Status) String() string {
......@@ -30,6 +30,10 @@ func (s Status) String() string {
return "ok"
case StatusFileError:
return "error"
case StatusFileNotFound:
return "no-file"
case StatusFileChanged:
return "changed"
case StatusOtherError:
return "ERROR"
case StatusKeyNotFound:
......@@ -139,8 +143,17 @@ func mkListRes(c *cid.Cid, d *pb.DataObj, err error) *ListRes {
if err != nil {
if err == ds.ErrNotFound || err == blockstore.ErrNotFound {
status = StatusKeyNotFound
} else if _, ok := err.(*CorruptReferenceError); ok {
status = StatusFileError
} else if err, ok := err.(*CorruptReferenceError); ok {
switch err.Code {
case FileError:
status = StatusFileError
case FileMissing:
status = StatusFileNotFound
case FileChanged:
status = StatusFileChanged
default:
status = StatusOtherError
}
} else {
status = StatusOtherError
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论