writecache: Use object size to check free space #1668

Merged
dstepanov-yadro merged 1 commit from dstepanov-yadro/frostfs-node:fix/writecache_put_space_estimation into master 2025-03-11 08:12:07 +00:00
2 changed files with 10 additions and 5 deletions

View file

@ -2,6 +2,7 @@ package writecache
import (
"context"
"fmt"
"time"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/common"
@ -59,7 +60,15 @@ func (c *cache) Put(ctx context.Context, prm common.PutPrm) (common.PutRes, erro
// putBig writes object to FSTree and pushes it to the flush workers queue.
func (c *cache) putBig(ctx context.Context, prm common.PutPrm) error {
if !c.hasEnoughSpaceFS() {
if prm.RawData == nil { // foolproof: RawData should be marshalled by shard.
Review

Even if it is not marshaled, that is not useless.
But could you please double-check that fstree also marshals only if RawData == nil?

Even if it is not marshaled, that is not useless. But could you please double-check that fstree also marshals only if `RawData == nil`?
Review

There is no such check in fstree, but it exists at the blobstor level.

There is no such check in `fstree`, but it exists at the `blobstor` level.
Review

I mean check than RawData != nil and marshal object otherwise.

I mean check than RawData != nil and marshal object otherwise.
data, err := prm.Object.Marshal()
if err != nil {
return fmt.Errorf("cannot marshal object: %w", err)
}
prm.RawData = data
}
size := uint64(len(prm.RawData))
if !c.hasEnoughSpace(size) {
return ErrOutOfSpace
}

View file

@ -7,10 +7,6 @@ func (c *cache) estimateCacheSize() (uint64, uint64) {
return count, size
}
func (c *cache) hasEnoughSpaceFS() bool {
return c.hasEnoughSpace(c.maxObjectSize)
}
func (c *cache) hasEnoughSpace(objectSize uint64) bool {
count, size := c.estimateCacheSize()
if c.maxCacheCount > 0 && count+1 > c.maxCacheCount {