[#1819] common: Add ErrNoSpace
Add a common error for this case because it is not an error which should increase error counter. Single error simplifies checks on the call-site. Signed-off-by: Evgenii Stratonikov <evgeniy@morphbits.ru>
This commit is contained in:
parent
af56574849
commit
b89e71fa78
3 changed files with 20 additions and 3 deletions
|
@ -28,6 +28,7 @@ func (b *Blobovniczas) Put(prm common.PutPrm) (common.PutRes, error) {
|
||||||
var (
|
var (
|
||||||
fn func(string) (bool, error)
|
fn func(string) (bool, error)
|
||||||
id *blobovnicza.ID
|
id *blobovnicza.ID
|
||||||
|
allFull = true
|
||||||
)
|
)
|
||||||
|
|
||||||
fn = func(p string) (bool, error) {
|
fn = func(p string) (bool, error) {
|
||||||
|
@ -59,6 +60,7 @@ func (b *Blobovniczas) Put(prm common.PutPrm) (common.PutRes, error) {
|
||||||
return fn(p)
|
return fn(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
allFull = false
|
||||||
b.log.Debug("could not put object to active blobovnicza",
|
b.log.Debug("could not put object to active blobovnicza",
|
||||||
zap.String("path", filepath.Join(p, u64ToHexString(active.ind))),
|
zap.String("path", filepath.Join(p, u64ToHexString(active.ind))),
|
||||||
zap.String("error", err.Error()),
|
zap.String("error", err.Error()),
|
||||||
|
@ -77,6 +79,9 @@ func (b *Blobovniczas) Put(prm common.PutPrm) (common.PutRes, error) {
|
||||||
if err := b.iterateDeepest(prm.Address, fn); err != nil {
|
if err := b.iterateDeepest(prm.Address, fn); err != nil {
|
||||||
return common.PutRes{}, err
|
return common.PutRes{}, err
|
||||||
} else if id == nil {
|
} else if id == nil {
|
||||||
|
if allFull {
|
||||||
|
return common.PutRes{}, common.ErrNoSpace
|
||||||
|
}
|
||||||
return common.PutRes{}, errPutFailed
|
return common.PutRes{}, errPutFailed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,3 +5,6 @@ import "errors"
|
||||||
// ErrReadOnly MUST be returned for modifying operations when the storage was opened
|
// ErrReadOnly MUST be returned for modifying operations when the storage was opened
|
||||||
// in readonly mode.
|
// in readonly mode.
|
||||||
var ErrReadOnly = errors.New("opened as read-only")
|
var ErrReadOnly = errors.New("opened as read-only")
|
||||||
|
|
||||||
|
// ErrNoSpace MUST be returned when there is no space to put an object on the device.
|
||||||
|
var ErrNoSpace = errors.New("no free space")
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/blobstor/common"
|
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/blobstor/common"
|
||||||
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/blobstor/compression"
|
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/blobstor/compression"
|
||||||
|
@ -236,7 +237,15 @@ func (t *FSTree) Put(prm common.PutPrm) (common.PutRes, error) {
|
||||||
if !prm.DontCompress {
|
if !prm.DontCompress {
|
||||||
prm.RawData = t.Compress(prm.RawData)
|
prm.RawData = t.Compress(prm.RawData)
|
||||||
}
|
}
|
||||||
return common.PutRes{StorageID: []byte{}}, os.WriteFile(p, prm.RawData, t.Permissions)
|
|
||||||
|
err := os.WriteFile(p, prm.RawData, t.Permissions)
|
||||||
|
if err != nil {
|
||||||
|
var pe *fs.PathError
|
||||||
|
if errors.As(err, &pe) && pe.Err == syscall.ENOSPC {
|
||||||
|
err = common.ErrNoSpace
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return common.PutRes{StorageID: []byte{}}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// PutStream puts executes handler on a file opened for write.
|
// PutStream puts executes handler on a file opened for write.
|
||||||
|
|
Loading…
Reference in a new issue