diff options
author | John Cai <jcai@gitlab.com> | 2023-08-31 15:52:37 +0300 |
---|---|---|
committer | John Cai <jcai@gitlab.com> | 2023-08-31 15:52:37 +0300 |
commit | cd49ee59b26a1206adb247ab2f71f46c1c1fde80 (patch) | |
tree | 4a4600ba7f9d0a81839f5d2ebbe65da2cd8f7f2c | |
parent | 08d8c4dd8ae5847407d9f8ad9a38bdfdf1e9f958 (diff) | |
parent | 6784d292c8d4f643d0e227214c332505ee3a39e1 (diff) |
Merge branch 'jc/dataloss-streaming' into 'master'
info: Convert DatalossCheck to be a streaming RPC
Closes #4836
See merge request https://gitlab.com/gitlab-org/gitaly/-/merge_requests/6286
Merged-by: John Cai <jcai@gitlab.com>
Approved-by: Justin Tobler <jtobler@gitlab.com>
Reviewed-by: James Fargher <jfargher@gitlab.com>
Reviewed-by: Justin Tobler <jtobler@gitlab.com>
-rw-r--r-- | internal/cli/praefect/subcmd_accept_dataloss_test.go | 3 | ||||
-rw-r--r-- | internal/cli/praefect/subcmd_dataloss.go | 108 | ||||
-rw-r--r-- | internal/praefect/service/info/dataloss.go | 87 | ||||
-rw-r--r-- | proto/go/gitalypb/praefect.pb.go | 714 | ||||
-rw-r--r-- | proto/go/gitalypb/praefect_grpc.pb.go | 83 | ||||
-rw-r--r-- | proto/praefect.proto | 58 |
6 files changed, 827 insertions, 226 deletions
diff --git a/internal/cli/praefect/subcmd_accept_dataloss_test.go b/internal/cli/praefect/subcmd_accept_dataloss_test.go index 73b239615..33b9c0ba5 100644 --- a/internal/cli/praefect/subcmd_accept_dataloss_test.go +++ b/internal/cli/praefect/subcmd_accept_dataloss_test.go @@ -1,7 +1,6 @@ package praefect import ( - "context" "testing" "github.com/stretchr/testify/require" @@ -10,7 +9,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v16/internal/praefect/service/info" "gitlab.com/gitlab-org/gitaly/v16/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v16/internal/testhelper/testdb" - "gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb" ) func TestAcceptDatalossSubcommand(t *testing.T) { @@ -74,7 +72,6 @@ func TestAcceptDatalossSubcommand(t *testing.T) { desc string args []string virtualStorages []*config.VirtualStorage - datalossCheck func(context.Context, *gitalypb.DatalossCheckRequest) (*gitalypb.DatalossCheckResponse, error) output string matchError errorMatcher expectedGenerations map[string]int diff --git a/internal/cli/praefect/subcmd_dataloss.go b/internal/cli/praefect/subcmd_dataloss.go index cfaa3e8fd..87ddd880a 100644 --- a/internal/cli/praefect/subcmd_dataloss.go +++ b/internal/cli/praefect/subcmd_dataloss.go @@ -92,7 +92,7 @@ func datalossAction(ctx *cli.Context) error { client := gitalypb.NewPraefectInfoServiceClient(conn) for _, vs := range virtualStorages { - resp, err := client.DatalossCheck(ctx.Context, &gitalypb.DatalossCheckRequest{ + stream, err := client.Dataloss(ctx.Context, &gitalypb.DatalossRequest{ VirtualStorage: vs, IncludePartiallyReplicated: includePartiallyAvailable, }) @@ -100,64 +100,82 @@ func datalossAction(ctx *cli.Context) error { return fmt.Errorf("error checking: %w", err) } - indentPrintln(ctx.App.Writer, 0, "Virtual storage: %s", vs) - if len(resp.Repositories) == 0 { - msg := "All repositories are available!" - if includePartiallyAvailable { - msg = "All repositories are fully available on all assigned storages!" - } + var foundUnavailableRepos bool - indentPrintln(ctx.App.Writer, 1, msg) - continue - } + indentPrintln(ctx.App.Writer, 0, "Virtual storage: %s", vs) + for { + resp, err := stream.Recv() + if err != nil { + if err != io.EOF { + return fmt.Errorf("getting response: %w", err) + } - indentPrintln(ctx.App.Writer, 1, "Repositories:") - for _, repo := range resp.Repositories { - unavailable := "" - if repo.Unavailable { - unavailable = " (unavailable)" + break } - indentPrintln(ctx.App.Writer, 2, "%s%s:", repo.RelativePath, unavailable) - - primary := repo.Primary - if primary == "" { - primary = "No Primary" + if len(resp.Repositories) > 0 { + indentPrintln(ctx.App.Writer, 1, "Repositories:") } - indentPrintln(ctx.App.Writer, 3, "Primary: %s", primary) - indentPrintln(ctx.App.Writer, 3, "In-Sync Storages:") - for _, storage := range repo.Storages { - if storage.BehindBy != 0 { - continue + for _, repo := range resp.Repositories { + foundUnavailableRepos = true + + unavailable := "" + if repo.Unavailable { + unavailable = " (unavailable)" } - indentPrintln(ctx.App.Writer, 4, "%s%s%s", - storage.Name, - assignedMessage(storage.Assigned), - unhealthyMessage(storage.Healthy), - ) - } + indentPrintln(ctx.App.Writer, 2, "%s%s:", repo.RelativePath, unavailable) - indentPrintln(ctx.App.Writer, 3, "Outdated Storages:") - for _, storage := range repo.Storages { - if storage.BehindBy == 0 { - continue + primary := repo.Primary + if primary == "" { + primary = "No Primary" + } + indentPrintln(ctx.App.Writer, 3, "Primary: %s", primary) + + indentPrintln(ctx.App.Writer, 3, "In-Sync Storages:") + for _, storage := range repo.Storages { + if storage.BehindBy != 0 { + continue + } + + indentPrintln(ctx.App.Writer, 4, "%s%s%s", + storage.Name, + assignedMessage(storage.Assigned), + unhealthyMessage(storage.Healthy), + ) } - plural := "" - if storage.BehindBy > 1 { - plural = "s" + indentPrintln(ctx.App.Writer, 3, "Outdated Storages:") + for _, storage := range repo.Storages { + if storage.BehindBy == 0 { + continue + } + + plural := "" + if storage.BehindBy > 1 { + plural = "s" + } + + indentPrintln(ctx.App.Writer, 4, "%s is behind by %d change%s or less%s%s", + storage.Name, + storage.BehindBy, + plural, + assignedMessage(storage.Assigned), + unhealthyMessage(storage.Healthy), + ) } + } + } - indentPrintln(ctx.App.Writer, 4, "%s is behind by %d change%s or less%s%s", - storage.Name, - storage.BehindBy, - plural, - assignedMessage(storage.Assigned), - unhealthyMessage(storage.Healthy), - ) + if !foundUnavailableRepos { + msg := "All repositories are available!" + if includePartiallyAvailable { + msg = "All repositories are fully available on all assigned storages!" } + + indentPrintln(ctx.App.Writer, 1, msg) + continue } } diff --git a/internal/praefect/service/info/dataloss.go b/internal/praefect/service/info/dataloss.go index 1875a0f19..3f9558511 100644 --- a/internal/praefect/service/info/dataloss.go +++ b/internal/praefect/service/info/dataloss.go @@ -3,10 +3,94 @@ package info import ( "context" + "gitlab.com/gitlab-org/gitaly/v16/internal/helper/chunk" + "gitlab.com/gitlab-org/gitaly/v16/internal/structerr" "gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb" + "google.golang.org/protobuf/proto" ) -//nolint:revive // This is unintentionally missing documentation. +type repoSender struct { + repos []*gitalypb.DatalossResponse_Repository + send func([]*gitalypb.DatalossResponse_Repository) error +} + +func (t *repoSender) Reset() { + t.repos = t.repos[:0] +} + +func (t *repoSender) Append(m proto.Message) { + t.repos = append(t.repos, m.(*gitalypb.DatalossResponse_Repository)) +} + +func (t *repoSender) Send() error { + return t.send(t.repos) +} + +// Dataloss implements the Dataloss RPC to return data about repositories that +// are outdated. +func (s *Server) Dataloss( + req *gitalypb.DatalossRequest, + stream gitalypb.PraefectInfoService_DatalossServer, +) error { + ctx := stream.Context() + + repos, err := s.rs.GetPartiallyAvailableRepositories(ctx, req.GetVirtualStorage()) + if err != nil { + return err + } + + chunker := chunk.New(&repoSender{ + send: func(repos []*gitalypb.DatalossResponse_Repository) error { + return stream.Send(&gitalypb.DatalossResponse{ + Repositories: repos, + }) + }, + }) + + for _, outdatedRepo := range repos { + unavailable := true + + storages := make([]*gitalypb.DatalossResponse_Repository_Storage, 0, len(outdatedRepo.Replicas)) + for _, replica := range outdatedRepo.Replicas { + if replica.ValidPrimary { + unavailable = false + } + + storages = append(storages, &gitalypb.DatalossResponse_Repository_Storage{ + Name: replica.Storage, + BehindBy: outdatedRepo.Generation - replica.Generation, + Assigned: replica.Assigned, + Healthy: replica.Healthy, + ValidPrimary: replica.ValidPrimary, + }) + } + + if !req.IncludePartiallyReplicated && !unavailable { + continue + } + + if err := chunker.Send(&gitalypb.DatalossResponse_Repository{ + RelativePath: outdatedRepo.RelativePath, + Primary: outdatedRepo.Primary, + Unavailable: unavailable, + Storages: storages, + }); err != nil { + return structerr.NewInternal("sending repository info: %w", err) + } + } + + if err := chunker.Flush(); err != nil { + return structerr.NewInternal("flushing repositories: %w", err) + } + + return nil +} + +// DatalossCheck implements the DatalossCheck RPC to return data about repositories that +// are outdated. +// Deprecated: The Dataloss streaming RPC will be used going forward +// +//nolint:staticcheck func (s *Server) DatalossCheck(ctx context.Context, req *gitalypb.DatalossCheckRequest) (*gitalypb.DatalossCheckResponse, error) { repos, err := s.rs.GetPartiallyAvailableRepositories(ctx, req.GetVirtualStorage()) if err != nil { @@ -36,6 +120,7 @@ func (s *Server) DatalossCheck(ctx context.Context, req *gitalypb.DatalossCheckR continue } + //nolint:staticcheck pbRepos = append(pbRepos, &gitalypb.DatalossCheckResponse_Repository{ RelativePath: outdatedRepo.RelativePath, Primary: outdatedRepo.Primary, diff --git a/proto/go/gitalypb/praefect.pb.go b/proto/go/gitalypb/praefect.pb.go index e2c244b0f..09b536c1a 100644 --- a/proto/go/gitalypb/praefect.pb.go +++ b/proto/go/gitalypb/praefect.pb.go @@ -581,7 +581,118 @@ func (*SetAuthoritativeStorageResponse) Descriptor() ([]byte, []int) { return file_praefect_proto_rawDescGZIP(), []int{7} } +// A request for data loss information +type DatalossRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The virtual storage to get dataloss information for + VirtualStorage string `protobuf:"bytes,1,opt,name=virtual_storage,json=virtualStorage,proto3" json:"virtual_storage,omitempty"` + // include_partially_unavailable indicates whether to include repositories which are available but + // are unavailable on some assigned storages. + IncludePartiallyReplicated bool `protobuf:"varint,2,opt,name=include_partially_replicated,json=includePartiallyReplicated,proto3" json:"include_partially_replicated,omitempty"` +} + +func (x *DatalossRequest) Reset() { + *x = DatalossRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_praefect_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DatalossRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DatalossRequest) ProtoMessage() {} + +func (x *DatalossRequest) ProtoReflect() protoreflect.Message { + mi := &file_praefect_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DatalossRequest.ProtoReflect.Descriptor instead. +func (*DatalossRequest) Descriptor() ([]byte, []int) { + return file_praefect_proto_rawDescGZIP(), []int{8} +} + +func (x *DatalossRequest) GetVirtualStorage() string { + if x != nil { + return x.VirtualStorage + } + return "" +} + +func (x *DatalossRequest) GetIncludePartiallyReplicated() bool { + if x != nil { + return x.IncludePartiallyReplicated + } + return false +} + +// Contains information about a repository that may be behind +// the primary. +type DatalossResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // repositories with data loss + Repositories []*DatalossResponse_Repository `protobuf:"bytes,2,rep,name=repositories,proto3" json:"repositories,omitempty"` +} + +func (x *DatalossResponse) Reset() { + *x = DatalossResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_praefect_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DatalossResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DatalossResponse) ProtoMessage() {} + +func (x *DatalossResponse) ProtoReflect() protoreflect.Message { + mi := &file_praefect_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DatalossResponse.ProtoReflect.Descriptor instead. +func (*DatalossResponse) Descriptor() ([]byte, []int) { + return file_praefect_proto_rawDescGZIP(), []int{9} +} + +func (x *DatalossResponse) GetRepositories() []*DatalossResponse_Repository { + if x != nil { + return x.Repositories + } + return nil +} + // This comment is left unintentionally blank. +// +// Deprecated: Marked as deprecated in praefect.proto. type DatalossCheckRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -597,7 +708,7 @@ type DatalossCheckRequest struct { func (x *DatalossCheckRequest) Reset() { *x = DatalossCheckRequest{} if protoimpl.UnsafeEnabled { - mi := &file_praefect_proto_msgTypes[8] + mi := &file_praefect_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -610,7 +721,7 @@ func (x *DatalossCheckRequest) String() string { func (*DatalossCheckRequest) ProtoMessage() {} func (x *DatalossCheckRequest) ProtoReflect() protoreflect.Message { - mi := &file_praefect_proto_msgTypes[8] + mi := &file_praefect_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -623,7 +734,7 @@ func (x *DatalossCheckRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DatalossCheckRequest.ProtoReflect.Descriptor instead. func (*DatalossCheckRequest) Descriptor() ([]byte, []int) { - return file_praefect_proto_rawDescGZIP(), []int{8} + return file_praefect_proto_rawDescGZIP(), []int{10} } func (x *DatalossCheckRequest) GetVirtualStorage() string { @@ -641,6 +752,8 @@ func (x *DatalossCheckRequest) GetIncludePartiallyReplicated() bool { } // This comment is left unintentionally blank. +// +// Deprecated: Marked as deprecated in praefect.proto. type DatalossCheckResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -653,7 +766,7 @@ type DatalossCheckResponse struct { func (x *DatalossCheckResponse) Reset() { *x = DatalossCheckResponse{} if protoimpl.UnsafeEnabled { - mi := &file_praefect_proto_msgTypes[9] + mi := &file_praefect_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -666,7 +779,7 @@ func (x *DatalossCheckResponse) String() string { func (*DatalossCheckResponse) ProtoMessage() {} func (x *DatalossCheckResponse) ProtoReflect() protoreflect.Message { - mi := &file_praefect_proto_msgTypes[9] + mi := &file_praefect_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -679,7 +792,7 @@ func (x *DatalossCheckResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatalossCheckResponse.ProtoReflect.Descriptor instead. func (*DatalossCheckResponse) Descriptor() ([]byte, []int) { - return file_praefect_proto_rawDescGZIP(), []int{9} + return file_praefect_proto_rawDescGZIP(), []int{11} } func (x *DatalossCheckResponse) GetRepositories() []*DatalossCheckResponse_Repository { @@ -702,7 +815,7 @@ type RepositoryReplicasRequest struct { func (x *RepositoryReplicasRequest) Reset() { *x = RepositoryReplicasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_praefect_proto_msgTypes[10] + mi := &file_praefect_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -715,7 +828,7 @@ func (x *RepositoryReplicasRequest) String() string { func (*RepositoryReplicasRequest) ProtoMessage() {} func (x *RepositoryReplicasRequest) ProtoReflect() protoreflect.Message { - mi := &file_praefect_proto_msgTypes[10] + mi := &file_praefect_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -728,7 +841,7 @@ func (x *RepositoryReplicasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RepositoryReplicasRequest.ProtoReflect.Descriptor instead. func (*RepositoryReplicasRequest) Descriptor() ([]byte, []int) { - return file_praefect_proto_rawDescGZIP(), []int{10} + return file_praefect_proto_rawDescGZIP(), []int{12} } func (x *RepositoryReplicasRequest) GetRepository() *Repository { @@ -753,7 +866,7 @@ type RepositoryReplicasResponse struct { func (x *RepositoryReplicasResponse) Reset() { *x = RepositoryReplicasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_praefect_proto_msgTypes[11] + mi := &file_praefect_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -766,7 +879,7 @@ func (x *RepositoryReplicasResponse) String() string { func (*RepositoryReplicasResponse) ProtoMessage() {} func (x *RepositoryReplicasResponse) ProtoReflect() protoreflect.Message { - mi := &file_praefect_proto_msgTypes[11] + mi := &file_praefect_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -779,7 +892,7 @@ func (x *RepositoryReplicasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RepositoryReplicasResponse.ProtoReflect.Descriptor instead. func (*RepositoryReplicasResponse) Descriptor() ([]byte, []int) { - return file_praefect_proto_rawDescGZIP(), []int{11} + return file_praefect_proto_rawDescGZIP(), []int{13} } func (x *RepositoryReplicasResponse) GetPrimary() *RepositoryReplicasResponse_RepositoryDetails { @@ -811,7 +924,7 @@ type MarkUnverifiedRequest_Storage struct { func (x *MarkUnverifiedRequest_Storage) Reset() { *x = MarkUnverifiedRequest_Storage{} if protoimpl.UnsafeEnabled { - mi := &file_praefect_proto_msgTypes[12] + mi := &file_praefect_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -824,7 +937,7 @@ func (x *MarkUnverifiedRequest_Storage) String() string { func (*MarkUnverifiedRequest_Storage) ProtoMessage() {} func (x *MarkUnverifiedRequest_Storage) ProtoReflect() protoreflect.Message { - mi := &file_praefect_proto_msgTypes[12] + mi := &file_praefect_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -869,7 +982,7 @@ type GetRepositoryMetadataRequest_Path struct { func (x *GetRepositoryMetadataRequest_Path) Reset() { *x = GetRepositoryMetadataRequest_Path{} if protoimpl.UnsafeEnabled { - mi := &file_praefect_proto_msgTypes[13] + mi := &file_praefect_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -882,7 +995,7 @@ func (x *GetRepositoryMetadataRequest_Path) String() string { func (*GetRepositoryMetadataRequest_Path) ProtoMessage() {} func (x *GetRepositoryMetadataRequest_Path) ProtoReflect() protoreflect.Message { - mi := &file_praefect_proto_msgTypes[13] + mi := &file_praefect_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -936,7 +1049,7 @@ type GetRepositoryMetadataResponse_Replica struct { func (x *GetRepositoryMetadataResponse_Replica) Reset() { *x = GetRepositoryMetadataResponse_Replica{} if protoimpl.UnsafeEnabled { - mi := &file_praefect_proto_msgTypes[14] + mi := &file_praefect_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -949,7 +1062,7 @@ func (x *GetRepositoryMetadataResponse_Replica) String() string { func (*GetRepositoryMetadataResponse_Replica) ProtoMessage() {} func (x *GetRepositoryMetadataResponse_Replica) ProtoReflect() protoreflect.Message { - mi := &file_praefect_proto_msgTypes[14] + mi := &file_praefect_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1007,6 +1120,167 @@ func (x *GetRepositoryMetadataResponse_Replica) GetVerifiedAt() *timestamppb.Tim return nil } +// status of a repository +type DatalossResponse_Repository struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // relative path of the repository with outdated replicas + RelativePath string `protobuf:"bytes,1,opt,name=relative_path,json=relativePath,proto3" json:"relative_path,omitempty"` + // storages on which the repository is outdated + Storages []*DatalossResponse_Repository_Storage `protobuf:"bytes,2,rep,name=storages,proto3" json:"storages,omitempty"` + // unavailable indicates whether the repository is in unavailable. + Unavailable bool `protobuf:"varint,3,opt,name=unavailable,proto3" json:"unavailable,omitempty"` + // current primary storage of the repository + Primary string `protobuf:"bytes,4,opt,name=primary,proto3" json:"primary,omitempty"` +} + +func (x *DatalossResponse_Repository) Reset() { + *x = DatalossResponse_Repository{} + if protoimpl.UnsafeEnabled { + mi := &file_praefect_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DatalossResponse_Repository) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DatalossResponse_Repository) ProtoMessage() {} + +func (x *DatalossResponse_Repository) ProtoReflect() protoreflect.Message { + mi := &file_praefect_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DatalossResponse_Repository.ProtoReflect.Descriptor instead. +func (*DatalossResponse_Repository) Descriptor() ([]byte, []int) { + return file_praefect_proto_rawDescGZIP(), []int{9, 0} +} + +func (x *DatalossResponse_Repository) GetRelativePath() string { + if x != nil { + return x.RelativePath + } + return "" +} + +func (x *DatalossResponse_Repository) GetStorages() []*DatalossResponse_Repository_Storage { + if x != nil { + return x.Storages + } + return nil +} + +func (x *DatalossResponse_Repository) GetUnavailable() bool { + if x != nil { + return x.Unavailable + } + return false +} + +func (x *DatalossResponse_Repository) GetPrimary() string { + if x != nil { + return x.Primary + } + return "" +} + +// This comment is left unintentionally blank. +type DatalossResponse_Repository_Storage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // name of the storage + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // behind_by indicates how many generations this storage is behind. + BehindBy int64 `protobuf:"varint,2,opt,name=behind_by,json=behindBy,proto3" json:"behind_by,omitempty"` + // assigned indicates whether the storage is assigned to host the repository. + Assigned bool `protobuf:"varint,3,opt,name=assigned,proto3" json:"assigned,omitempty"` + // healthy indicates whether the storage is considered healthy by the consensus of Praefect nodes. + Healthy bool `protobuf:"varint,4,opt,name=healthy,proto3" json:"healthy,omitempty"` + // valid_primary indicates whether the storage is ready to act as the primary if necessary. + ValidPrimary bool `protobuf:"varint,5,opt,name=valid_primary,json=validPrimary,proto3" json:"valid_primary,omitempty"` +} + +func (x *DatalossResponse_Repository_Storage) Reset() { + *x = DatalossResponse_Repository_Storage{} + if protoimpl.UnsafeEnabled { + mi := &file_praefect_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DatalossResponse_Repository_Storage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DatalossResponse_Repository_Storage) ProtoMessage() {} + +func (x *DatalossResponse_Repository_Storage) ProtoReflect() protoreflect.Message { + mi := &file_praefect_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DatalossResponse_Repository_Storage.ProtoReflect.Descriptor instead. +func (*DatalossResponse_Repository_Storage) Descriptor() ([]byte, []int) { + return file_praefect_proto_rawDescGZIP(), []int{9, 0, 0} +} + +func (x *DatalossResponse_Repository_Storage) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DatalossResponse_Repository_Storage) GetBehindBy() int64 { + if x != nil { + return x.BehindBy + } + return 0 +} + +func (x *DatalossResponse_Repository_Storage) GetAssigned() bool { + if x != nil { + return x.Assigned + } + return false +} + +func (x *DatalossResponse_Repository_Storage) GetHealthy() bool { + if x != nil { + return x.Healthy + } + return false +} + +func (x *DatalossResponse_Repository_Storage) GetValidPrimary() bool { + if x != nil { + return x.ValidPrimary + } + return false +} + // This comment is left unintentionally blank. type DatalossCheckResponse_Repository struct { state protoimpl.MessageState @@ -1026,7 +1300,7 @@ type DatalossCheckResponse_Repository struct { func (x *DatalossCheckResponse_Repository) Reset() { *x = DatalossCheckResponse_Repository{} if protoimpl.UnsafeEnabled { - mi := &file_praefect_proto_msgTypes[15] + mi := &file_praefect_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1039,7 +1313,7 @@ func (x *DatalossCheckResponse_Repository) String() string { func (*DatalossCheckResponse_Repository) ProtoMessage() {} func (x *DatalossCheckResponse_Repository) ProtoReflect() protoreflect.Message { - mi := &file_praefect_proto_msgTypes[15] + mi := &file_praefect_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1052,7 +1326,7 @@ func (x *DatalossCheckResponse_Repository) ProtoReflect() protoreflect.Message { // Deprecated: Use DatalossCheckResponse_Repository.ProtoReflect.Descriptor instead. func (*DatalossCheckResponse_Repository) Descriptor() ([]byte, []int) { - return file_praefect_proto_rawDescGZIP(), []int{9, 0} + return file_praefect_proto_rawDescGZIP(), []int{11, 0} } func (x *DatalossCheckResponse_Repository) GetRelativePath() string { @@ -1104,7 +1378,7 @@ type DatalossCheckResponse_Repository_Storage struct { func (x *DatalossCheckResponse_Repository_Storage) Reset() { *x = DatalossCheckResponse_Repository_Storage{} if protoimpl.UnsafeEnabled { - mi := &file_praefect_proto_msgTypes[16] + mi := &file_praefect_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1117,7 +1391,7 @@ func (x *DatalossCheckResponse_Repository_Storage) String() string { func (*DatalossCheckResponse_Repository_Storage) ProtoMessage() {} func (x *DatalossCheckResponse_Repository_Storage) ProtoReflect() protoreflect.Message { - mi := &file_praefect_proto_msgTypes[16] + mi := &file_praefect_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1130,7 +1404,7 @@ func (x *DatalossCheckResponse_Repository_Storage) ProtoReflect() protoreflect.M // Deprecated: Use DatalossCheckResponse_Repository_Storage.ProtoReflect.Descriptor instead. func (*DatalossCheckResponse_Repository_Storage) Descriptor() ([]byte, []int) { - return file_praefect_proto_rawDescGZIP(), []int{9, 0, 0} + return file_praefect_proto_rawDescGZIP(), []int{11, 0, 0} } func (x *DatalossCheckResponse_Repository_Storage) GetName() string { @@ -1183,7 +1457,7 @@ type RepositoryReplicasResponse_RepositoryDetails struct { func (x *RepositoryReplicasResponse_RepositoryDetails) Reset() { *x = RepositoryReplicasResponse_RepositoryDetails{} if protoimpl.UnsafeEnabled { - mi := &file_praefect_proto_msgTypes[17] + mi := &file_praefect_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1196,7 +1470,7 @@ func (x *RepositoryReplicasResponse_RepositoryDetails) String() string { func (*RepositoryReplicasResponse_RepositoryDetails) ProtoMessage() {} func (x *RepositoryReplicasResponse_RepositoryDetails) ProtoReflect() protoreflect.Message { - mi := &file_praefect_proto_msgTypes[17] + mi := &file_praefect_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1209,7 +1483,7 @@ func (x *RepositoryReplicasResponse_RepositoryDetails) ProtoReflect() protorefle // Deprecated: Use RepositoryReplicasResponse_RepositoryDetails.ProtoReflect.Descriptor instead. func (*RepositoryReplicasResponse_RepositoryDetails) Descriptor() ([]byte, []int) { - return file_praefect_proto_rawDescGZIP(), []int{11, 0} + return file_praefect_proto_rawDescGZIP(), []int{13, 0} } func (x *RepositoryReplicasResponse_RepositoryDetails) GetRepository() *Repository { @@ -1329,107 +1603,147 @@ var file_praefect_proto_rawDesc = []byte{ 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, - 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, - 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x40, 0x0a, 0x1c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0xbb, 0x03, 0x0a, 0x15, 0x44, 0x61, 0x74, - 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x0a, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x12, 0x40, 0x0a, 0x1c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x22, 0xac, 0x03, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, - 0x1a, 0xd3, 0x02, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x1a, 0xce, 0x02, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x4c, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x1a, 0x95, - 0x01, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x08, 0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x42, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x61, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x4f, 0x0a, 0x19, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x47, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x73, 0x12, 0x20, 0x0a, + 0x0b, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x1a, 0x95, 0x01, 0x0a, 0x07, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x65, 0x68, + 0x69, 0x6e, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x62, 0x65, + 0x68, 0x69, 0x6e, 0x64, 0x42, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x23, 0x0a, 0x0d, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x22, 0x85, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x12, 0x40, 0x0a, 0x1c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xbf, 0x03, 0x0a, 0x15, 0x44, 0x61, + 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, + 0x73, 0x1a, 0xd3, 0x02, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4c, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x1a, + 0x95, 0x01, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x42, 0x79, 0x12, 0x1a, 0x0a, 0x08, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x4f, 0x0a, 0x19, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0xa3, 0x02, 0x0a, + 0x1a, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x07, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x1a, 0x63, 0x0a, + 0x11, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x75, 0x6d, 0x32, 0x92, 0x05, 0x0a, 0x13, 0x50, 0x72, 0x61, 0x65, 0x66, 0x65, 0x63, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0xa3, 0x02, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x08, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x1a, 0x63, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x32, 0x0a, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x32, 0xcc, 0x04, - 0x0a, 0x13, 0x50, 0x72, 0x61, 0x65, 0x66, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x21, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6c, - 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x6a, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x26, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, - 0x4d, 0x61, 0x72, 0x6b, 0x55, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x55, 0x6e, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x55, 0x6e, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, - 0x14, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x6c, + 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x3f, 0x0a, 0x08, 0x44, 0x61, + 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x12, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x73, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x6a, 0x0a, 0x17, 0x53, + 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x53, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x4d, 0x61, 0x72, 0x6b, 0x55, + 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x55, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x55, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x64, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x04, 0xf0, 0x97, 0x28, 0x01, 0x42, 0x34, 0x5a, 0x32, - 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, - 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, 0x31, 0x36, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x1a, 0x04, 0xf0, 0x97, 0x28, 0x01, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x6c, 0x61, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2d, 0x6f, 0x72, 0x67, + 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, 0x31, 0x36, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1444,7 +1758,7 @@ func file_praefect_proto_rawDescGZIP() []byte { return file_praefect_proto_rawDescData } -var file_praefect_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_praefect_proto_msgTypes = make([]protoimpl.MessageInfo, 22) var file_praefect_proto_goTypes = []interface{}{ (*MarkUnverifiedRequest)(nil), // 0: gitaly.MarkUnverifiedRequest (*MarkUnverifiedResponse)(nil), // 1: gitaly.MarkUnverifiedResponse @@ -1454,47 +1768,55 @@ var file_praefect_proto_goTypes = []interface{}{ (*SetReplicationFactorResponse)(nil), // 5: gitaly.SetReplicationFactorResponse (*SetAuthoritativeStorageRequest)(nil), // 6: gitaly.SetAuthoritativeStorageRequest (*SetAuthoritativeStorageResponse)(nil), // 7: gitaly.SetAuthoritativeStorageResponse - (*DatalossCheckRequest)(nil), // 8: gitaly.DatalossCheckRequest - (*DatalossCheckResponse)(nil), // 9: gitaly.DatalossCheckResponse - (*RepositoryReplicasRequest)(nil), // 10: gitaly.RepositoryReplicasRequest - (*RepositoryReplicasResponse)(nil), // 11: gitaly.RepositoryReplicasResponse - (*MarkUnverifiedRequest_Storage)(nil), // 12: gitaly.MarkUnverifiedRequest.Storage - (*GetRepositoryMetadataRequest_Path)(nil), // 13: gitaly.GetRepositoryMetadataRequest.Path - (*GetRepositoryMetadataResponse_Replica)(nil), // 14: gitaly.GetRepositoryMetadataResponse.Replica - (*DatalossCheckResponse_Repository)(nil), // 15: gitaly.DatalossCheckResponse.Repository - (*DatalossCheckResponse_Repository_Storage)(nil), // 16: gitaly.DatalossCheckResponse.Repository.Storage - (*RepositoryReplicasResponse_RepositoryDetails)(nil), // 17: gitaly.RepositoryReplicasResponse.RepositoryDetails - (*Repository)(nil), // 18: gitaly.Repository - (*timestamppb.Timestamp)(nil), // 19: google.protobuf.Timestamp + (*DatalossRequest)(nil), // 8: gitaly.DatalossRequest + (*DatalossResponse)(nil), // 9: gitaly.DatalossResponse + (*DatalossCheckRequest)(nil), // 10: gitaly.DatalossCheckRequest + (*DatalossCheckResponse)(nil), // 11: gitaly.DatalossCheckResponse + (*RepositoryReplicasRequest)(nil), // 12: gitaly.RepositoryReplicasRequest + (*RepositoryReplicasResponse)(nil), // 13: gitaly.RepositoryReplicasResponse + (*MarkUnverifiedRequest_Storage)(nil), // 14: gitaly.MarkUnverifiedRequest.Storage + (*GetRepositoryMetadataRequest_Path)(nil), // 15: gitaly.GetRepositoryMetadataRequest.Path + (*GetRepositoryMetadataResponse_Replica)(nil), // 16: gitaly.GetRepositoryMetadataResponse.Replica + (*DatalossResponse_Repository)(nil), // 17: gitaly.DatalossResponse.Repository + (*DatalossResponse_Repository_Storage)(nil), // 18: gitaly.DatalossResponse.Repository.Storage + (*DatalossCheckResponse_Repository)(nil), // 19: gitaly.DatalossCheckResponse.Repository + (*DatalossCheckResponse_Repository_Storage)(nil), // 20: gitaly.DatalossCheckResponse.Repository.Storage + (*RepositoryReplicasResponse_RepositoryDetails)(nil), // 21: gitaly.RepositoryReplicasResponse.RepositoryDetails + (*Repository)(nil), // 22: gitaly.Repository + (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp } var file_praefect_proto_depIdxs = []int32{ - 12, // 0: gitaly.MarkUnverifiedRequest.storage:type_name -> gitaly.MarkUnverifiedRequest.Storage - 13, // 1: gitaly.GetRepositoryMetadataRequest.path:type_name -> gitaly.GetRepositoryMetadataRequest.Path - 14, // 2: gitaly.GetRepositoryMetadataResponse.replicas:type_name -> gitaly.GetRepositoryMetadataResponse.Replica - 15, // 3: gitaly.DatalossCheckResponse.repositories:type_name -> gitaly.DatalossCheckResponse.Repository - 18, // 4: gitaly.RepositoryReplicasRequest.repository:type_name -> gitaly.Repository - 17, // 5: gitaly.RepositoryReplicasResponse.primary:type_name -> gitaly.RepositoryReplicasResponse.RepositoryDetails - 17, // 6: gitaly.RepositoryReplicasResponse.replicas:type_name -> gitaly.RepositoryReplicasResponse.RepositoryDetails - 19, // 7: gitaly.GetRepositoryMetadataResponse.Replica.verified_at:type_name -> google.protobuf.Timestamp - 16, // 8: gitaly.DatalossCheckResponse.Repository.storages:type_name -> gitaly.DatalossCheckResponse.Repository.Storage - 18, // 9: gitaly.RepositoryReplicasResponse.RepositoryDetails.repository:type_name -> gitaly.Repository - 10, // 10: gitaly.PraefectInfoService.RepositoryReplicas:input_type -> gitaly.RepositoryReplicasRequest - 8, // 11: gitaly.PraefectInfoService.DatalossCheck:input_type -> gitaly.DatalossCheckRequest - 6, // 12: gitaly.PraefectInfoService.SetAuthoritativeStorage:input_type -> gitaly.SetAuthoritativeStorageRequest - 0, // 13: gitaly.PraefectInfoService.MarkUnverified:input_type -> gitaly.MarkUnverifiedRequest - 4, // 14: gitaly.PraefectInfoService.SetReplicationFactor:input_type -> gitaly.SetReplicationFactorRequest - 2, // 15: gitaly.PraefectInfoService.GetRepositoryMetadata:input_type -> gitaly.GetRepositoryMetadataRequest - 11, // 16: gitaly.PraefectInfoService.RepositoryReplicas:output_type -> gitaly.RepositoryReplicasResponse - 9, // 17: gitaly.PraefectInfoService.DatalossCheck:output_type -> gitaly.DatalossCheckResponse - 7, // 18: gitaly.PraefectInfoService.SetAuthoritativeStorage:output_type -> gitaly.SetAuthoritativeStorageResponse - 1, // 19: gitaly.PraefectInfoService.MarkUnverified:output_type -> gitaly.MarkUnverifiedResponse - 5, // 20: gitaly.PraefectInfoService.SetReplicationFactor:output_type -> gitaly.SetReplicationFactorResponse - 3, // 21: gitaly.PraefectInfoService.GetRepositoryMetadata:output_type -> gitaly.GetRepositoryMetadataResponse - 16, // [16:22] is the sub-list for method output_type - 10, // [10:16] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 14, // 0: gitaly.MarkUnverifiedRequest.storage:type_name -> gitaly.MarkUnverifiedRequest.Storage + 15, // 1: gitaly.GetRepositoryMetadataRequest.path:type_name -> gitaly.GetRepositoryMetadataRequest.Path + 16, // 2: gitaly.GetRepositoryMetadataResponse.replicas:type_name -> gitaly.GetRepositoryMetadataResponse.Replica + 17, // 3: gitaly.DatalossResponse.repositories:type_name -> gitaly.DatalossResponse.Repository + 19, // 4: gitaly.DatalossCheckResponse.repositories:type_name -> gitaly.DatalossCheckResponse.Repository + 22, // 5: gitaly.RepositoryReplicasRequest.repository:type_name -> gitaly.Repository + 21, // 6: gitaly.RepositoryReplicasResponse.primary:type_name -> gitaly.RepositoryReplicasResponse.RepositoryDetails + 21, // 7: gitaly.RepositoryReplicasResponse.replicas:type_name -> gitaly.RepositoryReplicasResponse.RepositoryDetails + 23, // 8: gitaly.GetRepositoryMetadataResponse.Replica.verified_at:type_name -> google.protobuf.Timestamp + 18, // 9: gitaly.DatalossResponse.Repository.storages:type_name -> gitaly.DatalossResponse.Repository.Storage + 20, // 10: gitaly.DatalossCheckResponse.Repository.storages:type_name -> gitaly.DatalossCheckResponse.Repository.Storage + 22, // 11: gitaly.RepositoryReplicasResponse.RepositoryDetails.repository:type_name -> gitaly.Repository + 12, // 12: gitaly.PraefectInfoService.RepositoryReplicas:input_type -> gitaly.RepositoryReplicasRequest + 10, // 13: gitaly.PraefectInfoService.DatalossCheck:input_type -> gitaly.DatalossCheckRequest + 8, // 14: gitaly.PraefectInfoService.Dataloss:input_type -> gitaly.DatalossRequest + 6, // 15: gitaly.PraefectInfoService.SetAuthoritativeStorage:input_type -> gitaly.SetAuthoritativeStorageRequest + 0, // 16: gitaly.PraefectInfoService.MarkUnverified:input_type -> gitaly.MarkUnverifiedRequest + 4, // 17: gitaly.PraefectInfoService.SetReplicationFactor:input_type -> gitaly.SetReplicationFactorRequest + 2, // 18: gitaly.PraefectInfoService.GetRepositoryMetadata:input_type -> gitaly.GetRepositoryMetadataRequest + 13, // 19: gitaly.PraefectInfoService.RepositoryReplicas:output_type -> gitaly.RepositoryReplicasResponse + 11, // 20: gitaly.PraefectInfoService.DatalossCheck:output_type -> gitaly.DatalossCheckResponse + 9, // 21: gitaly.PraefectInfoService.Dataloss:output_type -> gitaly.DatalossResponse + 7, // 22: gitaly.PraefectInfoService.SetAuthoritativeStorage:output_type -> gitaly.SetAuthoritativeStorageResponse + 1, // 23: gitaly.PraefectInfoService.MarkUnverified:output_type -> gitaly.MarkUnverifiedResponse + 5, // 24: gitaly.PraefectInfoService.SetReplicationFactor:output_type -> gitaly.SetReplicationFactorResponse + 3, // 25: gitaly.PraefectInfoService.GetRepositoryMetadata:output_type -> gitaly.GetRepositoryMetadataResponse + 19, // [19:26] is the sub-list for method output_type + 12, // [12:19] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_praefect_proto_init() } @@ -1602,7 +1924,7 @@ func file_praefect_proto_init() { } } file_praefect_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatalossCheckRequest); i { + switch v := v.(*DatalossRequest); i { case 0: return &v.state case 1: @@ -1614,7 +1936,7 @@ func file_praefect_proto_init() { } } file_praefect_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatalossCheckResponse); i { + switch v := v.(*DatalossResponse); i { case 0: return &v.state case 1: @@ -1626,7 +1948,7 @@ func file_praefect_proto_init() { } } file_praefect_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RepositoryReplicasRequest); i { + switch v := v.(*DatalossCheckRequest); i { case 0: return &v.state case 1: @@ -1638,7 +1960,7 @@ func file_praefect_proto_init() { } } file_praefect_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RepositoryReplicasResponse); i { + switch v := v.(*DatalossCheckResponse); i { case 0: return &v.state case 1: @@ -1650,7 +1972,7 @@ func file_praefect_proto_init() { } } file_praefect_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarkUnverifiedRequest_Storage); i { + switch v := v.(*RepositoryReplicasRequest); i { case 0: return &v.state case 1: @@ -1662,7 +1984,7 @@ func file_praefect_proto_init() { } } file_praefect_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRepositoryMetadataRequest_Path); i { + switch v := v.(*RepositoryReplicasResponse); i { case 0: return &v.state case 1: @@ -1674,7 +1996,7 @@ func file_praefect_proto_init() { } } file_praefect_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRepositoryMetadataResponse_Replica); i { + switch v := v.(*MarkUnverifiedRequest_Storage); i { case 0: return &v.state case 1: @@ -1686,7 +2008,7 @@ func file_praefect_proto_init() { } } file_praefect_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatalossCheckResponse_Repository); i { + switch v := v.(*GetRepositoryMetadataRequest_Path); i { case 0: return &v.state case 1: @@ -1698,7 +2020,7 @@ func file_praefect_proto_init() { } } file_praefect_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatalossCheckResponse_Repository_Storage); i { + switch v := v.(*GetRepositoryMetadataResponse_Replica); i { case 0: return &v.state case 1: @@ -1710,6 +2032,54 @@ func file_praefect_proto_init() { } } file_praefect_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DatalossResponse_Repository); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_praefect_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DatalossResponse_Repository_Storage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_praefect_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DatalossCheckResponse_Repository); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_praefect_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DatalossCheckResponse_Repository_Storage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_praefect_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RepositoryReplicasResponse_RepositoryDetails); i { case 0: return &v.state @@ -1737,7 +2107,7 @@ func file_praefect_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_praefect_proto_rawDesc, NumEnums: 0, - NumMessages: 18, + NumMessages: 22, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/go/gitalypb/praefect_grpc.pb.go b/proto/go/gitalypb/praefect_grpc.pb.go index 062d7f58d..3450d4f3e 100644 --- a/proto/go/gitalypb/praefect_grpc.pb.go +++ b/proto/go/gitalypb/praefect_grpc.pb.go @@ -24,8 +24,15 @@ const _ = grpc.SupportPackageIsVersion7 type PraefectInfoServiceClient interface { // This comment is left unintentionally blank. RepositoryReplicas(ctx context.Context, in *RepositoryReplicasRequest, opts ...grpc.CallOption) (*RepositoryReplicasResponse, error) - // DatalossCheck checks for unavailable repositories. + // Deprecated: Do not use. + // DatalossCheck provides information on repositories in Praefect that are in a degraded state and + // thus susceptible to dataloss. A repository is considered degraded when its replicas are + // outdated and/or unavailable. DatalossCheck(ctx context.Context, in *DatalossCheckRequest, opts ...grpc.CallOption) (*DatalossCheckResponse, error) + // Dataloss provides information on repositories in Praefect that are in a degraded state and + // thus susceptible to dataloss. A repository is considered degraded when its replicas are + // outdated and/or unavailable. + Dataloss(ctx context.Context, in *DatalossRequest, opts ...grpc.CallOption) (PraefectInfoService_DatalossClient, error) // SetAuthoritativeStorage sets the authoritative storage for a repository on a given virtual storage. // This causes the current version of the repository on the authoritative storage to be considered the // latest and overwrite any other version on the virtual storage. @@ -63,6 +70,7 @@ func (c *praefectInfoServiceClient) RepositoryReplicas(ctx context.Context, in * return out, nil } +// Deprecated: Do not use. func (c *praefectInfoServiceClient) DatalossCheck(ctx context.Context, in *DatalossCheckRequest, opts ...grpc.CallOption) (*DatalossCheckResponse, error) { out := new(DatalossCheckResponse) err := c.cc.Invoke(ctx, "/gitaly.PraefectInfoService/DatalossCheck", in, out, opts...) @@ -72,6 +80,38 @@ func (c *praefectInfoServiceClient) DatalossCheck(ctx context.Context, in *Datal return out, nil } +func (c *praefectInfoServiceClient) Dataloss(ctx context.Context, in *DatalossRequest, opts ...grpc.CallOption) (PraefectInfoService_DatalossClient, error) { + stream, err := c.cc.NewStream(ctx, &PraefectInfoService_ServiceDesc.Streams[0], "/gitaly.PraefectInfoService/Dataloss", opts...) + if err != nil { + return nil, err + } + x := &praefectInfoServiceDatalossClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type PraefectInfoService_DatalossClient interface { + Recv() (*DatalossResponse, error) + grpc.ClientStream +} + +type praefectInfoServiceDatalossClient struct { + grpc.ClientStream +} + +func (x *praefectInfoServiceDatalossClient) Recv() (*DatalossResponse, error) { + m := new(DatalossResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *praefectInfoServiceClient) SetAuthoritativeStorage(ctx context.Context, in *SetAuthoritativeStorageRequest, opts ...grpc.CallOption) (*SetAuthoritativeStorageResponse, error) { out := new(SetAuthoritativeStorageResponse) err := c.cc.Invoke(ctx, "/gitaly.PraefectInfoService/SetAuthoritativeStorage", in, out, opts...) @@ -114,8 +154,15 @@ func (c *praefectInfoServiceClient) GetRepositoryMetadata(ctx context.Context, i type PraefectInfoServiceServer interface { // This comment is left unintentionally blank. RepositoryReplicas(context.Context, *RepositoryReplicasRequest) (*RepositoryReplicasResponse, error) - // DatalossCheck checks for unavailable repositories. + // Deprecated: Do not use. + // DatalossCheck provides information on repositories in Praefect that are in a degraded state and + // thus susceptible to dataloss. A repository is considered degraded when its replicas are + // outdated and/or unavailable. DatalossCheck(context.Context, *DatalossCheckRequest) (*DatalossCheckResponse, error) + // Dataloss provides information on repositories in Praefect that are in a degraded state and + // thus susceptible to dataloss. A repository is considered degraded when its replicas are + // outdated and/or unavailable. + Dataloss(*DatalossRequest, PraefectInfoService_DatalossServer) error // SetAuthoritativeStorage sets the authoritative storage for a repository on a given virtual storage. // This causes the current version of the repository on the authoritative storage to be considered the // latest and overwrite any other version on the virtual storage. @@ -147,6 +194,9 @@ func (UnimplementedPraefectInfoServiceServer) RepositoryReplicas(context.Context func (UnimplementedPraefectInfoServiceServer) DatalossCheck(context.Context, *DatalossCheckRequest) (*DatalossCheckResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DatalossCheck not implemented") } +func (UnimplementedPraefectInfoServiceServer) Dataloss(*DatalossRequest, PraefectInfoService_DatalossServer) error { + return status.Errorf(codes.Unimplemented, "method Dataloss not implemented") +} func (UnimplementedPraefectInfoServiceServer) SetAuthoritativeStorage(context.Context, *SetAuthoritativeStorageRequest) (*SetAuthoritativeStorageResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SetAuthoritativeStorage not implemented") } @@ -208,6 +258,27 @@ func _PraefectInfoService_DatalossCheck_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _PraefectInfoService_Dataloss_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(DatalossRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(PraefectInfoServiceServer).Dataloss(m, &praefectInfoServiceDatalossServer{stream}) +} + +type PraefectInfoService_DatalossServer interface { + Send(*DatalossResponse) error + grpc.ServerStream +} + +type praefectInfoServiceDatalossServer struct { + grpc.ServerStream +} + +func (x *praefectInfoServiceDatalossServer) Send(m *DatalossResponse) error { + return x.ServerStream.SendMsg(m) +} + func _PraefectInfoService_SetAuthoritativeStorage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SetAuthoritativeStorageRequest) if err := dec(in); err != nil { @@ -312,6 +383,12 @@ var PraefectInfoService_ServiceDesc = grpc.ServiceDesc{ Handler: _PraefectInfoService_GetRepositoryMetadata_Handler, }, }, - Streams: []grpc.StreamDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "Dataloss", + Handler: _PraefectInfoService_Dataloss_Handler, + ServerStreams: true, + }, + }, Metadata: "praefect.proto", } diff --git a/proto/praefect.proto b/proto/praefect.proto index 64f329b54..b0cd76056 100644 --- a/proto/praefect.proto +++ b/proto/praefect.proto @@ -16,8 +16,17 @@ service PraefectInfoService { // This comment is left unintentionally blank. rpc RepositoryReplicas(RepositoryReplicasRequest) returns (RepositoryReplicasResponse); - // DatalossCheck checks for unavailable repositories. - rpc DatalossCheck(DatalossCheckRequest) returns (DatalossCheckResponse); + // DatalossCheck provides information on repositories in Praefect that are in a degraded state and + // thus susceptible to dataloss. A repository is considered degraded when its replicas are + // outdated and/or unavailable. + rpc DatalossCheck(DatalossCheckRequest) returns (DatalossCheckResponse) { + option deprecated = true; + }; + + // Dataloss provides information on repositories in Praefect that are in a degraded state and + // thus susceptible to dataloss. A repository is considered degraded when its replicas are + // outdated and/or unavailable. + rpc Dataloss(DatalossRequest) returns (stream DatalossResponse); // SetAuthoritativeStorage sets the authoritative storage for a repository on a given virtual storage. // This causes the current version of the repository on the authoritative storage to be considered the @@ -154,8 +163,52 @@ message SetAuthoritativeStorageRequest { message SetAuthoritativeStorageResponse { } +// A request for data loss information +message DatalossRequest { + // The virtual storage to get dataloss information for + string virtual_storage = 1; + // include_partially_unavailable indicates whether to include repositories which are available but + // are unavailable on some assigned storages. + bool include_partially_replicated = 2; +} + +// Contains information about a repository that may be behind +// the primary. +message DatalossResponse { + // status of a repository + message Repository { + // This comment is left unintentionally blank. + message Storage { + // name of the storage + string name = 1; + // behind_by indicates how many generations this storage is behind. + int64 behind_by = 2; + // assigned indicates whether the storage is assigned to host the repository. + bool assigned = 3; + // healthy indicates whether the storage is considered healthy by the consensus of Praefect nodes. + bool healthy = 4; + // valid_primary indicates whether the storage is ready to act as the primary if necessary. + bool valid_primary = 5; + } + + // relative path of the repository with outdated replicas + string relative_path = 1; + // storages on which the repository is outdated + repeated Storage storages = 2; + // unavailable indicates whether the repository is in unavailable. + bool unavailable = 3; + + // current primary storage of the repository + string primary = 4; + } + + // repositories with data loss + repeated Repository repositories = 2; +} + // This comment is left unintentionally blank. message DatalossCheckRequest { + option deprecated = true; // This comment is left unintentionally blank. string virtual_storage = 1; // include_partially_unavailable indicates whether to include repositories which are available but @@ -165,6 +218,7 @@ message DatalossCheckRequest { // This comment is left unintentionally blank. message DatalossCheckResponse { + option deprecated = true; // This comment is left unintentionally blank. message Repository { // This comment is left unintentionally blank. |