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:
authorSami Hiltunen <shiltunen@gitlab.com>2022-04-19 20:02:28 +0300
committerSami Hiltunen <shiltunen@gitlab.com>2022-04-19 20:02:28 +0300
commit752243b877d6b99feff18a601744635b80bd2b88 (patch)
tree793ec26c1b699295fad672af5adb051aba485bc9
parentef18681a6f171af027a31de9ce335a1887d31e81 (diff)
parentb902b6bfbe107e26a8d721414d2fbb76cd648797 (diff)
Merge branch 'smh-verify-subcmd' into 'master'
Implement 'praefect verify' subcommand Closes #4091 See merge request gitlab-org/gitaly!4463
-rw-r--r--cmd/praefect/subcmd.go1
-rw-r--r--cmd/praefect/subcmd_verify.go85
-rw-r--r--cmd/praefect/subcmd_verify_test.go236
-rw-r--r--internal/praefect/datastore/repository_store.go56
-rw-r--r--internal/praefect/datastore/repository_store_mock.go1
-rw-r--r--internal/praefect/service/info/verification.go36
-rw-r--r--proto/go/gitalypb/praefect.pb.go809
-rw-r--r--proto/go/gitalypb/praefect_grpc.pb.go40
-rw-r--r--proto/praefect.proto32
-rw-r--r--ruby/proto/gitaly/praefect_pb.rb17
-rw-r--r--ruby/proto/gitaly/praefect_services_pb.rb3
11 files changed, 1052 insertions, 264 deletions
diff --git a/cmd/praefect/subcmd.go b/cmd/praefect/subcmd.go
index 3a4148244..e62ead65c 100644
--- a/cmd/praefect/subcmd.go
+++ b/cmd/praefect/subcmd.go
@@ -52,6 +52,7 @@ var subcommands = map[string]subcmd{
praefect.NewClockSyncCheck(helper.CheckClockSync),
),
metadataCmdName: newMetadataSubcommand(os.Stdout),
+ verifyCmdName: newVerifySubcommand(os.Stdout),
}
// subCommand returns an exit code, to be fed into os.Exit.
diff --git a/cmd/praefect/subcmd_verify.go b/cmd/praefect/subcmd_verify.go
new file mode 100644
index 000000000..340731409
--- /dev/null
+++ b/cmd/praefect/subcmd_verify.go
@@ -0,0 +1,85 @@
+package main
+
+import (
+ "context"
+ "errors"
+ "flag"
+ "fmt"
+ "io"
+
+ "gitlab.com/gitlab-org/gitaly/v14/internal/praefect/config"
+ "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+)
+
+const verifyCmdName = "verify"
+
+type verifySubcommand struct {
+ stdout io.Writer
+ repositoryID int64
+ virtualStorage string
+ storage string
+}
+
+func newVerifySubcommand(stdout io.Writer) *verifySubcommand {
+ return &verifySubcommand{stdout: stdout}
+}
+
+func (cmd *verifySubcommand) FlagSet() *flag.FlagSet {
+ fs := flag.NewFlagSet(metadataCmdName, flag.ContinueOnError)
+ fs.Int64Var(&cmd.repositoryID, "repository-id", 0, "the id of the repository to verify")
+ fs.StringVar(&cmd.virtualStorage, "virtual-storage", "", "the virtual storage to verify")
+ fs.StringVar(&cmd.storage, "storage", "", "the storage to verify")
+ return fs
+}
+
+func (cmd *verifySubcommand) Exec(flags *flag.FlagSet, cfg config.Config) error {
+ if flags.NArg() > 0 {
+ return unexpectedPositionalArgsError{Command: flags.Name()}
+ }
+
+ var request gitalypb.MarkUnverifiedRequest
+ switch {
+ case cmd.repositoryID != 0:
+ if cmd.virtualStorage != "" || cmd.storage != "" {
+ return errors.New("virtual storage and storage can't be provided with a repository ID")
+ }
+
+ request.Selector = &gitalypb.MarkUnverifiedRequest_RepositoryId{RepositoryId: cmd.repositoryID}
+ case cmd.storage != "":
+ if cmd.virtualStorage == "" {
+ return errors.New("virtual storage must be passed with storage")
+ }
+
+ request.Selector = &gitalypb.MarkUnverifiedRequest_Storage_{
+ Storage: &gitalypb.MarkUnverifiedRequest_Storage{
+ VirtualStorage: cmd.virtualStorage,
+ Storage: cmd.storage,
+ },
+ }
+ case cmd.virtualStorage != "":
+ request.Selector = &gitalypb.MarkUnverifiedRequest_VirtualStorage{VirtualStorage: cmd.virtualStorage}
+ default:
+ return errors.New("(repository id), (virtual storage) or (virtual storage, storage) required")
+ }
+
+ nodeAddr, err := getNodeAddress(cfg)
+ if err != nil {
+ return fmt.Errorf("get node address: %w", err)
+ }
+
+ ctx := context.TODO()
+ conn, err := subCmdDial(ctx, nodeAddr, cfg.Auth.Token, defaultDialTimeout)
+ if err != nil {
+ return fmt.Errorf("dial: %w", err)
+ }
+ defer conn.Close()
+
+ response, err := gitalypb.NewPraefectInfoServiceClient(conn).MarkUnverified(ctx, &request)
+ if err != nil {
+ return fmt.Errorf("verify replicas: %w", err)
+ }
+
+ fmt.Fprintf(cmd.stdout, "%d replicas marked unverified\n", response.GetReplicasMarked())
+
+ return nil
+}
diff --git a/cmd/praefect/subcmd_verify_test.go b/cmd/praefect/subcmd_verify_test.go
new file mode 100644
index 000000000..107430c7c
--- /dev/null
+++ b/cmd/praefect/subcmd_verify_test.go
@@ -0,0 +1,236 @@
+package main
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+ "gitlab.com/gitlab-org/gitaly/v14/internal/praefect/config"
+ "gitlab.com/gitlab-org/gitaly/v14/internal/praefect/datastore"
+ "gitlab.com/gitlab-org/gitaly/v14/internal/praefect/service/info"
+ "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper"
+ "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testdb"
+)
+
+func TestVerifySubcommand(t *testing.T) {
+ t.Parallel()
+
+ // state contains the asserted state as virtual storage -> relative path -> storage -> verified/not verified.
+ type state map[string]map[string]map[string]bool
+
+ startingState := state{
+ "virtual-storage-1": {
+ "relative-path-1": {
+ "unverified": false,
+ "verified-1": true,
+ "verified-2": true,
+ },
+ "relative-path-2": {
+ "unverified": false,
+ "verified-1": true,
+ "verified-2": true,
+ },
+ },
+ "virtual-storage-2": {
+ "relative-path-1": {
+ "unverified": false,
+ "verified-1": true,
+ "verified-2": true,
+ },
+ },
+ }
+
+ for _, tc := range []struct {
+ desc string
+ args []string
+ replicasMarked int
+ error error
+ expectedState state
+ }{
+ {
+ desc: "no selector given",
+ error: errors.New("(repository id), (virtual storage) or (virtual storage, storage) required"),
+ expectedState: startingState,
+ },
+ {
+ desc: "virtual storage passed with repository id",
+ args: []string{"-repository-id=1", "-virtual-storage=virtual-storage"},
+ error: errors.New("virtual storage and storage can't be provided with a repository ID"),
+ expectedState: startingState,
+ },
+ {
+ desc: "storage passed with repository id",
+ args: []string{"-repository-id=1", "-storage=storage"},
+ error: errors.New("virtual storage and storage can't be provided with a repository ID"),
+ expectedState: startingState,
+ },
+ {
+ desc: "storage passed without virtual storage",
+ args: []string{"-storage=storage"},
+ error: errors.New("virtual storage must be passed with storage"),
+ expectedState: startingState,
+ },
+ {
+ desc: "no repository matched",
+ args: []string{"-repository-id=1000"},
+ expectedState: startingState,
+ },
+ {
+ desc: "scheduled by repository id",
+ args: []string{"-repository-id=1"},
+ replicasMarked: 2,
+ expectedState: state{
+ "virtual-storage-1": {
+ "relative-path-1": {
+ "unverified": false,
+ "verified-1": false,
+ "verified-2": false,
+ },
+ "relative-path-2": {
+ "unverified": false,
+ "verified-1": true,
+ "verified-2": true,
+ },
+ },
+ "virtual-storage-2": {
+ "relative-path-1": {
+ "unverified": false,
+ "verified-1": true,
+ "verified-2": true,
+ },
+ },
+ },
+ },
+ {
+ desc: "scheduled by virtual storage",
+ args: []string{"-virtual-storage=virtual-storage-1"},
+ replicasMarked: 4,
+ expectedState: state{
+ "virtual-storage-1": {
+ "relative-path-1": {
+ "unverified": false,
+ "verified-1": false,
+ "verified-2": false,
+ },
+ "relative-path-2": {
+ "unverified": false,
+ "verified-1": false,
+ "verified-2": false,
+ },
+ },
+ "virtual-storage-2": {
+ "relative-path-1": {
+ "unverified": false,
+ "verified-1": true,
+ "verified-2": true,
+ },
+ },
+ },
+ },
+ {
+ desc: "scheduled by storage",
+ args: []string{"-virtual-storage=virtual-storage-1", "-storage=verified-1"},
+ replicasMarked: 2,
+ expectedState: state{
+ "virtual-storage-1": {
+ "relative-path-1": {
+ "unverified": false,
+ "verified-1": false,
+ "verified-2": true,
+ },
+ "relative-path-2": {
+ "unverified": false,
+ "verified-1": false,
+ "verified-2": true,
+ },
+ },
+ "virtual-storage-2": {
+ "relative-path-1": {
+ "unverified": false,
+ "verified-1": true,
+ "verified-2": true,
+ },
+ },
+ },
+ },
+ } {
+ t.Run(tc.desc, func(t *testing.T) {
+ db := testdb.New(t)
+
+ rs := datastore.NewPostgresRepositoryStore(db, nil)
+
+ ln, clean := listenAndServe(t, []svcRegistrar{
+ registerPraefectInfoServer(info.NewServer(config.Config{}, rs, nil, nil, nil)),
+ })
+ defer clean()
+
+ ctx := testhelper.Context(t)
+
+ require.NoError(t,
+ rs.CreateRepository(ctx, 1, "virtual-storage-1", "relative-path-1", "replica-path-1", "unverified", []string{"verified-1", "verified-2"}, nil, false, false),
+ )
+ require.NoError(t,
+ rs.CreateRepository(ctx, 2, "virtual-storage-1", "relative-path-2", "replica-path-2", "unverified", []string{"verified-1", "verified-2"}, nil, false, false),
+ )
+ require.NoError(t,
+ rs.CreateRepository(ctx, 3, "virtual-storage-2", "relative-path-1", "replica-path-3", "unverified", []string{"verified-1", "verified-2"}, nil, false, false),
+ )
+
+ _, err := db.ExecContext(ctx, `
+ UPDATE storage_repositories
+ SET verified_at = now()
+ FROM repositories
+ WHERE repositories.repository_id = storage_repositories.repository_id
+ AND storage != 'unverified'
+ `)
+ require.NoError(t, err)
+
+ stdout := &bytes.Buffer{}
+ cmd := newVerifySubcommand(stdout)
+
+ fs := cmd.FlagSet()
+ require.NoError(t, fs.Parse(tc.args))
+ err = cmd.Exec(fs, config.Config{SocketPath: ln.Addr().String()})
+ testhelper.RequireGrpcError(t, tc.error, err)
+ if tc.error != nil {
+ return
+ }
+
+ require.Equal(t, fmt.Sprintf("%d replicas marked unverified\n", tc.replicasMarked), stdout.String())
+
+ actualState := state{}
+ rows, err := db.QueryContext(ctx, `
+ SELECT
+ repositories.virtual_storage,
+ repositories.relative_path,
+ storage,
+ verified_at IS NOT NULL as verified
+ FROM repositories
+ JOIN storage_repositories USING (repository_id)
+ `)
+ require.NoError(t, err)
+ defer rows.Close()
+
+ for rows.Next() {
+ var virtualStorage, relativePath, storage string
+ var verified bool
+ require.NoError(t, rows.Scan(&virtualStorage, &relativePath, &storage, &verified))
+
+ if actualState[virtualStorage] == nil {
+ actualState[virtualStorage] = map[string]map[string]bool{}
+ }
+
+ if actualState[virtualStorage][relativePath] == nil {
+ actualState[virtualStorage][relativePath] = map[string]bool{}
+ }
+
+ actualState[virtualStorage][relativePath][storage] = verified
+ }
+
+ require.NoError(t, rows.Err())
+ require.Equal(t, tc.expectedState, actualState)
+ })
+ }
+}
diff --git a/internal/praefect/datastore/repository_store.go b/internal/praefect/datastore/repository_store.go
index 74658e212..780073155 100644
--- a/internal/praefect/datastore/repository_store.go
+++ b/internal/praefect/datastore/repository_store.go
@@ -140,6 +140,12 @@ type RepositoryStore interface {
GetRepositoryMetadata(ctx context.Context, repositoryID int64) (RepositoryMetadata, error)
// GetRepositoryMetadataByPath retrieves a repository's metadata by its virtual path.
GetRepositoryMetadataByPath(ctx context.Context, virtualStorage, relativePath string) (RepositoryMetadata, error)
+ // MarkUnverified marks replicas of the repository unverified.
+ MarkUnverified(ctx context.Context, repositoryID int64) (int64, error)
+ // MarkVirtualStorageUnverified marks all replicas on the virtual storage as unverified.
+ MarkVirtualStorageUnverified(ctx context.Context, virtualStorage string) (int64, error)
+ // MarkStorageUnverified marsk all replicas on the storage as unverified.
+ MarkStorageUnverified(ctx context.Context, virtualStorage, storage string) (int64, error)
}
// PostgresRepositoryStore is a Postgres implementation of RepositoryStore.
@@ -154,6 +160,56 @@ func NewPostgresRepositoryStore(db glsql.Querier, configuredStorages map[string]
return &PostgresRepositoryStore{db: db, storages: storages(configuredStorages)}
}
+// MarkUnverified marks replicas of the repository unverified.
+func (rs *PostgresRepositoryStore) MarkUnverified(ctx context.Context, repositoryID int64) (int64, error) {
+ result, err := rs.db.ExecContext(ctx, `
+ UPDATE storage_repositories
+ SET verified_at = NULL
+ WHERE repository_id = $1
+ AND verified_at IS NOT NULL
+ `, repositoryID)
+ if err != nil {
+ return 0, fmt.Errorf("query: %w", err)
+ }
+
+ return result.RowsAffected()
+}
+
+// MarkVirtualStorageUnverified marks all replicas on the virtual storage as unverified.
+func (rs *PostgresRepositoryStore) MarkVirtualStorageUnverified(ctx context.Context, virtualStorage string) (int64, error) {
+ result, err := rs.db.ExecContext(ctx, `
+ UPDATE storage_repositories
+ SET verified_at = NULL
+ FROM repositories
+ WHERE repositories.virtual_storage = $1
+ AND repositories.repository_id = storage_repositories.repository_id
+ AND verified_at IS NOT NULL
+ `, virtualStorage)
+ if err != nil {
+ return 0, fmt.Errorf("query: %w", err)
+ }
+
+ return result.RowsAffected()
+}
+
+// MarkStorageUnverified marsk all replicas on the storage as unverified.
+func (rs *PostgresRepositoryStore) MarkStorageUnverified(ctx context.Context, virtualStorage, storage string) (int64, error) {
+ result, err := rs.db.ExecContext(ctx, `
+ UPDATE storage_repositories
+ SET verified_at = NULL
+ FROM repositories
+ WHERE repositories.repository_id = storage_repositories.repository_id
+ AND repositories.virtual_storage = $1
+ AND storage_repositories.storage = $2
+ AND verified_at IS NOT NULL
+ `, virtualStorage, storage)
+ if err != nil {
+ return 0, fmt.Errorf("query: %w", err)
+ }
+
+ return result.RowsAffected()
+}
+
//nolint: revive,stylecheck // This is unintentionally missing documentation.
func (rs *PostgresRepositoryStore) GetGeneration(ctx context.Context, repositoryID int64, storage string) (int, error) {
const q = `
diff --git a/internal/praefect/datastore/repository_store_mock.go b/internal/praefect/datastore/repository_store_mock.go
index 0770331bd..2a021661d 100644
--- a/internal/praefect/datastore/repository_store_mock.go
+++ b/internal/praefect/datastore/repository_store_mock.go
@@ -5,6 +5,7 @@ import "context"
// MockRepositoryStore allows for mocking a RepositoryStore by parametrizing its behavior. All methods
// default to what could be considered success if not set.
type MockRepositoryStore struct {
+ RepositoryStore
GetGenerationFunc func(ctx context.Context, repositoryID int64, storage string) (int, error)
IncrementGenerationFunc func(ctx context.Context, repositoryID int64, primary string, secondaries []string) error
GetReplicatedGenerationFunc func(ctx context.Context, repositoryID int64, source, target string) (int, error)
diff --git a/internal/praefect/service/info/verification.go b/internal/praefect/service/info/verification.go
new file mode 100644
index 000000000..9ef07a129
--- /dev/null
+++ b/internal/praefect/service/info/verification.go
@@ -0,0 +1,36 @@
+package info
+
+import (
+ "context"
+ "fmt"
+
+ "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+)
+
+// MarkUnverified marks replicas as unverified. See the protobuf declarations for details.
+func (s *Server) MarkUnverified(ctx context.Context, req *gitalypb.MarkUnverifiedRequest) (*gitalypb.MarkUnverifiedResponse, error) {
+ var markUnverified func() (int64, error)
+ switch selector := req.GetSelector().(type) {
+ case *gitalypb.MarkUnverifiedRequest_RepositoryId:
+ markUnverified = func() (int64, error) {
+ return s.rs.MarkUnverified(ctx, selector.RepositoryId)
+ }
+ case *gitalypb.MarkUnverifiedRequest_VirtualStorage:
+ markUnverified = func() (int64, error) {
+ return s.rs.MarkVirtualStorageUnverified(ctx, selector.VirtualStorage)
+ }
+ case *gitalypb.MarkUnverifiedRequest_Storage_:
+ markUnverified = func() (int64, error) {
+ return s.rs.MarkStorageUnverified(ctx, selector.Storage.VirtualStorage, selector.Storage.Storage)
+ }
+ default:
+ return nil, fmt.Errorf("unknown selector: %T", selector)
+ }
+
+ replicasMarked, err := markUnverified()
+ if err != nil {
+ return nil, fmt.Errorf("schedule verification: %w", err)
+ }
+
+ return &gitalypb.MarkUnverifiedResponse{ReplicasMarked: replicasMarked}, nil
+}
diff --git a/proto/go/gitalypb/praefect.pb.go b/proto/go/gitalypb/praefect.pb.go
index 62f8af5b8..e21485b62 100644
--- a/proto/go/gitalypb/praefect.pb.go
+++ b/proto/go/gitalypb/praefect.pb.go
@@ -21,6 +21,156 @@ const (
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
+// MarkUnverifiedRequest specifies the replicas which to mark unverified.
+type MarkUnverifiedRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // selector specifies the replicas which to mark unverified.
+ //
+ // Types that are assignable to Selector:
+ // *MarkUnverifiedRequest_RepositoryId
+ // *MarkUnverifiedRequest_VirtualStorage
+ // *MarkUnverifiedRequest_Storage_
+ Selector isMarkUnverifiedRequest_Selector `protobuf_oneof:"selector"`
+}
+
+func (x *MarkUnverifiedRequest) Reset() {
+ *x = MarkUnverifiedRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_praefect_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *MarkUnverifiedRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MarkUnverifiedRequest) ProtoMessage() {}
+
+func (x *MarkUnverifiedRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_praefect_proto_msgTypes[0]
+ 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 MarkUnverifiedRequest.ProtoReflect.Descriptor instead.
+func (*MarkUnverifiedRequest) Descriptor() ([]byte, []int) {
+ return file_praefect_proto_rawDescGZIP(), []int{0}
+}
+
+func (m *MarkUnverifiedRequest) GetSelector() isMarkUnverifiedRequest_Selector {
+ if m != nil {
+ return m.Selector
+ }
+ return nil
+}
+
+func (x *MarkUnverifiedRequest) GetRepositoryId() int64 {
+ if x, ok := x.GetSelector().(*MarkUnverifiedRequest_RepositoryId); ok {
+ return x.RepositoryId
+ }
+ return 0
+}
+
+func (x *MarkUnverifiedRequest) GetVirtualStorage() string {
+ if x, ok := x.GetSelector().(*MarkUnverifiedRequest_VirtualStorage); ok {
+ return x.VirtualStorage
+ }
+ return ""
+}
+
+func (x *MarkUnverifiedRequest) GetStorage() *MarkUnverifiedRequest_Storage {
+ if x, ok := x.GetSelector().(*MarkUnverifiedRequest_Storage_); ok {
+ return x.Storage
+ }
+ return nil
+}
+
+type isMarkUnverifiedRequest_Selector interface {
+ isMarkUnverifiedRequest_Selector()
+}
+
+type MarkUnverifiedRequest_RepositoryId struct {
+ // repository_id is the id of a repository to mark all replicas for unverified.
+ RepositoryId int64 `protobuf:"varint,1,opt,name=repository_id,json=repositoryId,proto3,oneof"`
+}
+
+type MarkUnverifiedRequest_VirtualStorage struct {
+ // virtual_storage is the name of virtual storage which will have all of its replicas
+ // marked unverified.
+ VirtualStorage string `protobuf:"bytes,2,opt,name=virtual_storage,json=virtualStorage,proto3,oneof"`
+}
+
+type MarkUnverifiedRequest_Storage_ struct {
+ // storage specifies a single storage. The replicas on the storage marked unverified.
+ Storage *MarkUnverifiedRequest_Storage `protobuf:"bytes,3,opt,name=storage,proto3,oneof"`
+}
+
+func (*MarkUnverifiedRequest_RepositoryId) isMarkUnverifiedRequest_Selector() {}
+
+func (*MarkUnverifiedRequest_VirtualStorage) isMarkUnverifiedRequest_Selector() {}
+
+func (*MarkUnverifiedRequest_Storage_) isMarkUnverifiedRequest_Selector() {}
+
+// MarkUnverifiedResponse returns the number of replicas marked unverified.
+type MarkUnverifiedResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // replicas_marked indicates the number of replicas that were marked unverified.
+ ReplicasMarked int64 `protobuf:"varint,1,opt,name=replicas_marked,json=replicasMarked,proto3" json:"replicas_marked,omitempty"`
+}
+
+func (x *MarkUnverifiedResponse) Reset() {
+ *x = MarkUnverifiedResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_praefect_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *MarkUnverifiedResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MarkUnverifiedResponse) ProtoMessage() {}
+
+func (x *MarkUnverifiedResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_praefect_proto_msgTypes[1]
+ 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 MarkUnverifiedResponse.ProtoReflect.Descriptor instead.
+func (*MarkUnverifiedResponse) Descriptor() ([]byte, []int) {
+ return file_praefect_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *MarkUnverifiedResponse) GetReplicasMarked() int64 {
+ if x != nil {
+ return x.ReplicasMarked
+ }
+ return 0
+}
+
// GetRepositoryMetadataRequest specifies the repository to retrieve metadata for.
type GetRepositoryMetadataRequest struct {
state protoimpl.MessageState
@@ -36,7 +186,7 @@ type GetRepositoryMetadataRequest struct {
func (x *GetRepositoryMetadataRequest) Reset() {
*x = GetRepositoryMetadataRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[0]
+ mi := &file_praefect_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -49,7 +199,7 @@ func (x *GetRepositoryMetadataRequest) String() string {
func (*GetRepositoryMetadataRequest) ProtoMessage() {}
func (x *GetRepositoryMetadataRequest) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[0]
+ mi := &file_praefect_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -62,7 +212,7 @@ func (x *GetRepositoryMetadataRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetRepositoryMetadataRequest.ProtoReflect.Descriptor instead.
func (*GetRepositoryMetadataRequest) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{0}
+ return file_praefect_proto_rawDescGZIP(), []int{2}
}
func (m *GetRepositoryMetadataRequest) GetQuery() isGetRepositoryMetadataRequest_Query {
@@ -129,7 +279,7 @@ type GetRepositoryMetadataResponse struct {
func (x *GetRepositoryMetadataResponse) Reset() {
*x = GetRepositoryMetadataResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[1]
+ mi := &file_praefect_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -142,7 +292,7 @@ func (x *GetRepositoryMetadataResponse) String() string {
func (*GetRepositoryMetadataResponse) ProtoMessage() {}
func (x *GetRepositoryMetadataResponse) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[1]
+ mi := &file_praefect_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -155,7 +305,7 @@ func (x *GetRepositoryMetadataResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetRepositoryMetadataResponse.ProtoReflect.Descriptor instead.
func (*GetRepositoryMetadataResponse) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{1}
+ return file_praefect_proto_rawDescGZIP(), []int{3}
}
func (x *GetRepositoryMetadataResponse) GetRepositoryId() int64 {
@@ -224,7 +374,7 @@ type SetReplicationFactorRequest struct {
func (x *SetReplicationFactorRequest) Reset() {
*x = SetReplicationFactorRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[2]
+ mi := &file_praefect_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -237,7 +387,7 @@ func (x *SetReplicationFactorRequest) String() string {
func (*SetReplicationFactorRequest) ProtoMessage() {}
func (x *SetReplicationFactorRequest) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[2]
+ mi := &file_praefect_proto_msgTypes[4]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -250,7 +400,7 @@ func (x *SetReplicationFactorRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use SetReplicationFactorRequest.ProtoReflect.Descriptor instead.
func (*SetReplicationFactorRequest) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{2}
+ return file_praefect_proto_rawDescGZIP(), []int{4}
}
func (x *SetReplicationFactorRequest) GetVirtualStorage() string {
@@ -287,7 +437,7 @@ type SetReplicationFactorResponse struct {
func (x *SetReplicationFactorResponse) Reset() {
*x = SetReplicationFactorResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[3]
+ mi := &file_praefect_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -300,7 +450,7 @@ func (x *SetReplicationFactorResponse) String() string {
func (*SetReplicationFactorResponse) ProtoMessage() {}
func (x *SetReplicationFactorResponse) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[3]
+ mi := &file_praefect_proto_msgTypes[5]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -313,7 +463,7 @@ func (x *SetReplicationFactorResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use SetReplicationFactorResponse.ProtoReflect.Descriptor instead.
func (*SetReplicationFactorResponse) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{3}
+ return file_praefect_proto_rawDescGZIP(), []int{5}
}
func (x *SetReplicationFactorResponse) GetStorages() []string {
@@ -336,7 +486,7 @@ type SetAuthoritativeStorageRequest struct {
func (x *SetAuthoritativeStorageRequest) Reset() {
*x = SetAuthoritativeStorageRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[4]
+ mi := &file_praefect_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -349,7 +499,7 @@ func (x *SetAuthoritativeStorageRequest) String() string {
func (*SetAuthoritativeStorageRequest) ProtoMessage() {}
func (x *SetAuthoritativeStorageRequest) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[4]
+ mi := &file_praefect_proto_msgTypes[6]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -362,7 +512,7 @@ func (x *SetAuthoritativeStorageRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use SetAuthoritativeStorageRequest.ProtoReflect.Descriptor instead.
func (*SetAuthoritativeStorageRequest) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{4}
+ return file_praefect_proto_rawDescGZIP(), []int{6}
}
func (x *SetAuthoritativeStorageRequest) GetVirtualStorage() string {
@@ -395,7 +545,7 @@ type SetAuthoritativeStorageResponse struct {
func (x *SetAuthoritativeStorageResponse) Reset() {
*x = SetAuthoritativeStorageResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[5]
+ mi := &file_praefect_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -408,7 +558,7 @@ func (x *SetAuthoritativeStorageResponse) String() string {
func (*SetAuthoritativeStorageResponse) ProtoMessage() {}
func (x *SetAuthoritativeStorageResponse) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[5]
+ mi := &file_praefect_proto_msgTypes[7]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -421,7 +571,7 @@ func (x *SetAuthoritativeStorageResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use SetAuthoritativeStorageResponse.ProtoReflect.Descriptor instead.
func (*SetAuthoritativeStorageResponse) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{5}
+ return file_praefect_proto_rawDescGZIP(), []int{7}
}
type DatalossCheckRequest struct {
@@ -438,7 +588,7 @@ type DatalossCheckRequest struct {
func (x *DatalossCheckRequest) Reset() {
*x = DatalossCheckRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[6]
+ mi := &file_praefect_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -451,7 +601,7 @@ func (x *DatalossCheckRequest) String() string {
func (*DatalossCheckRequest) ProtoMessage() {}
func (x *DatalossCheckRequest) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[6]
+ mi := &file_praefect_proto_msgTypes[8]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -464,7 +614,7 @@ func (x *DatalossCheckRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use DatalossCheckRequest.ProtoReflect.Descriptor instead.
func (*DatalossCheckRequest) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{6}
+ return file_praefect_proto_rawDescGZIP(), []int{8}
}
func (x *DatalossCheckRequest) GetVirtualStorage() string {
@@ -493,7 +643,7 @@ type DatalossCheckResponse struct {
func (x *DatalossCheckResponse) Reset() {
*x = DatalossCheckResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[7]
+ mi := &file_praefect_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -506,7 +656,7 @@ func (x *DatalossCheckResponse) String() string {
func (*DatalossCheckResponse) ProtoMessage() {}
func (x *DatalossCheckResponse) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[7]
+ mi := &file_praefect_proto_msgTypes[9]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -519,7 +669,7 @@ func (x *DatalossCheckResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use DatalossCheckResponse.ProtoReflect.Descriptor instead.
func (*DatalossCheckResponse) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{7}
+ return file_praefect_proto_rawDescGZIP(), []int{9}
}
func (x *DatalossCheckResponse) GetRepositories() []*DatalossCheckResponse_Repository {
@@ -540,7 +690,7 @@ type RepositoryReplicasRequest struct {
func (x *RepositoryReplicasRequest) Reset() {
*x = RepositoryReplicasRequest{}
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)
}
@@ -553,7 +703,7 @@ func (x *RepositoryReplicasRequest) String() string {
func (*RepositoryReplicasRequest) ProtoMessage() {}
func (x *RepositoryReplicasRequest) 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 {
@@ -566,7 +716,7 @@ func (x *RepositoryReplicasRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use RepositoryReplicasRequest.ProtoReflect.Descriptor instead.
func (*RepositoryReplicasRequest) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{8}
+ return file_praefect_proto_rawDescGZIP(), []int{10}
}
func (x *RepositoryReplicasRequest) GetRepository() *Repository {
@@ -588,7 +738,7 @@ type RepositoryReplicasResponse struct {
func (x *RepositoryReplicasResponse) Reset() {
*x = RepositoryReplicasResponse{}
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)
}
@@ -601,7 +751,7 @@ func (x *RepositoryReplicasResponse) String() string {
func (*RepositoryReplicasResponse) ProtoMessage() {}
func (x *RepositoryReplicasResponse) 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 {
@@ -614,7 +764,7 @@ func (x *RepositoryReplicasResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use RepositoryReplicasResponse.ProtoReflect.Descriptor instead.
func (*RepositoryReplicasResponse) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{9}
+ return file_praefect_proto_rawDescGZIP(), []int{11}
}
func (x *RepositoryReplicasResponse) GetPrimary() *RepositoryReplicasResponse_RepositoryDetails {
@@ -631,6 +781,64 @@ func (x *RepositoryReplicasResponse) GetReplicas() []*RepositoryReplicasResponse
return nil
}
+// Storage identifies a single storage in a virtual storage.
+type MarkUnverifiedRequest_Storage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // virtual_storage is the virtual storage the storage is part of.
+ VirtualStorage string `protobuf:"bytes,1,opt,name=virtual_storage,json=virtualStorage,proto3" json:"virtual_storage,omitempty"`
+ // storage is the name of the storage.
+ Storage string `protobuf:"bytes,2,opt,name=storage,proto3" json:"storage,omitempty"`
+}
+
+func (x *MarkUnverifiedRequest_Storage) Reset() {
+ *x = MarkUnverifiedRequest_Storage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_praefect_proto_msgTypes[12]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *MarkUnverifiedRequest_Storage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MarkUnverifiedRequest_Storage) ProtoMessage() {}
+
+func (x *MarkUnverifiedRequest_Storage) ProtoReflect() protoreflect.Message {
+ mi := &file_praefect_proto_msgTypes[12]
+ 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 MarkUnverifiedRequest_Storage.ProtoReflect.Descriptor instead.
+func (*MarkUnverifiedRequest_Storage) Descriptor() ([]byte, []int) {
+ return file_praefect_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *MarkUnverifiedRequest_Storage) GetVirtualStorage() string {
+ if x != nil {
+ return x.VirtualStorage
+ }
+ return ""
+}
+
+func (x *MarkUnverifiedRequest_Storage) GetStorage() string {
+ if x != nil {
+ return x.Storage
+ }
+ return ""
+}
+
type GetRepositoryMetadataRequest_Path struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -645,7 +853,7 @@ type GetRepositoryMetadataRequest_Path struct {
func (x *GetRepositoryMetadataRequest_Path) Reset() {
*x = GetRepositoryMetadataRequest_Path{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[10]
+ mi := &file_praefect_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -658,7 +866,7 @@ func (x *GetRepositoryMetadataRequest_Path) String() string {
func (*GetRepositoryMetadataRequest_Path) ProtoMessage() {}
func (x *GetRepositoryMetadataRequest_Path) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[10]
+ mi := &file_praefect_proto_msgTypes[13]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -671,7 +879,7 @@ func (x *GetRepositoryMetadataRequest_Path) ProtoReflect() protoreflect.Message
// Deprecated: Use GetRepositoryMetadataRequest_Path.ProtoReflect.Descriptor instead.
func (*GetRepositoryMetadataRequest_Path) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{0, 0}
+ return file_praefect_proto_rawDescGZIP(), []int{2, 0}
}
func (x *GetRepositoryMetadataRequest_Path) GetVirtualStorage() string {
@@ -711,7 +919,7 @@ type GetRepositoryMetadataResponse_Replica struct {
func (x *GetRepositoryMetadataResponse_Replica) Reset() {
*x = GetRepositoryMetadataResponse_Replica{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[11]
+ mi := &file_praefect_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -724,7 +932,7 @@ func (x *GetRepositoryMetadataResponse_Replica) String() string {
func (*GetRepositoryMetadataResponse_Replica) ProtoMessage() {}
func (x *GetRepositoryMetadataResponse_Replica) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[11]
+ mi := &file_praefect_proto_msgTypes[14]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -737,7 +945,7 @@ func (x *GetRepositoryMetadataResponse_Replica) ProtoReflect() protoreflect.Mess
// Deprecated: Use GetRepositoryMetadataResponse_Replica.ProtoReflect.Descriptor instead.
func (*GetRepositoryMetadataResponse_Replica) Descriptor() ([]byte, []int) {
- return file_praefect_proto_rawDescGZIP(), []int{1, 0}
+ return file_praefect_proto_rawDescGZIP(), []int{3, 0}
}
func (x *GetRepositoryMetadataResponse_Replica) GetStorage() string {
@@ -800,7 +1008,7 @@ type DatalossCheckResponse_Repository struct {
func (x *DatalossCheckResponse_Repository) Reset() {
*x = DatalossCheckResponse_Repository{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[12]
+ mi := &file_praefect_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -813,7 +1021,7 @@ func (x *DatalossCheckResponse_Repository) String() string {
func (*DatalossCheckResponse_Repository) ProtoMessage() {}
func (x *DatalossCheckResponse_Repository) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[12]
+ mi := &file_praefect_proto_msgTypes[15]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -826,7 +1034,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{7, 0}
+ return file_praefect_proto_rawDescGZIP(), []int{9, 0}
}
func (x *DatalossCheckResponse_Repository) GetRelativePath() string {
@@ -877,7 +1085,7 @@ type DatalossCheckResponse_Repository_Storage struct {
func (x *DatalossCheckResponse_Repository_Storage) Reset() {
*x = DatalossCheckResponse_Repository_Storage{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[13]
+ mi := &file_praefect_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -890,7 +1098,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[13]
+ mi := &file_praefect_proto_msgTypes[16]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -903,7 +1111,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{7, 0, 0}
+ return file_praefect_proto_rawDescGZIP(), []int{9, 0, 0}
}
func (x *DatalossCheckResponse_Repository_Storage) GetName() string {
@@ -953,7 +1161,7 @@ type RepositoryReplicasResponse_RepositoryDetails struct {
func (x *RepositoryReplicasResponse_RepositoryDetails) Reset() {
*x = RepositoryReplicasResponse_RepositoryDetails{}
if protoimpl.UnsafeEnabled {
- mi := &file_praefect_proto_msgTypes[14]
+ mi := &file_praefect_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -966,7 +1174,7 @@ func (x *RepositoryReplicasResponse_RepositoryDetails) String() string {
func (*RepositoryReplicasResponse_RepositoryDetails) ProtoMessage() {}
func (x *RepositoryReplicasResponse_RepositoryDetails) ProtoReflect() protoreflect.Message {
- mi := &file_praefect_proto_msgTypes[14]
+ mi := &file_praefect_proto_msgTypes[17]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -979,7 +1187,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{9, 0}
+ return file_praefect_proto_rawDescGZIP(), []int{11, 0}
}
func (x *RepositoryReplicasResponse_RepositoryDetails) GetRepository() *Repository {
@@ -1004,176 +1212,202 @@ var file_praefect_proto_rawDesc = []byte{
0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x01, 0x0a, 0x1c, 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, 0x12, 0x25, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
- 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0c, 0x72,
- 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x70,
- 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 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, 0x2e,
- 0x50, 0x61, 0x74, 0x68, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x54, 0x0a, 0x04,
- 0x50, 0x61, 0x74, 0x68, 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, 0x23, 0x0a,
- 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61,
- 0x74, 0x68, 0x42, 0x07, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x98, 0x04, 0x0a, 0x1d,
- 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, 0x12, 0x23, 0x0a,
+ 0x6f, 0x74, 0x6f, 0x22, 0x86, 0x02, 0x0a, 0x15, 0x4d, 0x61, 0x72, 0x6b, 0x55, 0x6e, 0x76, 0x65,
+ 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a,
0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79,
- 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x74,
- 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x69, 0x72,
- 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72,
- 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01,
- 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68,
- 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x70, 0x61, 0x74, 0x68,
- 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x50,
- 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x05,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1e, 0x0a,
- 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,
- 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a,
- 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,
- 0x2d, 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, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x08,
- 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x1a, 0xdb, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x70,
- 0x6c, 0x69, 0x63, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x1a,
- 0x0a, 0x08, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
- 0x52, 0x08, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65,
- 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65,
- 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x61, 0x6c,
- 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3b, 0x0a, 0x0b, 0x76, 0x65, 0x72,
- 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
- 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x69,
- 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x22, 0x9a, 0x01, 0x0a, 0x1b, 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, 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,
+ 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
+ 0x72, 0x79, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,
0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12,
- 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65,
- 0x50, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05,
- 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63,
- 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x0a, 0x1c, 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, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x73, 0x18,
- 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x73, 0x22,
- 0xa3, 0x01, 0x0a, 0x1e, 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,
+ 0x41, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x25, 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, 0x2e,
+ 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x1a, 0x4c, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 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, 0x18, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x41, 0x0a, 0x16,
+ 0x4d, 0x61, 0x72, 0x6b, 0x55, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63,
+ 0x61, 0x73, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+ 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x22,
+ 0xe5, 0x01, 0x0a, 0x1c, 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,
+ 0x12, 0x25, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 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, 0x2e, 0x50, 0x61, 0x74, 0x68,
+ 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x54, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68,
+ 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, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c,
+ 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x42, 0x07,
+ 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x98, 0x04, 0x0a, 0x1d, 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, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x70,
+ 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x27,
+ 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c,
+ 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x74,
+ 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
+ 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x0a, 0x0c,
+ 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x50, 0x61, 0x74, 0x68, 0x12,
+ 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x08, 0x72, 0x65, 0x70,
+ 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 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, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c,
+ 0x69, 0x63, 0x61, 0x73, 0x1a, 0xdb, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+ 0x12, 0x18, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x73,
+ 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x73,
+ 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68,
+ 0x79, 0x18, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72,
+ 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3b, 0x0a, 0x0b, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65,
+ 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
+ 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64,
+ 0x41, 0x74, 0x22, 0x9a, 0x01, 0x0a, 0x1b, 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, 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, 0x23, 0x0a, 0x0d, 0x72,
0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01,
0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68,
- 0x12, 0x33, 0x0a, 0x15, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76,
- 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x14, 0x61, 0x75, 0x74, 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, 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, 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, 0xfb, 0x03, 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,
+ 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x72, 0x65,
+ 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22,
+ 0x3a, 0x0a, 0x1c, 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,
+ 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+ 0x09, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x1e,
+ 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, 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, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x74,
+ 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
+ 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x15,
+ 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x61, 0x75, 0x74,
+ 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,
+ 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, 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, 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, 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, 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, 0x34, 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,
+ 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, 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, 0x34,
+ 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 (
@@ -1188,51 +1422,57 @@ func file_praefect_proto_rawDescGZIP() []byte {
return file_praefect_proto_rawDescData
}
-var file_praefect_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
+var file_praefect_proto_msgTypes = make([]protoimpl.MessageInfo, 18)
var file_praefect_proto_goTypes = []interface{}{
- (*GetRepositoryMetadataRequest)(nil), // 0: gitaly.GetRepositoryMetadataRequest
- (*GetRepositoryMetadataResponse)(nil), // 1: gitaly.GetRepositoryMetadataResponse
- (*SetReplicationFactorRequest)(nil), // 2: gitaly.SetReplicationFactorRequest
- (*SetReplicationFactorResponse)(nil), // 3: gitaly.SetReplicationFactorResponse
- (*SetAuthoritativeStorageRequest)(nil), // 4: gitaly.SetAuthoritativeStorageRequest
- (*SetAuthoritativeStorageResponse)(nil), // 5: gitaly.SetAuthoritativeStorageResponse
- (*DatalossCheckRequest)(nil), // 6: gitaly.DatalossCheckRequest
- (*DatalossCheckResponse)(nil), // 7: gitaly.DatalossCheckResponse
- (*RepositoryReplicasRequest)(nil), // 8: gitaly.RepositoryReplicasRequest
- (*RepositoryReplicasResponse)(nil), // 9: gitaly.RepositoryReplicasResponse
- (*GetRepositoryMetadataRequest_Path)(nil), // 10: gitaly.GetRepositoryMetadataRequest.Path
- (*GetRepositoryMetadataResponse_Replica)(nil), // 11: gitaly.GetRepositoryMetadataResponse.Replica
- (*DatalossCheckResponse_Repository)(nil), // 12: gitaly.DatalossCheckResponse.Repository
- (*DatalossCheckResponse_Repository_Storage)(nil), // 13: gitaly.DatalossCheckResponse.Repository.Storage
- (*RepositoryReplicasResponse_RepositoryDetails)(nil), // 14: gitaly.RepositoryReplicasResponse.RepositoryDetails
- (*Repository)(nil), // 15: gitaly.Repository
- (*timestamppb.Timestamp)(nil), // 16: google.protobuf.Timestamp
+ (*MarkUnverifiedRequest)(nil), // 0: gitaly.MarkUnverifiedRequest
+ (*MarkUnverifiedResponse)(nil), // 1: gitaly.MarkUnverifiedResponse
+ (*GetRepositoryMetadataRequest)(nil), // 2: gitaly.GetRepositoryMetadataRequest
+ (*GetRepositoryMetadataResponse)(nil), // 3: gitaly.GetRepositoryMetadataResponse
+ (*SetReplicationFactorRequest)(nil), // 4: gitaly.SetReplicationFactorRequest
+ (*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
}
var file_praefect_proto_depIdxs = []int32{
- 10, // 0: gitaly.GetRepositoryMetadataRequest.path:type_name -> gitaly.GetRepositoryMetadataRequest.Path
- 11, // 1: gitaly.GetRepositoryMetadataResponse.replicas:type_name -> gitaly.GetRepositoryMetadataResponse.Replica
- 12, // 2: gitaly.DatalossCheckResponse.repositories:type_name -> gitaly.DatalossCheckResponse.Repository
- 15, // 3: gitaly.RepositoryReplicasRequest.repository:type_name -> gitaly.Repository
- 14, // 4: gitaly.RepositoryReplicasResponse.primary:type_name -> gitaly.RepositoryReplicasResponse.RepositoryDetails
- 14, // 5: gitaly.RepositoryReplicasResponse.replicas:type_name -> gitaly.RepositoryReplicasResponse.RepositoryDetails
- 16, // 6: gitaly.GetRepositoryMetadataResponse.Replica.verified_at:type_name -> google.protobuf.Timestamp
- 13, // 7: gitaly.DatalossCheckResponse.Repository.storages:type_name -> gitaly.DatalossCheckResponse.Repository.Storage
- 15, // 8: gitaly.RepositoryReplicasResponse.RepositoryDetails.repository:type_name -> gitaly.Repository
- 8, // 9: gitaly.PraefectInfoService.RepositoryReplicas:input_type -> gitaly.RepositoryReplicasRequest
- 6, // 10: gitaly.PraefectInfoService.DatalossCheck:input_type -> gitaly.DatalossCheckRequest
- 4, // 11: gitaly.PraefectInfoService.SetAuthoritativeStorage:input_type -> gitaly.SetAuthoritativeStorageRequest
- 2, // 12: gitaly.PraefectInfoService.SetReplicationFactor:input_type -> gitaly.SetReplicationFactorRequest
- 0, // 13: gitaly.PraefectInfoService.GetRepositoryMetadata:input_type -> gitaly.GetRepositoryMetadataRequest
- 9, // 14: gitaly.PraefectInfoService.RepositoryReplicas:output_type -> gitaly.RepositoryReplicasResponse
- 7, // 15: gitaly.PraefectInfoService.DatalossCheck:output_type -> gitaly.DatalossCheckResponse
- 5, // 16: gitaly.PraefectInfoService.SetAuthoritativeStorage:output_type -> gitaly.SetAuthoritativeStorageResponse
- 3, // 17: gitaly.PraefectInfoService.SetReplicationFactor:output_type -> gitaly.SetReplicationFactorResponse
- 1, // 18: gitaly.PraefectInfoService.GetRepositoryMetadata:output_type -> gitaly.GetRepositoryMetadataResponse
- 14, // [14:19] is the sub-list for method output_type
- 9, // [9:14] is the sub-list for method input_type
- 9, // [9:9] is the sub-list for extension type_name
- 9, // [9:9] is the sub-list for extension extendee
- 0, // [0:9] is the sub-list for field type_name
+ 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
}
func init() { file_praefect_proto_init() }
@@ -1244,7 +1484,7 @@ func file_praefect_proto_init() {
file_shared_proto_init()
if !protoimpl.UnsafeEnabled {
file_praefect_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GetRepositoryMetadataRequest); i {
+ switch v := v.(*MarkUnverifiedRequest); i {
case 0:
return &v.state
case 1:
@@ -1256,7 +1496,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GetRepositoryMetadataResponse); i {
+ switch v := v.(*MarkUnverifiedResponse); i {
case 0:
return &v.state
case 1:
@@ -1268,7 +1508,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*SetReplicationFactorRequest); i {
+ switch v := v.(*GetRepositoryMetadataRequest); i {
case 0:
return &v.state
case 1:
@@ -1280,7 +1520,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*SetReplicationFactorResponse); i {
+ switch v := v.(*GetRepositoryMetadataResponse); i {
case 0:
return &v.state
case 1:
@@ -1292,7 +1532,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*SetAuthoritativeStorageRequest); i {
+ switch v := v.(*SetReplicationFactorRequest); i {
case 0:
return &v.state
case 1:
@@ -1304,7 +1544,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*SetAuthoritativeStorageResponse); i {
+ switch v := v.(*SetReplicationFactorResponse); i {
case 0:
return &v.state
case 1:
@@ -1316,7 +1556,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*DatalossCheckRequest); i {
+ switch v := v.(*SetAuthoritativeStorageRequest); i {
case 0:
return &v.state
case 1:
@@ -1328,7 +1568,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*DatalossCheckResponse); i {
+ switch v := v.(*SetAuthoritativeStorageResponse); i {
case 0:
return &v.state
case 1:
@@ -1340,7 +1580,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*RepositoryReplicasRequest); i {
+ switch v := v.(*DatalossCheckRequest); i {
case 0:
return &v.state
case 1:
@@ -1352,7 +1592,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*RepositoryReplicasResponse); i {
+ switch v := v.(*DatalossCheckResponse); i {
case 0:
return &v.state
case 1:
@@ -1364,7 +1604,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GetRepositoryMetadataRequest_Path); i {
+ switch v := v.(*RepositoryReplicasRequest); i {
case 0:
return &v.state
case 1:
@@ -1376,7 +1616,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*GetRepositoryMetadataResponse_Replica); i {
+ switch v := v.(*RepositoryReplicasResponse); i {
case 0:
return &v.state
case 1:
@@ -1388,7 +1628,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*DatalossCheckResponse_Repository); i {
+ switch v := v.(*MarkUnverifiedRequest_Storage); i {
case 0:
return &v.state
case 1:
@@ -1400,7 +1640,7 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*DatalossCheckResponse_Repository_Storage); i {
+ switch v := v.(*GetRepositoryMetadataRequest_Path); i {
case 0:
return &v.state
case 1:
@@ -1412,6 +1652,42 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetRepositoryMetadataResponse_Replica); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_praefect_proto_msgTypes[15].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[16].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[17].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RepositoryReplicasResponse_RepositoryDetails); i {
case 0:
return &v.state
@@ -1425,6 +1701,11 @@ func file_praefect_proto_init() {
}
}
file_praefect_proto_msgTypes[0].OneofWrappers = []interface{}{
+ (*MarkUnverifiedRequest_RepositoryId)(nil),
+ (*MarkUnverifiedRequest_VirtualStorage)(nil),
+ (*MarkUnverifiedRequest_Storage_)(nil),
+ }
+ file_praefect_proto_msgTypes[2].OneofWrappers = []interface{}{
(*GetRepositoryMetadataRequest_RepositoryId)(nil),
(*GetRepositoryMetadataRequest_Path_)(nil),
}
@@ -1434,7 +1715,7 @@ func file_praefect_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_praefect_proto_rawDesc,
NumEnums: 0,
- NumMessages: 15,
+ NumMessages: 18,
NumExtensions: 0,
NumServices: 1,
},
diff --git a/proto/go/gitalypb/praefect_grpc.pb.go b/proto/go/gitalypb/praefect_grpc.pb.go
index e16d18b83..b01e699f6 100644
--- a/proto/go/gitalypb/praefect_grpc.pb.go
+++ b/proto/go/gitalypb/praefect_grpc.pb.go
@@ -25,6 +25,9 @@ type PraefectInfoServiceClient interface {
// 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.
SetAuthoritativeStorage(ctx context.Context, in *SetAuthoritativeStorageRequest, opts ...grpc.CallOption) (*SetAuthoritativeStorageResponse, error)
+ // MarkUnverified marks replicas as unverified. This will trigger verification as Praefect's metadata
+ // verifier prioritizes unverified replicas.
+ MarkUnverified(ctx context.Context, in *MarkUnverifiedRequest, opts ...grpc.CallOption) (*MarkUnverifiedResponse, error)
// SetReplicationFactor assigns or unassigns host nodes from the repository to meet the desired replication factor.
// SetReplicationFactor returns an error when trying to set a replication factor that exceeds the storage node count
// in the virtual storage. An error is also returned when trying to set a replication factor below one. The primary node
@@ -73,6 +76,15 @@ func (c *praefectInfoServiceClient) SetAuthoritativeStorage(ctx context.Context,
return out, nil
}
+func (c *praefectInfoServiceClient) MarkUnverified(ctx context.Context, in *MarkUnverifiedRequest, opts ...grpc.CallOption) (*MarkUnverifiedResponse, error) {
+ out := new(MarkUnverifiedResponse)
+ err := c.cc.Invoke(ctx, "/gitaly.PraefectInfoService/MarkUnverified", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
func (c *praefectInfoServiceClient) SetReplicationFactor(ctx context.Context, in *SetReplicationFactorRequest, opts ...grpc.CallOption) (*SetReplicationFactorResponse, error) {
out := new(SetReplicationFactorResponse)
err := c.cc.Invoke(ctx, "/gitaly.PraefectInfoService/SetReplicationFactor", in, out, opts...)
@@ -102,6 +114,9 @@ type PraefectInfoServiceServer interface {
// 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.
SetAuthoritativeStorage(context.Context, *SetAuthoritativeStorageRequest) (*SetAuthoritativeStorageResponse, error)
+ // MarkUnverified marks replicas as unverified. This will trigger verification as Praefect's metadata
+ // verifier prioritizes unverified replicas.
+ MarkUnverified(context.Context, *MarkUnverifiedRequest) (*MarkUnverifiedResponse, error)
// SetReplicationFactor assigns or unassigns host nodes from the repository to meet the desired replication factor.
// SetReplicationFactor returns an error when trying to set a replication factor that exceeds the storage node count
// in the virtual storage. An error is also returned when trying to set a replication factor below one. The primary node
@@ -129,6 +144,9 @@ func (UnimplementedPraefectInfoServiceServer) DatalossCheck(context.Context, *Da
func (UnimplementedPraefectInfoServiceServer) SetAuthoritativeStorage(context.Context, *SetAuthoritativeStorageRequest) (*SetAuthoritativeStorageResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method SetAuthoritativeStorage not implemented")
}
+func (UnimplementedPraefectInfoServiceServer) MarkUnverified(context.Context, *MarkUnverifiedRequest) (*MarkUnverifiedResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method MarkUnverified not implemented")
+}
func (UnimplementedPraefectInfoServiceServer) SetReplicationFactor(context.Context, *SetReplicationFactorRequest) (*SetReplicationFactorResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method SetReplicationFactor not implemented")
}
@@ -202,6 +220,24 @@ func _PraefectInfoService_SetAuthoritativeStorage_Handler(srv interface{}, ctx c
return interceptor(ctx, in, info, handler)
}
+func _PraefectInfoService_MarkUnverified_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(MarkUnverifiedRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(PraefectInfoServiceServer).MarkUnverified(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/gitaly.PraefectInfoService/MarkUnverified",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(PraefectInfoServiceServer).MarkUnverified(ctx, req.(*MarkUnverifiedRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
func _PraefectInfoService_SetReplicationFactor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SetReplicationFactorRequest)
if err := dec(in); err != nil {
@@ -258,6 +294,10 @@ var PraefectInfoService_ServiceDesc = grpc.ServiceDesc{
Handler: _PraefectInfoService_SetAuthoritativeStorage_Handler,
},
{
+ MethodName: "MarkUnverified",
+ Handler: _PraefectInfoService_MarkUnverified_Handler,
+ },
+ {
MethodName: "SetReplicationFactor",
Handler: _PraefectInfoService_SetReplicationFactor_Handler,
},
diff --git a/proto/praefect.proto b/proto/praefect.proto
index c26a22c20..2e913b99f 100644
--- a/proto/praefect.proto
+++ b/proto/praefect.proto
@@ -21,6 +21,10 @@ service PraefectInfoService {
// latest and overwrite any other version on the virtual storage.
rpc SetAuthoritativeStorage(SetAuthoritativeStorageRequest) returns (SetAuthoritativeStorageResponse);
+ // MarkUnverified marks replicas as unverified. This will trigger verification as Praefect's metadata
+ // verifier prioritizes unverified replicas.
+ rpc MarkUnverified(MarkUnverifiedRequest) returns (MarkUnverifiedResponse);
+
// SetReplicationFactor assigns or unassigns host nodes from the repository to meet the desired replication factor.
// SetReplicationFactor returns an error when trying to set a replication factor that exceeds the storage node count
// in the virtual storage. An error is also returned when trying to set a replication factor below one. The primary node
@@ -34,6 +38,34 @@ service PraefectInfoService {
rpc GetRepositoryMetadata(GetRepositoryMetadataRequest) returns (GetRepositoryMetadataResponse);
}
+// MarkUnverifiedRequest specifies the replicas which to mark unverified.
+message MarkUnverifiedRequest {
+ // Storage identifies a single storage in a virtual storage.
+ message Storage {
+ // virtual_storage is the virtual storage the storage is part of.
+ string virtual_storage = 1;
+ // storage is the name of the storage.
+ string storage = 2;
+ }
+
+ // selector specifies the replicas which to mark unverified.
+ oneof selector {
+ // repository_id is the id of a repository to mark all replicas for unverified.
+ int64 repository_id = 1;
+ // virtual_storage is the name of virtual storage which will have all of its replicas
+ // marked unverified.
+ string virtual_storage = 2;
+ // storage specifies a single storage. The replicas on the storage marked unverified.
+ Storage storage = 3;
+ }
+}
+
+// MarkUnverifiedResponse returns the number of replicas marked unverified.
+message MarkUnverifiedResponse {
+ // replicas_marked indicates the number of replicas that were marked unverified.
+ int64 replicas_marked = 1;
+}
+
// GetRepositoryMetadataRequest specifies the repository to retrieve metadata for.
message GetRepositoryMetadataRequest {
message Path {
diff --git a/ruby/proto/gitaly/praefect_pb.rb b/ruby/proto/gitaly/praefect_pb.rb
index 918674133..143db977d 100644
--- a/ruby/proto/gitaly/praefect_pb.rb
+++ b/ruby/proto/gitaly/praefect_pb.rb
@@ -8,6 +8,20 @@ require 'google/protobuf'
Google::Protobuf::DescriptorPool.generated_pool.build do
add_file("praefect.proto", :syntax => :proto3) do
+ add_message "gitaly.MarkUnverifiedRequest" do
+ oneof :selector do
+ optional :repository_id, :int64, 1
+ optional :virtual_storage, :string, 2
+ optional :storage, :message, 3, "gitaly.MarkUnverifiedRequest.Storage"
+ end
+ end
+ add_message "gitaly.MarkUnverifiedRequest.Storage" do
+ optional :virtual_storage, :string, 1
+ optional :storage, :string, 2
+ end
+ add_message "gitaly.MarkUnverifiedResponse" do
+ optional :replicas_marked, :int64, 1
+ end
add_message "gitaly.GetRepositoryMetadataRequest" do
oneof :query do
optional :repository_id, :int64, 1
@@ -85,6 +99,9 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
end
module Gitaly
+ MarkUnverifiedRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.MarkUnverifiedRequest").msgclass
+ MarkUnverifiedRequest::Storage = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.MarkUnverifiedRequest.Storage").msgclass
+ MarkUnverifiedResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.MarkUnverifiedResponse").msgclass
GetRepositoryMetadataRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.GetRepositoryMetadataRequest").msgclass
GetRepositoryMetadataRequest::Path = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.GetRepositoryMetadataRequest.Path").msgclass
GetRepositoryMetadataResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.GetRepositoryMetadataResponse").msgclass
diff --git a/ruby/proto/gitaly/praefect_services_pb.rb b/ruby/proto/gitaly/praefect_services_pb.rb
index 6f5629392..319feaaee 100644
--- a/ruby/proto/gitaly/praefect_services_pb.rb
+++ b/ruby/proto/gitaly/praefect_services_pb.rb
@@ -21,6 +21,9 @@ module Gitaly
# 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.
rpc :SetAuthoritativeStorage, ::Gitaly::SetAuthoritativeStorageRequest, ::Gitaly::SetAuthoritativeStorageResponse
+ # MarkUnverified marks replicas as unverified. This will trigger verification as Praefect's metadata
+ # verifier prioritizes unverified replicas.
+ rpc :MarkUnverified, ::Gitaly::MarkUnverifiedRequest, ::Gitaly::MarkUnverifiedResponse
# SetReplicationFactor assigns or unassigns host nodes from the repository to meet the desired replication factor.
# SetReplicationFactor returns an error when trying to set a replication factor that exceeds the storage node count
# in the virtual storage. An error is also returned when trying to set a replication factor below one. The primary node