Fix rise of the deleted object (support) #797

Merged
fyrchik merged 2 commits from dstepanov-yadro/frostfs-node:fix/zombie_object_supportv037 into support/v0.37 2023-12-07 15:00:11 +00:00
2 changed files with 13 additions and 12 deletions

View file

@ -31,10 +31,10 @@ const (
) )
type objectNodesInfo struct { type objectNodesInfo struct {
containerID cid.ID containerID cid.ID
objectID oid.ID objectID oid.ID
relatedObjectIDs []oid.ID relatedObjectIDs []oid.ID
isLock bool isLockOrTombstone bool
} }
type boolError struct { type boolError struct {
@ -101,9 +101,9 @@ func getObjectInfo(cmd *cobra.Command, cnrID cid.ID, objID oid.ID, cli *client.C
res, err := internalclient.HeadObject(cmd.Context(), prmHead) res, err := internalclient.HeadObject(cmd.Context(), prmHead)
if err == nil { if err == nil {
return &objectNodesInfo{ return &objectNodesInfo{
containerID: cnrID, containerID: cnrID,
objectID: objID, objectID: objID,
isLock: res.Header().Type() == objectSDK.TypeLock, isLockOrTombstone: res.Header().Type() == objectSDK.TypeLock || res.Header().Type() == objectSDK.TypeTombstone,
} }
} }
@ -191,7 +191,7 @@ func getRequiredPlacement(cmd *cobra.Command, objInfo *objectNodesInfo, placemen
numOfReplicas := placementPolicy.ReplicaNumberByIndex(repIdx) numOfReplicas := placementPolicy.ReplicaNumberByIndex(repIdx)
var nodeIdx uint32 var nodeIdx uint32
for _, n := range rep { for _, n := range rep {
if !objInfo.isLock && nodeIdx == numOfReplicas { //lock object should be on all container nodes if !objInfo.isLockOrTombstone && nodeIdx == numOfReplicas { // lock and tombstone objects should be on all container nodes
break break
} }
nodes[n.Hash()] = n nodes[n.Hash()] = n
@ -213,7 +213,8 @@ func getRequiredPlacement(cmd *cobra.Command, objInfo *objectNodesInfo, placemen
} }
func getActualPlacement(cmd *cobra.Command, netmap *netmapSDK.NetMap, requiredPlacement map[uint64]netmapSDK.NodeInfo, func getActualPlacement(cmd *cobra.Command, netmap *netmapSDK.NetMap, requiredPlacement map[uint64]netmapSDK.NodeInfo,
pk *ecdsa.PrivateKey, objInfo *objectNodesInfo) map[uint64]boolError { pk *ecdsa.PrivateKey, objInfo *objectNodesInfo,
) map[uint64]boolError {
result := make(map[uint64]boolError) result := make(map[uint64]boolError)
resultMtx := &sync.Mutex{} resultMtx := &sync.Mutex{}

View file

@ -92,10 +92,10 @@ func (p *Policer) processNodes(ctx context.Context, requirements *placementRequi
// Number of copies that are stored on maintenance nodes. // Number of copies that are stored on maintenance nodes.
var uncheckedCopies int var uncheckedCopies int
if typ == objectSDK.TypeLock { if typ == objectSDK.TypeLock || typ == objectSDK.TypeTombstone {
// all nodes of a container must store the `LOCK` objects // all nodes of a container must store the `LOCK` and `TOMBSTONE` objects
// for correct object removal protection: // for correct object removal protection:
// - `LOCK` objects are broadcast on their PUT requests; // - `LOCK` and `TOMBSTONE` objects are broadcast on their PUT requests;
// - `LOCK` object removal is a prohibited action in the GC. // - `LOCK` object removal is a prohibited action in the GC.
shortage = uint32(len(nodes)) shortage = uint32(len(nodes))
} }