forked from TrueCloudLab/frostfs-node
[#1295] getSvc: Assemble complex EC object headers without linking object
Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
parent
10602b55b1
commit
8e51d7849a
6 changed files with 72 additions and 18 deletions
|
@ -19,6 +19,7 @@ type assembler struct {
|
|||
splitInfo *objectSDK.SplitInfo
|
||||
rng *objectSDK.Range
|
||||
objGetter objectGetter
|
||||
head bool
|
||||
|
||||
currentOffset uint64
|
||||
|
||||
|
@ -30,18 +31,23 @@ func newAssembler(
|
|||
splitInfo *objectSDK.SplitInfo,
|
||||
rng *objectSDK.Range,
|
||||
objGetter objectGetter,
|
||||
head bool,
|
||||
) *assembler {
|
||||
return &assembler{
|
||||
addr: addr,
|
||||
rng: rng,
|
||||
splitInfo: splitInfo,
|
||||
objGetter: objGetter,
|
||||
head: head,
|
||||
}
|
||||
}
|
||||
|
||||
// Assemble assembles splitted large object and writes it's content to ObjectWriter.
|
||||
// It returns parent object.
|
||||
func (a *assembler) Assemble(ctx context.Context, writer ObjectWriter) (*objectSDK.Object, error) {
|
||||
if a.head {
|
||||
return a.assembleHeader(ctx, writer)
|
||||
}
|
||||
sourceObjectID, ok := a.getLastPartOrLinkObjectID()
|
||||
if !ok {
|
||||
return nil, objectSDK.NewSplitInfoError(a.splitInfo)
|
||||
|
@ -65,6 +71,43 @@ func (a *assembler) Assemble(ctx context.Context, writer ObjectWriter) (*objectS
|
|||
return a.parentObject, nil
|
||||
}
|
||||
|
||||
func (a *assembler) assembleHeader(ctx context.Context, writer ObjectWriter) (*objectSDK.Object, error) {
|
||||
var sourceObjectIDs []oid.ID
|
||||
sourceObjectID, ok := a.splitInfo.Link()
|
||||
if ok {
|
||||
sourceObjectIDs = append(sourceObjectIDs, sourceObjectID)
|
||||
}
|
||||
sourceObjectID, ok = a.splitInfo.LastPart()
|
||||
if ok {
|
||||
sourceObjectIDs = append(sourceObjectIDs, sourceObjectID)
|
||||
}
|
||||
if len(sourceObjectIDs) == 0 {
|
||||
return nil, objectSDK.NewSplitInfoError(a.splitInfo)
|
||||
}
|
||||
for _, sourceObjectID = range sourceObjectIDs {
|
||||
obj, err := a.getParent(ctx, sourceObjectID, writer)
|
||||
if err == nil {
|
||||
return obj, nil
|
||||
}
|
||||
}
|
||||
return nil, objectSDK.NewSplitInfoError(a.splitInfo)
|
||||
}
|
||||
|
||||
func (a *assembler) getParent(ctx context.Context, sourceObjectID oid.ID, writer ObjectWriter) (*objectSDK.Object, error) {
|
||||
obj, err := a.objGetter.HeadObject(ctx, sourceObjectID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
parent := obj.Parent()
|
||||
if parent == nil {
|
||||
return nil, objectSDK.NewSplitInfoError(a.splitInfo)
|
||||
}
|
||||
if err := writer.WriteHeader(ctx, parent); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return obj, nil
|
||||
}
|
||||
|
||||
func (a *assembler) getLastPartOrLinkObjectID() (oid.ID, bool) {
|
||||
sourceObjectID, ok := a.splitInfo.Link()
|
||||
if ok {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue