[#1635] control: Add method to search shards by object

Added method `ListShardsForObject` to ControlService and to
StorageEngine. It returns information about shards storing
object on the node.

Signed-off-by: Ekaterina Lebedeva <ekaterina.lebedeva@yadro.com>
This commit is contained in:
Ekaterina Lebedeva 2025-02-04 21:21:31 +03:00
parent 6260d703ce
commit 9e31cb249f
7 changed files with 919 additions and 0 deletions

View file

@ -0,0 +1,66 @@
package control
import (
"context"
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/shard"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/control"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/control/server/ctrlmessage"
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func (s *Server) ListShardsForObject(ctx context.Context, req *control.ListShardsForObjectRequest) (*control.ListShardsForObjectResponse, error) {
err := s.isValidRequest(req)
if err != nil {
return nil, status.Error(codes.PermissionDenied, err.Error())
}
var obj oid.ID
err = obj.DecodeString(req.GetBody().GetObjectId())
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
var cnr cid.ID
err = cnr.DecodeString(req.GetBody().GetContainerId())
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
resp := new(control.ListShardsForObjectResponse)
body := new(control.ListShardsForObjectResponse_Body)
resp.SetBody(body)
var objAddr oid.Address
objAddr.SetContainer(cnr)
objAddr.SetObject(obj)
info, err := s.s.ListShardsForObject(ctx, objAddr)
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
if len(info) == 0 {
return nil, status.Error(codes.NotFound, logs.ShardCouldNotFindObject)
}
body.SetShard_ID(shardInfoToProto(info))
// Sign the response
if err := ctrlmessage.Sign(s.key, resp); err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
return resp, nil
}
func shardInfoToProto(infos []shard.Info) [][]byte {
shardInfos := make([][]byte, 0, len(infos))
for _, info := range infos {
shardInfos = append(shardInfos, *info.ID)
}
return shardInfos
}