frostfs-node/pkg/services/control/server/get_shard_by_oid.go
Ekaterina Lebedeva 6e9ff698f6 [#1635] control: Add method to search for shard by oid
Added method `GetShardByObjectID` to ControlService and to
StorageEngine. It returns information about shards storing
object on the node.

Signed-off-by: Ekaterina Lebedeva <ekaterina.lebedeva@yadro.com>
2025-02-06 18:08:46 +03:00

96 lines
2.8 KiB
Go

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/local_object_storage/shard/mode"
"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) GetShardByObjectID(ctx context.Context, req *control.GetShardByObjectIDRequest) (*control.GetShardByObjectIDResponse, error) {
// verify request
err := s.isValidRequest(req)
if err != nil {
return nil, status.Error(codes.PermissionDenied, err.Error())
}
var obj oid.ID
err = obj.DecodeString(req.GetBody().GetOid())
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
var cnr cid.ID
err = cnr.DecodeString(req.GetBody().GetCid())
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
// create and fill response
resp := new(control.GetShardByObjectIDResponse)
body := new(control.GetShardByObjectIDResponse_Body)
resp.SetBody(body)
// fill shard info
var objAddr oid.Address
objAddr.SetContainer(cnr)
objAddr.SetObject(obj)
info, err := s.s.GetShardByObjectID(ctx, objAddr)
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
if len(info) == 0 {
return nil, status.Error(codes.Internal, logs.ShardCouldNotFindObject)
}
body.SetShards(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) []control.ShardInfo {
shardInfos := make([]control.ShardInfo, 0, len(infos))
for _, info := range infos {
shardInfo := new(control.ShardInfo)
shardInfo.SetShard_ID(*info.ID)
shardInfo.SetMetabasePath(info.MetaBaseInfo.Path)
shardInfo.Blobstor = blobstorInfoToProto(info.BlobStorInfo)
shardInfo.SetWritecachePath(info.WriteCacheInfo.Path)
shardInfo.SetPiloramaPath(info.PiloramaInfo.Path)
var m control.ShardMode
switch info.Mode {
case mode.ReadWrite:
m = control.ShardMode_READ_WRITE
case mode.ReadOnly:
m = control.ShardMode_READ_ONLY
case mode.Degraded:
m = control.ShardMode_DEGRADED
case mode.DegradedReadOnly:
m = control.ShardMode_DEGRADED_READ_ONLY
default:
m = control.ShardMode_SHARD_MODE_UNDEFINED
}
shardInfo.SetMode(m)
shardInfo.SetErrorCount(info.ErrorCount)
shardInfo.SetEvacuationInProgress(info.EvacuationInProgress)
shardInfos = append(shardInfos, *shardInfo)
}
return shardInfos
}