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 }