Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Cai <jcai@gitlab.com>2023-08-31 15:52:37 +0300
committerJohn Cai <jcai@gitlab.com>2023-08-31 15:52:37 +0300
commitcd49ee59b26a1206adb247ab2f71f46c1c1fde80 (patch)
tree4a4600ba7f9d0a81839f5d2ebbe65da2cd8f7f2c
parent08d8c4dd8ae5847407d9f8ad9a38bdfdf1e9f958 (diff)
parent6784d292c8d4f643d0e227214c332505ee3a39e1 (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.go3
-rw-r--r--internal/cli/praefect/subcmd_dataloss.go108
-rw-r--r--internal/praefect/service/info/dataloss.go87
-rw-r--r--proto/go/gitalypb/praefect.pb.go714
-rw-r--r--proto/go/gitalypb/praefect_grpc.pb.go83
-rw-r--r--proto/praefect.proto58
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.