satellite/metainfo: don't allow uplink to commit same piece multiple times (#3460)
This commit is contained in:
parent
11f0ea3258
commit
e0c2dfcb8d
@ -750,6 +750,21 @@ func TestCommitSegmentPointer(t *testing.T) {
|
||||
},
|
||||
ErrorMessage: "Number of valid pieces (2) is less than the success threshold (3)",
|
||||
},
|
||||
{
|
||||
Modify: func(pointer *pb.Pointer, _ map[storj.NodeID]*identity.FullIdentity, limits []*pb.OrderLimit) {
|
||||
firstPiece := pointer.Remote.RemotePieces[0]
|
||||
pointer.Remote.RemotePieces[1] = firstPiece
|
||||
pointer.Remote.RemotePieces[2] = firstPiece
|
||||
},
|
||||
ErrorMessage: "piece num 0 is duplicated",
|
||||
},
|
||||
{
|
||||
Modify: func(pointer *pb.Pointer, _ map[storj.NodeID]*identity.FullIdentity, limits []*pb.OrderLimit) {
|
||||
firstNodeID := pointer.Remote.RemotePieces[0].NodeId
|
||||
pointer.Remote.RemotePieces[1].NodeId = firstNodeID
|
||||
},
|
||||
ErrorMessage: "invalid order limit piece id",
|
||||
},
|
||||
}
|
||||
|
||||
testplanet.Run(t, testplanet.Config{
|
||||
|
@ -304,6 +304,8 @@ func (endpoint *Endpoint) validatePointer(ctx context.Context, pointer *pb.Point
|
||||
return Error.New("segment size %v is out of range, maximum allowed is %v", pointer.SegmentSize, maxAllowed)
|
||||
}
|
||||
|
||||
pieceNums := make(map[int32]struct{}, 0)
|
||||
nodeIds := make(map[storj.NodeID]struct{}, 0)
|
||||
for _, piece := range remote.RemotePieces {
|
||||
if piece.PieceNum >= int32(len(originalLimits)) {
|
||||
return Error.New("invalid piece number")
|
||||
@ -332,6 +334,17 @@ func (endpoint *Endpoint) validatePointer(ctx context.Context, pointer *pb.Point
|
||||
if piece.NodeId != limit.StorageNodeId {
|
||||
return Error.New("piece NodeID != order limit NodeID")
|
||||
}
|
||||
|
||||
if _, ok := pieceNums[piece.PieceNum]; ok {
|
||||
return Error.New("piece num %d is duplicated", piece.PieceNum)
|
||||
}
|
||||
|
||||
if _, ok := nodeIds[piece.NodeId]; ok {
|
||||
return Error.New("node id %s for piece num %d is duplicated", piece.NodeId.String(), piece.PieceNum)
|
||||
}
|
||||
|
||||
pieceNums[piece.PieceNum] = struct{}{}
|
||||
nodeIds[piece.NodeId] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user