forked from TrueCloudLab/frostfs-s3-gw
[#210] Fix multipart object reader
Signed-off-by: Marina Biryukova <m.biryukova@yadro.com>
This commit is contained in:
parent
12cf29aed2
commit
a4c612614a
2 changed files with 23 additions and 6 deletions
|
@ -93,15 +93,22 @@ func newMultiObjectReader(ctx context.Context, cfg multiObjectReaderConfig) (*mu
|
||||||
}
|
}
|
||||||
|
|
||||||
func findStartPart(cfg multiObjectReaderConfig) (index int, offset uint64) {
|
func findStartPart(cfg multiObjectReaderConfig) (index int, offset uint64) {
|
||||||
return findPartByPosition(cfg.off, cfg.parts)
|
position := cfg.off
|
||||||
|
for i, part := range cfg.parts {
|
||||||
|
// Strict inequality when searching for start position to avoid reading zero length part.
|
||||||
|
if position < part.Size {
|
||||||
|
return i, position
|
||||||
|
}
|
||||||
|
position -= part.Size
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func findEndPart(cfg multiObjectReaderConfig) (index int, length uint64) {
|
func findEndPart(cfg multiObjectReaderConfig) (index int, length uint64) {
|
||||||
return findPartByPosition(cfg.off+cfg.ln, cfg.parts)
|
position := cfg.off + cfg.ln
|
||||||
}
|
for i, part := range cfg.parts {
|
||||||
|
// Non-strict inequality when searching for end position to avoid out of payload range error.
|
||||||
func findPartByPosition(position uint64, parts []partObj) (index int, positionInPart uint64) {
|
|
||||||
for i, part := range parts {
|
|
||||||
if position <= part.Size {
|
if position <= part.Size {
|
||||||
return i, position
|
return i, position
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,6 +90,16 @@ func TestMultiReader(t *testing.T) {
|
||||||
off: parts[0].Size - 4,
|
off: parts[0].Size - 4,
|
||||||
ln: parts[1].Size + 8,
|
ln: parts[1].Size + 8,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "second part",
|
||||||
|
off: parts[0].Size,
|
||||||
|
ln: parts[1].Size,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "second and third",
|
||||||
|
off: parts[0].Size,
|
||||||
|
ln: parts[1].Size + parts[2].Size,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "offset out of range",
|
name: "offset out of range",
|
||||||
off: uint64(len(fullPayload) + 1),
|
off: uint64(len(fullPayload) + 1),
|
||||||
|
|
Loading…
Reference in a new issue