[#1147] node: Implement Lock\Delete
requests for EC object
Signed-off-by: Anton Nikiforov <an.nikiforov@yadro.com>
This commit is contained in:
parent
88b8ddd902
commit
6130650bb6
20 changed files with 371 additions and 66 deletions
|
@ -76,6 +76,7 @@ func (e *StorageEngine) delete(ctx context.Context, prm DeletePrm) (DeleteRes, e
|
|||
is bool
|
||||
}
|
||||
var splitInfo *objectSDK.SplitInfo
|
||||
var ecInfo *objectSDK.ECInfo
|
||||
|
||||
// Removal of a big object is done in multiple stages:
|
||||
// 1. Remove the parent object. If it is locked or already removed, return immediately.
|
||||
|
@ -91,13 +92,18 @@ func (e *StorageEngine) delete(ctx context.Context, prm DeletePrm) (DeleteRes, e
|
|||
}
|
||||
|
||||
var splitErr *objectSDK.SplitInfoError
|
||||
if !errors.As(err, &splitErr) {
|
||||
var ecErr *objectSDK.ECInfoError
|
||||
if errors.As(err, &splitErr) {
|
||||
splitInfo = splitErr.SplitInfo()
|
||||
} else if errors.As(err, &ecErr) {
|
||||
e.deleteChunks(ctx, sh, ecInfo, prm)
|
||||
return false
|
||||
} else {
|
||||
if !client.IsErrObjectNotFound(err) {
|
||||
e.reportShardError(sh, "could not check object existence", err)
|
||||
}
|
||||
return false
|
||||
}
|
||||
splitInfo = splitErr.SplitInfo()
|
||||
} else if !resExists.Exists() {
|
||||
return false
|
||||
}
|
||||
|
@ -171,3 +177,31 @@ func (e *StorageEngine) deleteChildren(ctx context.Context, addr oid.Address, fo
|
|||
return false
|
||||
})
|
||||
}
|
||||
|
||||
func (e *StorageEngine) deleteChunks(
|
||||
ctx context.Context, sh hashedShard, ecInfo *objectSDK.ECInfo, prm DeletePrm,
|
||||
) {
|
||||
var inhumePrm shard.InhumePrm
|
||||
if prm.forceRemoval {
|
||||
inhumePrm.ForceRemoval()
|
||||
}
|
||||
for _, chunk := range ecInfo.Chunks {
|
||||
var addr oid.Address
|
||||
addr.SetContainer(prm.addr.Container())
|
||||
var objID oid.ID
|
||||
err := objID.ReadFromV2(chunk.ID)
|
||||
if err != nil {
|
||||
e.reportShardError(sh, "could not delete EC chunk", err)
|
||||
}
|
||||
addr.SetObject(objID)
|
||||
inhumePrm.MarkAsGarbage(addr)
|
||||
_, err = sh.Inhume(ctx, inhumePrm)
|
||||
if err != nil {
|
||||
e.log.Debug(logs.EngineCouldNotInhumeObjectInShard,
|
||||
zap.Stringer("addr", addr),
|
||||
zap.String("err", err.Error()),
|
||||
zap.String("trace_id", tracingPkg.GetTraceID(ctx)))
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue