[#947] writecache: refactor object persisting

a1696a8 introduced some logic which in some situations prevented big objects
to be persisted in FSTree. In this commit a refactoring is done with the
goal of simplifying the code and also checking #866 issue.

1. Split a monstrous function into multiple simple ones: memory objects
   can only be small and for writing through the cache we can do a dispatch
   in `Put` itself.
2. Determine objects to be put in database before the actual update
   as setting up a transaction has non-zero overhead.

Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
Evgenii Stratonikov 2021-10-27 14:48:33 +03:00 committed by Alex Vanin
parent 088c894f44
commit 1462824ab8
5 changed files with 56 additions and 114 deletions

View file

@ -30,7 +30,7 @@ func (c *cache) Put(o *object.Object) error {
c.mtx.Lock()
if sz < c.smallObjectSize && c.curMemSize+sz <= c.maxMemSize {
if sz <= c.smallObjectSize && c.curMemSize+sz <= c.maxMemSize {
c.curMemSize += sz
c.mem = append(c.mem, oi)
@ -43,6 +43,10 @@ func (c *cache) Put(o *object.Object) error {
c.mtx.Unlock()
c.persistObjects([]objectInfo{oi})
if sz <= c.smallObjectSize {
c.persistSmallObjects([]objectInfo{oi})
} else {
c.persistBigObject(oi)
}
return nil
}