forked from TrueCloudLab/frostfs-s3-gw
[#275] Change logic delete multipart upload
In order not to accidentally take outdated information about downloaded parts from other nodes, now when the multipart is abort or complete, the root node of the multipart upload with the finish flag remains in the tree. Signed-off-by: Roman Loginov <r.loginov@yadro.com>
This commit is contained in:
parent
08019f1574
commit
6f9ee3da76
6 changed files with 33 additions and 8 deletions
|
@ -82,6 +82,7 @@ const (
|
|||
sizeKV = "Size"
|
||||
etagKV = "ETag"
|
||||
md5KV = "MD5"
|
||||
finishedKV = "Finished"
|
||||
|
||||
// keys for lock.
|
||||
isLockKV = "IsLock"
|
||||
|
@ -245,6 +246,11 @@ func newMultipartInfoFromTreeNode(filePath string, treeNode *treeNode) (*data.Mu
|
|||
multipartInfo.Created = time.UnixMilli(utcMilli)
|
||||
}
|
||||
|
||||
finished, _ := treeNode.Get(finishedKV)
|
||||
if flag, err := strconv.ParseBool(finished); err == nil {
|
||||
multipartInfo.Finished = flag
|
||||
}
|
||||
|
||||
return multipartInfo, nil
|
||||
}
|
||||
|
||||
|
@ -266,6 +272,10 @@ func newMultipartInfo(node NodeResponse) (*data.MultipartInfo, error) {
|
|||
}
|
||||
case ownerKV:
|
||||
_ = multipartInfo.Owner.DecodeString(string(kv.GetValue()))
|
||||
case finishedKV:
|
||||
if isFinished, err := strconv.ParseBool(string(kv.GetValue())); err == nil {
|
||||
multipartInfo.Finished = isFinished
|
||||
}
|
||||
default:
|
||||
multipartInfo.Meta[kv.GetKey()] = string(kv.GetValue())
|
||||
}
|
||||
|
@ -949,7 +959,7 @@ func (c *Tree) getSubTreeMultipartUploads(ctx context.Context, bktInfo *data.Buc
|
|||
}
|
||||
|
||||
multipartInfo, err := newMultipartInfoFromTreeNode(filepath, treeNode)
|
||||
if err != nil {
|
||||
if err != nil || multipartInfo.Finished {
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -992,6 +1002,9 @@ func (c *Tree) GetMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo,
|
|||
continue
|
||||
}
|
||||
if info.UploadID == uploadID {
|
||||
if info.Finished {
|
||||
break
|
||||
}
|
||||
return info, nil
|
||||
}
|
||||
}
|
||||
|
@ -1055,8 +1068,15 @@ func (c *Tree) GetParts(ctx context.Context, bktInfo *data.BucketInfo, multipart
|
|||
return result, nil
|
||||
}
|
||||
|
||||
func (c *Tree) DeleteMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) error {
|
||||
return c.service.RemoveNode(ctx, bktInfo, systemTree, multipartNodeID)
|
||||
func (c *Tree) DeleteMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, multipartInfo *data.MultipartInfo) error {
|
||||
err := c.service.RemoveNode(ctx, bktInfo, systemTree, multipartInfo.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
multipartInfo.Finished = true
|
||||
|
||||
return c.CreateMultipartUpload(ctx, bktInfo, multipartInfo)
|
||||
}
|
||||
|
||||
func (c *Tree) PutLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, lock *data.LockInfo) error {
|
||||
|
@ -1241,6 +1261,9 @@ func metaFromMultipart(info *data.MultipartInfo, fileName string) map[string]str
|
|||
info.Meta[uploadIDKV] = info.UploadID
|
||||
info.Meta[ownerKV] = info.Owner.EncodeToString()
|
||||
info.Meta[createdKV] = strconv.FormatInt(info.Created.UTC().UnixMilli(), 10)
|
||||
if info.Finished {
|
||||
info.Meta[finishedKV] = strconv.FormatBool(info.Finished)
|
||||
}
|
||||
|
||||
return info.Meta
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue