[#1512] object: Fix put already removed object in EC-container
All checks were successful
Tests and linters / Run gofumpt (pull_request) Successful in 3m27s
DCO action / DCO (pull_request) Successful in 4m0s
Vulncheck / Vulncheck (pull_request) Successful in 4m37s
Tests and linters / Staticcheck (pull_request) Successful in 6m1s
Pre-commit hooks / Pre-commit (pull_request) Successful in 6m23s
Tests and linters / Lint (pull_request) Successful in 6m28s
Tests and linters / gopls check (pull_request) Successful in 6m36s
Build / Build Components (pull_request) Successful in 6m57s
Tests and linters / Tests (pull_request) Successful in 7m1s
Tests and linters / Tests with -race (pull_request) Successful in 7m1s

* Make metabase if EC-chunk's parent is already removed in fact;
* EC-writer should check `ObjectAlreadyRemoved` errors

Signed-off-by: Airat Arifullin <a.arifullin@yadro.com>
This commit is contained in:
Airat Arifullin 2024-12-23 14:59:12 +03:00
parent 7c8fa76636
commit 6347459a39
2 changed files with 16 additions and 0 deletions

View file

@ -15,6 +15,7 @@ import (
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/internal/metaerr"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/util"
"git.frostfs.info/TrueCloudLab/frostfs-observability/tracing"
clientSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client"
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
@ -120,6 +121,18 @@ func (db *DB) put(tx *bbolt.Tx,
return PutRes{}, errors.New("missing container in object")
}
// Graveyard owns no information about an EC-chunk, but only about its parent.
// Thus, before we put the chunk to metabase, we should check if its parent is already removed.
if ech := obj.ECHeader(); ech != nil {
pObj := objectSDK.New()
pObj.SetContainerID(cnr)
pObj.SetID(ech.Parent())
if _, _, err := db.exists(tx, objectCore.AddressOf(pObj), oid.Address{}, currEpoch); err != nil && clientSDK.IsErrObjectAlreadyRemoved(err) {
return PutRes{}, err
}
}
isParent := si != nil
exists, _, err := db.exists(tx, objectCore.AddressOf(obj), oid.Address{}, currEpoch)

View file

@ -14,6 +14,7 @@ import (
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/policy"
svcutil "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/util"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object_manager/placement"
clientSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client"
containerSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/erasurecode"
@ -250,6 +251,8 @@ func (e *ECWriter) writePart(ctx context.Context, obj *objectSDK.Object, partIdx
err := e.putECPartToNode(ctx, obj, node)
if err == nil {
return nil
} else if clientSDK.IsErrObjectAlreadyRemoved(err) {
return err
}
e.Config.Logger.Warn(logs.ECFailedToSaveECPart, zap.Stringer("part_address", object.AddressOf(obj)),
zap.Stringer("parent_address", obj.ECHeader().Parent()), zap.Int("part_index", partIdx),