From a83eeddb1d041611666c8481b275c5d2ce249293 Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 20 Jun 2024 16:03:58 +0300 Subject: [PATCH] [#60] control: Add GetNetmapStatus method Signed-off-by: Dmitrii Stepanov --- cmd/frostfs-node/netmap.go | 9 +++++ pkg/services/control/rpc.go | 21 +++++++++++ pkg/services/control/server/audit.go | 11 ++++++ .../control/server/get_netmap_status.go | 35 ++++++++++++++++++ pkg/services/control/server/server.go | 2 + pkg/services/control/service.pb.go | Bin 259230 -> 270289 bytes pkg/services/control/service.proto | 31 ++++++++++++++++ pkg/services/control/service_frostfs.pb.go | Bin 118675 -> 124049 bytes pkg/services/control/service_grpc.pb.go | Bin 41765 -> 43565 bytes 9 files changed, 109 insertions(+) create mode 100644 pkg/services/control/server/get_netmap_status.go diff --git a/cmd/frostfs-node/netmap.go b/cmd/frostfs-node/netmap.go index 6aff8ddf2..2d424eec6 100644 --- a/cmd/frostfs-node/netmap.go +++ b/cmd/frostfs-node/netmap.go @@ -374,6 +374,15 @@ func (c *cfg) SetNetmapStatus(st control.NetmapStatus) error { return c.updateNetMapState(func(*nmClient.UpdatePeerPrm) {}) } +func (c *cfg) GetNetmapStatus() (control.NetmapStatus, uint64, error) { + epoch, err := c.netMapSource.Epoch() + if err != nil { + return control.NetmapStatus_STATUS_UNDEFINED, 0, fmt.Errorf("failed to get current epoch: %w", err) + } + st := c.NetmapStatus() + return st, epoch, nil +} + func (c *cfg) ForceMaintenance() error { return c.setMaintenanceStatus(true) } diff --git a/pkg/services/control/rpc.go b/pkg/services/control/rpc.go index f9397c128..a90e58a65 100644 --- a/pkg/services/control/rpc.go +++ b/pkg/services/control/rpc.go @@ -10,6 +10,7 @@ const serviceName = "control.ControlService" const ( rpcHealthCheck = "HealthCheck" rpcSetNetmapStatus = "SetNetmapStatus" + rpcGetNetmapStatus = "GetNetmapStatus" rpcDropObjects = "DropObjects" rpcListShards = "ListShards" rpcSetShardMode = "SetShardMode" @@ -70,6 +71,26 @@ func SetNetmapStatus( return wResp.message, nil } +// GetNetmapStatus executes ControlService.GetNetmapStatus RPC. +func GetNetmapStatus( + cli *client.Client, + req *GetNetmapStatusRequest, + opts ...client.CallOption, +) (*GetNetmapStatusResponse, error) { + wResp := newResponseWrapper[GetNetmapStatusResponse]() + + wReq := &requestWrapper{ + m: req, + } + + err := client.SendUnary(cli, common.CallMethodInfoUnary(serviceName, rpcGetNetmapStatus), wReq, wResp, opts...) + if err != nil { + return nil, err + } + + return wResp.message, nil +} + // DropObjects executes ControlService.DropObjects RPC. func DropObjects( cli *client.Client, diff --git a/pkg/services/control/server/audit.go b/pkg/services/control/server/audit.go index 16c04a8c9..6443ea378 100644 --- a/pkg/services/control/server/audit.go +++ b/pkg/services/control/server/audit.go @@ -242,6 +242,17 @@ func (a *auditService) SetNetmapStatus(ctx context.Context, req *ctl.SetNetmapSt return res, err } +// GetNetmapStatus implements control.ControlServiceServer. +func (a *auditService) GetNetmapStatus(ctx context.Context, req *ctl.GetNetmapStatusRequest) (*ctl.GetNetmapStatusResponse, error) { + res, err := a.next.GetNetmapStatus(ctx, req) + if !a.enabled.Load() { + return res, err + } + audit.LogRequestWithKey(a.log, ctl.ControlService_GetNetmapStatus_FullMethodName, req.GetSignature().GetKey(), + nil, err == nil) + return res, err +} + // SetShardMode implements control.ControlServiceServer. func (a *auditService) SetShardMode(ctx context.Context, req *ctl.SetShardModeRequest) (*ctl.SetShardModeResponse, error) { res, err := a.next.SetShardMode(ctx, req) diff --git a/pkg/services/control/server/get_netmap_status.go b/pkg/services/control/server/get_netmap_status.go new file mode 100644 index 000000000..1c038253a --- /dev/null +++ b/pkg/services/control/server/get_netmap_status.go @@ -0,0 +1,35 @@ +package control + +import ( + "context" + + "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/control" + "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/control/server/ctrlmessage" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// GetNetmapStatus gets node status in FrostFS network. +func (s *Server) GetNetmapStatus(_ context.Context, req *control.GetNetmapStatusRequest) (*control.GetNetmapStatusResponse, error) { + if err := s.isValidRequest(req); err != nil { + return nil, status.Error(codes.PermissionDenied, err.Error()) + } + + st, epoch, err := s.nodeState.GetNetmapStatus() + if err != nil { + return nil, err + } + + resp := &control.GetNetmapStatusResponse{ + Body: &control.GetNetmapStatusResponse_Body{ + Status: st, + Epoch: epoch, + }, + } + + if err := ctrlmessage.Sign(s.key, resp); err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + return resp, nil +} diff --git a/pkg/services/control/server/server.go b/pkg/services/control/server/server.go index 7cfa93f05..f3fe56a46 100644 --- a/pkg/services/control/server/server.go +++ b/pkg/services/control/server/server.go @@ -50,6 +50,8 @@ type NodeState interface { // ForceMaintenance works like SetNetmapStatus(control.NetmapStatus_MAINTENANCE) // but starts local maintenance regardless of the network settings. ForceMaintenance() error + + GetNetmapStatus() (control.NetmapStatus, uint64, error) } // LocalOverrideStorageDecorator interface provides methods to decorate LocalOverrideEngine diff --git a/pkg/services/control/service.pb.go b/pkg/services/control/service.pb.go index 9c597beeccd6db19096889a7073067a75a35e221..727dd1218b27530339ce996d36d5c06b34de6cf4 100644 GIT binary patch delta 21312 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 diff --git a/pkg/services/control/service.proto b/pkg/services/control/service.proto index 94032b346..2cd8434fc 100644 --- a/pkg/services/control/service.proto +++ b/pkg/services/control/service.proto @@ -15,6 +15,9 @@ service ControlService { // Sets status of the storage node in FrostFS network map. rpc SetNetmapStatus(SetNetmapStatusRequest) returns (SetNetmapStatusResponse); + // Gets status of the storage node in FrostFS network map. + rpc GetNetmapStatus(GetNetmapStatusRequest) returns (GetNetmapStatusResponse); + // Mark objects to be removed from node's local object storage. rpc DropObjects(DropObjectsRequest) returns (DropObjectsResponse); @@ -156,6 +159,34 @@ message SetNetmapStatusResponse { Signature signature = 2; } +// Get netmap status request. +message GetNetmapStatusRequest { + message Body {} + + // Body of set netmap status request message. + Body body = 1; + + // Body signature. + Signature signature = 2; +} + +// Get netmap status response. +message GetNetmapStatusResponse { + message Body { + // Storage node status in FrostFS network map. + NetmapStatus status = 1; + + // Network map epoch. + uint64 epoch = 2; + } + + // Body of get netmap status response message. + Body body = 1; + + // Body signature. + Signature signature = 2; +} + // Request to drop the objects. message DropObjectsRequest { // Request body structure. diff --git a/pkg/services/control/service_frostfs.pb.go b/pkg/services/control/service_frostfs.pb.go index 9d8d6376c9ad886d52d3a8aaf5a703fd43f9b24d..a287606fa24e4ade9d4a2d1212cc43e18ac19d0c 100644 GIT binary patch delta 234 zcmbO{pMBy<_6fT~tZzQ?ONSxr)E@~by|lXs>Hv$}$m zOrH2;4p4>IWVsJ)+b1|NsxyIjo8>_tVi~W1ZK?&65|dBa?VY?oYF1soU~mjD1li3W%O diff --git a/pkg/services/control/service_grpc.pb.go b/pkg/services/control/service_grpc.pb.go index feeee0006526e16347ed137d6745eecb0aaafbcc..fa9de974a1e9bd6259fd81b37f21e4a7ed79b2fe 100644 GIT binary patch delta 220 zcmZ2_jA`u^rVZlEjP8?HGkG(*Z~o47f(yuD=d}Qm4!jybGLzQ`C^3iknGmYbMIifJk{FAEh8EB;n;w23 zA5|1=-U4rHpk;Twe@Fo3HIkNsb#)dzJxE J|C?Es8~}BZN4@|6 delta 67 zcmV-J0KEUL)B>f(0xh`