forked from TrueCloudLab/frostfs-sdk-go
[#19] transformer: Make writeChunk
non-recursive
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
parent
1c94309d7a
commit
b696d3c70e
1 changed files with 35 additions and 34 deletions
|
@ -229,45 +229,46 @@ func (s *payloadSizeLimiter) initializeLinking(parHdr *object.Object) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *payloadSizeLimiter) writeChunk(chunk []byte) error {
|
func (s *payloadSizeLimiter) writeChunk(chunk []byte) error {
|
||||||
// statement is true if the previous write of bytes reached exactly the boundary.
|
for {
|
||||||
if s.written > 0 && s.written%s.maxSize == 0 {
|
// statement is true if the previous write of bytes reached exactly the boundary.
|
||||||
if s.written == s.maxSize {
|
if s.written > 0 && s.written%s.maxSize == 0 {
|
||||||
s.prepareFirstChild()
|
if s.written == s.maxSize {
|
||||||
|
s.prepareFirstChild()
|
||||||
|
}
|
||||||
|
|
||||||
|
// we need to release current object
|
||||||
|
if _, err := s.release(false); err != nil {
|
||||||
|
return fmt.Errorf("could not release object: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize another object
|
||||||
|
s.initialize()
|
||||||
}
|
}
|
||||||
|
|
||||||
// we need to release current object
|
var (
|
||||||
if _, err := s.release(false); err != nil {
|
ln = uint64(len(chunk))
|
||||||
return fmt.Errorf("could not release object: %w", err)
|
cut = ln
|
||||||
|
leftToEdge = s.maxSize - s.written%s.maxSize
|
||||||
|
)
|
||||||
|
|
||||||
|
// write bytes no further than the boundary of the current object
|
||||||
|
if ln > leftToEdge {
|
||||||
|
cut = leftToEdge
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialize another object
|
if _, err := s.chunkWriter.Write(chunk[:cut]); err != nil {
|
||||||
s.initialize()
|
return fmt.Errorf("could not write chunk to target: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// increase written bytes counter
|
||||||
|
s.written += cut
|
||||||
|
|
||||||
|
if cut == ln {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// if there are more bytes in buffer we call method again to start filling another object
|
||||||
|
chunk = chunk[cut:]
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
|
||||||
ln = uint64(len(chunk))
|
|
||||||
cut = ln
|
|
||||||
leftToEdge = s.maxSize - s.written%s.maxSize
|
|
||||||
)
|
|
||||||
|
|
||||||
// write bytes no further than the boundary of the current object
|
|
||||||
if ln > leftToEdge {
|
|
||||||
cut = leftToEdge
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := s.chunkWriter.Write(chunk[:cut]); err != nil {
|
|
||||||
return fmt.Errorf("could not write chunk to target: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// increase written bytes counter
|
|
||||||
s.written += cut
|
|
||||||
|
|
||||||
// if there are more bytes in buffer we call method again to start filling another object
|
|
||||||
if ln > leftToEdge {
|
|
||||||
return s.writeChunk(chunk[cut:])
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *payloadSizeLimiter) prepareFirstChild() {
|
func (s *payloadSizeLimiter) prepareFirstChild() {
|
||||||
|
|
Loading…
Reference in a new issue