From cacfe6c3d63e3dac4f87a7baabac4c2c93761e23 Mon Sep 17 00:00:00 2001 From: huanghaoyuanhhy Date: Tue, 24 Dec 2024 18:11:47 +0800 Subject: [PATCH] feat: support Milvus 2.5 function feature by bypassing SDK Milvus 2.5 introduced the function feature, which is not well-supported by the older SDK versions. The new SDK hides many internal IDs used by the backup tool. To address this, the backup tool now interacts with Milvus directly via gRPC, bypassing the SDK. Signed-off-by: huanghaoyuanhhy --- .github/workflows/main.yaml | 10 +- .github/workflows/nightly.yaml | 4 +- .github/workflows/perf.yaml | 2 +- .github/workflows/release.yaml | 4 +- Dockerfile | 3 +- Makefile | 12 +- cmd/backup_yaml.go | 3 +- cmd/check.go | 3 +- cmd/create.go | 3 +- cmd/delete.go | 3 +- cmd/get.go | 3 +- cmd/list.go | 3 +- cmd/restore.go | 3 +- cmd/root.go | 2 +- cmd/server.go | 3 +- core/backup_context.go | 205 +- core/backup_context_test.go | 121 +- core/backup_impl_create_backup.go | 363 +- core/backup_impl_restore_backup.go | 619 +-- core/backup_meta_test.go | 22 +- core/backup_server.go | 32 +- core/backup_server_test.go | 3 +- core/client/cfg.go | 75 + core/client/grpc.go | 530 +++ core/client/restful.go | 145 + core/{ => meta}/backup_meta.go | 14 +- core/{ => meta}/backup_meta_manager.go | 50 +- core/milvus_sdk_test.go | 360 -- core/milvus_sdk_wrapper.go | 209 - core/milvus_storage_test.go | 136 - core/paramtable/base_table_test.go | 1 + core/pbconv/bak_to_milvus.go | 22 + core/pbconv/bak_to_milvus_test.go | 24 + core/proto/backup.proto | 36 +- core/proto/backuppb/backup.pb.go | 5985 ++++++++++++++++-------- core/restore/collection.go | 695 +++ core/restore/collection_test.go | 1 + core/storage/chunk_manager.go | 4 +- core/storage/local_chunk_manager.go | 3 +- core/storage/mpath/path.go | 104 + core/storage/mpath/path_test.go | 85 + core/utils/backup_request_util.go | 1 + core/utils/convert_util.go | 1 + core/utils/version_util.go | 3 +- docs/docs.go | 155 +- docs/swagger.json | 150 +- docs/swagger.yaml | 101 +- go.mod | 192 +- go.sum | 1110 ++--- internal/common/workerpool.go | 3 +- internal/util/errorutil/util_test.go | 3 +- internal/util/grpcclient/client.go | 5 +- main.go | 9 +- version/version.go | 7 + 54 files changed, 6929 insertions(+), 4716 deletions(-) create mode 100644 core/client/cfg.go create mode 100644 core/client/grpc.go create mode 100644 core/client/restful.go rename core/{ => meta}/backup_meta.go (97%) rename core/{ => meta}/backup_meta_manager.go (92%) delete mode 100644 core/milvus_sdk_test.go delete mode 100644 core/milvus_sdk_wrapper.go delete mode 100644 core/milvus_storage_test.go create mode 100644 core/pbconv/bak_to_milvus.go create mode 100644 core/pbconv/bak_to_milvus_test.go create mode 100644 core/restore/collection.go create mode 100644 core/restore/collection_test.go create mode 100644 core/storage/mpath/path.go create mode 100644 core/storage/mpath/path_test.go create mode 100644 version/version.go diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index b8c31b9..5cc250b 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -42,7 +42,7 @@ jobs: - uses: actions/setup-go@v3 with: - go-version: '1.18.0' + go-version: '1.23' cache: true - name: Build @@ -182,7 +182,7 @@ jobs: - uses: actions/setup-go@v3 with: - go-version: '1.18.0' + go-version: '1.23' cache: true - name: Build @@ -273,7 +273,7 @@ jobs: - uses: actions/setup-go@v3 with: - go-version: '1.18.0' + go-version: '1.23' cache: true - name: Build @@ -406,7 +406,7 @@ jobs: - uses: actions/setup-go@v3 with: - go-version: '1.18.0' + go-version: '1.23' cache: "true" - name: Creating kind cluster @@ -555,7 +555,7 @@ jobs: - uses: actions/setup-go@v3 with: - go-version: '1.18.0' + go-version: '1.23' cache: true - name: Build diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml index e8460c0..2f31c7e 100644 --- a/.github/workflows/nightly.yaml +++ b/.github/workflows/nightly.yaml @@ -26,7 +26,7 @@ jobs: - uses: actions/setup-go@v3 with: - go-version: '1.18.0' + go-version: '1.23' cache: true - name: Creating kind cluster @@ -147,7 +147,7 @@ jobs: - uses: actions/setup-go@v3 with: - go-version: '1.18.0' + go-version: '1.23' cache: true - name: Creating kind cluster diff --git a/.github/workflows/perf.yaml b/.github/workflows/perf.yaml index 5c7b660..4499ccb 100644 --- a/.github/workflows/perf.yaml +++ b/.github/workflows/perf.yaml @@ -29,7 +29,7 @@ jobs: - uses: actions/setup-go@v3 with: - go-version: '1.18.0' + go-version: '1.23' cache: true - name: Creating kind cluster diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index fbc5fcc..bb3a26a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -18,7 +18,7 @@ jobs: - run: git fetch --force --tags - uses: actions/setup-go@v5 with: - go-version: 1.18 + go-version: 1.23 cache: true - uses: docker/login-action@v3 with: @@ -46,7 +46,7 @@ jobs: - run: git fetch --force --tags - uses: actions/setup-go@v3 with: - go-version: 1.18 + go-version: 1.23 cache: true - name: Set up QEMU diff --git a/Dockerfile b/Dockerfile index a1ca91e..a6098ab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,4 @@ - -FROM golang:1.18 AS builder +FROM golang:1.23 AS builder ENV CGO_ENABLED=0 diff --git a/Makefile b/Makefile index 7087259..5ed2f1e 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,29 @@ # Variables BINARY_NAME=milvus-backup +PKG := github.com/zilliztech/milvus-backup VERSION=$(shell git describe --tags --always) COMMIT=$(shell git rev-parse --short HEAD) DATE=$(shell date -u '+%Y-%m-%dT%H:%M:%SZ') +LDFLAGS += -X "$(PKG)/version.Version=$(VERSION)" +LDFLAGS += -X "$(PKG)/version.Commit=$(COMMIT)" +LDFLAGS += -X "$(PKG)/version.Date=$(DATE)" + # Default target all: gen build # Build the binary build: @echo "Building binary..." - GO111MODULE=on CGO_ENABLED=0 go build -ldflags "-X main.version=$(VERSION) -X main.commit=$(COMMIT) -X main.date=$(DATE)" -o $(BINARY_NAME) + GO111MODULE=on CGO_ENABLED=0 go build -ldflags '$(LDFLAGS)' -o $(BINARY_NAME) gen: ./scripts/gen_swag.sh ./scripts/gen_proto.sh +fmt: + @echo Formatting code... + @goimports -w --local $(PKG) ./ + @echo Format code done + .PHONY: all build gen \ No newline at end of file diff --git a/cmd/backup_yaml.go b/cmd/backup_yaml.go index e63f7c5..d16055a 100644 --- a/cmd/backup_yaml.go +++ b/cmd/backup_yaml.go @@ -5,8 +5,9 @@ import ( "strings" "github.com/spf13/cobra" - "github.com/zilliztech/milvus-backup/core/paramtable" "gopkg.in/yaml.v3" + + "github.com/zilliztech/milvus-backup/core/paramtable" ) var configCmd = &cobra.Command{ diff --git a/cmd/check.go b/cmd/check.go index 6b31a0a..ec8b66a 100644 --- a/cmd/check.go +++ b/cmd/check.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/zilliztech/milvus-backup/core" "github.com/zilliztech/milvus-backup/core/paramtable" ) @@ -20,7 +21,7 @@ var checkCmd = &cobra.Command{ params.Init() context := context.Background() - backupContext := core.CreateBackupContext(context, params) + backupContext := core.CreateBackupContext(context, ¶ms) resp := backupContext.Check(context) fmt.Println(resp) diff --git a/cmd/create.go b/cmd/create.go index 266ed2c..a527023 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -8,6 +8,7 @@ import ( jsoniter "github.com/json-iterator/go" "github.com/spf13/cobra" + "github.com/zilliztech/milvus-backup/core" "github.com/zilliztech/milvus-backup/core/paramtable" "github.com/zilliztech/milvus-backup/core/proto/backuppb" @@ -35,7 +36,7 @@ var createBackupCmd = &cobra.Command{ params.Init() context := context.Background() - backupContext := core.CreateBackupContext(context, params) + backupContext := core.CreateBackupContext(context, ¶ms) start := time.Now().Unix() var collectionNameArr []string diff --git a/cmd/delete.go b/cmd/delete.go index a073687..7ea97ad 100644 --- a/cmd/delete.go +++ b/cmd/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/zilliztech/milvus-backup/core" "github.com/zilliztech/milvus-backup/core/paramtable" "github.com/zilliztech/milvus-backup/core/proto/backuppb" @@ -24,7 +25,7 @@ var deleteBackupCmd = &cobra.Command{ params.Init() context := context.Background() - backupContext := core.CreateBackupContext(context, params) + backupContext := core.CreateBackupContext(context, ¶ms) resp := backupContext.DeleteBackup(context, &backuppb.DeleteBackupRequest{ BackupName: deleteBackName, diff --git a/cmd/get.go b/cmd/get.go index 2828603..33ca4f9 100644 --- a/cmd/get.go +++ b/cmd/get.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/zilliztech/milvus-backup/core" "github.com/zilliztech/milvus-backup/core/paramtable" "github.com/zilliztech/milvus-backup/core/proto/backuppb" @@ -27,7 +28,7 @@ var getBackupCmd = &cobra.Command{ params.Init() context := context.Background() - backupContext := core.CreateBackupContext(context, params) + backupContext := core.CreateBackupContext(context, ¶ms) resp := backupContext.GetBackup(context, &backuppb.GetBackupRequest{ BackupName: getBackName, diff --git a/cmd/list.go b/cmd/list.go index 4b26242..eab6b4b 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/zilliztech/milvus-backup/core" "github.com/zilliztech/milvus-backup/core/paramtable" "github.com/zilliztech/milvus-backup/core/proto/backuppb" @@ -25,7 +26,7 @@ var listBackupCmd = &cobra.Command{ params.Init() context := context.Background() - backupContext := core.CreateBackupContext(context, params) + backupContext := core.CreateBackupContext(context, ¶ms) backups := backupContext.ListBackups(context, &backuppb.ListBackupsRequest{ CollectionName: collectionName, diff --git a/cmd/restore.go b/cmd/restore.go index 19d9108..1167a72 100644 --- a/cmd/restore.go +++ b/cmd/restore.go @@ -8,6 +8,7 @@ import ( jsoniter "github.com/json-iterator/go" "github.com/spf13/cobra" + "github.com/zilliztech/milvus-backup/core" "github.com/zilliztech/milvus-backup/core/paramtable" "github.com/zilliztech/milvus-backup/core/proto/backuppb" @@ -43,7 +44,7 @@ var restoreBackupCmd = &cobra.Command{ params.Init() context := context.Background() - backupContext := core.CreateBackupContext(context, params) + backupContext := core.CreateBackupContext(context, ¶ms) log.Info("restore cmd input args", zap.Strings("args", args)) start := time.Now().Unix() var collectionNameArr []string diff --git a/cmd/root.go b/cmd/root.go index 93e4a98..a02e06d 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -23,7 +23,7 @@ var rootCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { Error(cmd, args, errors.New("unrecognized command")) }, - PersistentPreRun: func(cmd *cobra.Command, args []string){ + PersistentPreRun: func(cmd *cobra.Command, args []string) { setEnvs(yamlOverrides) }, } diff --git a/cmd/server.go b/cmd/server.go index c910ba5..16c4b01 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -7,6 +7,7 @@ import ( "strconv" "github.com/spf13/cobra" + "github.com/zilliztech/milvus-backup/core" "github.com/zilliztech/milvus-backup/core/paramtable" ) @@ -31,7 +32,7 @@ var serverCmd = &cobra.Command{ params.Init() context := context.Background() - server, err := core.NewServer(context, params, core.Port(port)) + server, err := core.NewServer(context, ¶ms, core.Port(port)) if err != nil { fmt.Errorf("fail to create backup server, %s", err.Error()) } diff --git a/core/backup_context.go b/core/backup_context.go index 4db0581..46677df 100644 --- a/core/backup_context.go +++ b/core/backup_context.go @@ -3,36 +3,30 @@ package core import ( "context" "encoding/json" - "errors" "fmt" "path" "sync" "time" - gomilvus "github.com/milvus-io/milvus-sdk-go/v2/client" "go.uber.org/zap" "go.uber.org/zap/zapcore" + "github.com/zilliztech/milvus-backup/core/client" + "github.com/zilliztech/milvus-backup/core/meta" "github.com/zilliztech/milvus-backup/core/paramtable" "github.com/zilliztech/milvus-backup/core/proto/backuppb" "github.com/zilliztech/milvus-backup/core/storage" "github.com/zilliztech/milvus-backup/core/utils" "github.com/zilliztech/milvus-backup/internal/common" "github.com/zilliztech/milvus-backup/internal/log" - - grpc "google.golang.org/grpc" - "google.golang.org/grpc/credentials" ) const ( - BULKINSERT_TIMEOUT = 60 * 60 - BULKINSERT_SLEEP_INTERVAL = 5 - BACKUP_NAME = "BACKUP_NAME" - COLLECTION_RENAME_SUFFIX = "COLLECTION_RENAME_SUFFIX" + BackupName = "BACKUP_NAME" + CollectionRenameSuffix = "COLLECTION_RENAME_SUFFIX" RPS = 1000 BackupSegmentGroupMaxSizeInMB = 256 - - GC_Warn_Message = "This warn won't fail the backup process. Pause GC can protect data not to be GCed during backup, it is necessary to backup very large data(cost more than a hour)." + GcWarnMessage = "This warn won't fail the backup process. Pause GC can protect data not to be GCed during backup, it is necessary to backup very large data(cost more than a hour)." ) // makes sure BackupContext implements `Backup` @@ -43,10 +37,13 @@ type BackupContext struct { // lock to make sure only one backup is creating or restoring mu sync.Mutex started bool - params paramtable.BackupParams + params *paramtable.BackupParams // milvus client - milvusClient *MilvusClient + grpcClient client.Grpc + + // restful client + restfulClient client.Restful // data storage client milvusStorageClient storage.ChunkManager @@ -59,82 +56,53 @@ type BackupContext struct { milvusRootPath string backupRootPath string - meta *MetaManager + meta *meta.MetaManager backupCollectionWorkerPool *common.WorkerPool backupCopyDataWorkerPool *common.WorkerPool - bulkinsertWorkerPools map[string]*common.WorkerPool + + bulkinsertWorkerPools sync.Map } -func CreateMilvusClient(ctx context.Context, params paramtable.BackupParams) (gomilvus.Client, error) { - milvusEndpoint := params.MilvusCfg.Address + ":" + params.MilvusCfg.Port - log.Debug("Start Milvus client", zap.String("endpoint", milvusEndpoint)) - var c gomilvus.Client - var err error - if params.MilvusCfg.AuthorizationEnabled && params.MilvusCfg.User != "" && params.MilvusCfg.Password != "" { - switch params.MilvusCfg.TLSMode { - case 0: - c, err = gomilvus.NewDefaultGrpcClientWithAuth(ctx, milvusEndpoint, params.MilvusCfg.User, params.MilvusCfg.Password) - case 1: - if params.MilvusCfg.TLSCertPath != "" { - var creds credentials.TransportCredentials - creds, err = credentials.NewClientTLSFromFile(params.MilvusCfg.TLSCertPath, params.MilvusCfg.ServerName) - if err != nil { - log.Error("failed to create client from the certificate", zap.Error(err)) - return nil, err - } - opts := []grpc.DialOption{ - grpc.WithTransportCredentials(creds), - } - c, err = gomilvus.NewClient(ctx, gomilvus.Config{ - Address: milvusEndpoint, - Username: params.MilvusCfg.User, - Password: params.MilvusCfg.Password, - EnableTLSAuth: true, - DialOptions: opts, - }) - } else { - c, err = gomilvus.NewDefaultGrpcClientWithTLSAuth(ctx, milvusEndpoint, params.MilvusCfg.User, params.MilvusCfg.Password) - } - case 2: - c, err = gomilvus.NewDefaultGrpcClientWithTLSAuth(ctx, milvusEndpoint, params.MilvusCfg.User, params.MilvusCfg.Password) - default: - log.Error("milvus.TLSMode is illegal, support value 0, 1, 2") - return nil, errors.New("milvus.TLSMode is illegal, support value 0, 1, 2") - } - } else { - c, err = gomilvus.NewGrpcClient(ctx, milvusEndpoint) +func CreateMilvusClient(ctx context.Context, params *paramtable.BackupParams) (client.Grpc, error) { + ep := params.MilvusCfg.Address + ":" + params.MilvusCfg.Port + log.Debug("Start Milvus client", zap.String("endpoint", ep)) + + var enableTLS bool + switch params.MilvusCfg.TLSMode { + case 0: + enableTLS = false + case 1, 2: + enableTLS = true + default: + log.Error("milvus.TLSMode is illegal, support value 0, 1, 2") } + + cfg := &client.Cfg{ + Address: ep, + EnableTLS: enableTLS, + Username: params.MilvusCfg.User, + Password: params.MilvusCfg.Password, + } + cli, err := client.NewGrpc(cfg) if err != nil { - log.Error("failed to connect to milvus", zap.Error(err)) - return nil, err + log.Error("failed to create milvus client", zap.Error(err)) + return nil, fmt.Errorf("failed to create milvus client: %w", err) } - return c, nil + return cli, nil } -// Deprecated -func createStorageClient(ctx context.Context, params paramtable.BackupParams) (storage.ChunkManager, error) { - minioEndPoint := params.MinioCfg.Address + ":" + params.MinioCfg.Port - log.Debug("Start minio client", - zap.String("address", minioEndPoint), - zap.String("bucket", params.MinioCfg.BucketName), - zap.String("backupBucket", params.MinioCfg.BackupBucketName)) - - storageConfig := &storage.StorageConfig{ - StorageType: params.MinioCfg.StorageType, - Address: minioEndPoint, - BucketName: params.MinioCfg.BucketName, - AccessKeyID: params.MinioCfg.AccessKeyID, - SecretAccessKeyID: params.MinioCfg.SecretAccessKey, - UseSSL: params.MinioCfg.UseSSL, - UseIAM: params.MinioCfg.UseIAM, - IAMEndpoint: params.MinioCfg.IAMEndpoint, - RootPath: params.MinioCfg.RootPath, - CreateBucket: true, - } - - minioClient, err := storage.NewChunkManager(ctx, params, storageConfig) - return minioClient, err +func CreateRestfulClient(params *paramtable.BackupParams) (client.Restful, error) { + ep := params.MilvusCfg.Address + ":" + params.MilvusCfg.Port + log.Debug("Start Restful client", zap.String("endpoint", ep)) + + cfg := &client.Cfg{Address: ep, Username: params.MilvusCfg.User, Password: params.MilvusCfg.Password} + cli, err := client.NewRestful(cfg) + if err != nil { + log.Error("failed to create restful client", zap.Error(err)) + return nil, fmt.Errorf("failed to create restful client: %w", err) + } + return cli, nil } func (b *BackupContext) Start() error { @@ -146,14 +114,14 @@ func (b *BackupContext) Start() error { func (b *BackupContext) Close() error { b.started = false - if b.milvusClient != nil { + if b.grpcClient != nil { err := b.getMilvusClient().Close() return err } return nil } -func CreateBackupContext(ctx context.Context, params paramtable.BackupParams) *BackupContext { +func CreateBackupContext(ctx context.Context, params *paramtable.BackupParams) *BackupContext { return &BackupContext{ ctx: ctx, params: params, @@ -161,23 +129,33 @@ func CreateBackupContext(ctx context.Context, params paramtable.BackupParams) *B backupBucketName: params.MinioCfg.BackupBucketName, milvusRootPath: params.MinioCfg.RootPath, backupRootPath: params.MinioCfg.BackupRootPath, - bulkinsertWorkerPools: make(map[string]*common.WorkerPool), - meta: newMetaManager(), + bulkinsertWorkerPools: sync.Map{}, + meta: meta.NewMetaManager(), } } -func (b *BackupContext) getMilvusClient() *MilvusClient { - if b.milvusClient == nil { +func (b *BackupContext) getMilvusClient() client.Grpc { + if b.grpcClient == nil { milvusClient, err := CreateMilvusClient(b.ctx, b.params) if err != nil { log.Error("failed to initial milvus client", zap.Error(err)) panic(err) } - b.milvusClient = &MilvusClient{ - client: milvusClient, + b.grpcClient = milvusClient + } + return b.grpcClient +} + +func (b *BackupContext) getRestfulClient() client.Restful { + if b.restfulClient == nil { + restfulClient, err := CreateRestfulClient(b.params) + if err != nil { + log.Error("failed to initial restful client", zap.Error(err)) + panic(err) } + b.restfulClient = restfulClient } - return b.milvusClient + return b.restfulClient } func (b *BackupContext) getMilvusStorageClient() storage.ChunkManager { @@ -306,23 +284,26 @@ func (b *BackupContext) getCopyDataWorkerPool() *common.WorkerPool { } func (b *BackupContext) getRestoreWorkerPool(id string) *common.WorkerPool { - if pool, exist := b.bulkinsertWorkerPools[id]; exist { - return pool + // TODO DO NOT use pool of worker pool + if pool, exist := b.bulkinsertWorkerPools.Load(id); exist { + return pool.(*common.WorkerPool) } else { wp, err := common.NewWorkerPool(b.ctx, b.params.BackupCfg.RestoreParallelism, RPS) if err != nil { log.Error("failed to initial copy data worker pool", zap.Error(err)) panic(err) } - b.bulkinsertWorkerPools[id] = wp - b.bulkinsertWorkerPools[id].Start() - return b.bulkinsertWorkerPools[id] + wp.Start() + b.bulkinsertWorkerPools.Store(id, wp) + + return wp } } func (b *BackupContext) cleanRestoreWorkerPool(id string) { - if _, exist := b.bulkinsertWorkerPools[id]; exist { - delete(b.bulkinsertWorkerPools, id) + // TODO DO NOT use pool of worker pool + if _, exist := b.bulkinsertWorkerPools.Load(id); exist { + b.bulkinsertWorkerPools.Delete(id) } } @@ -369,10 +350,10 @@ func (b *BackupContext) GetBackup(ctx context.Context, request *backuppb.GetBack var backupPath string if request.GetBucketName() == "" || request.GetPath() == "" { backupBucketName = b.backupBucketName - backupPath = b.backupRootPath + SEPERATOR + request.GetBackupName() + backupPath = b.backupRootPath + meta.SEPERATOR + request.GetBackupName() } else { backupBucketName = request.GetBucketName() - backupPath = request.GetPath() + SEPERATOR + request.GetBackupName() + backupPath = request.GetPath() + meta.SEPERATOR + request.GetBackupName() } backup, err := b.readBackupV2(ctx, backupBucketName, backupPath) if err != nil { @@ -396,7 +377,7 @@ func (b *BackupContext) GetBackup(ctx context.Context, request *backuppb.GetBack } if request.WithoutDetail { - resp = SimpleBackupResponse(resp) + resp = meta.SimpleBackupResponse(resp) } if log.GetLevel() == zapcore.DebugLevel { @@ -440,7 +421,7 @@ func (b *BackupContext) ListBackups(ctx context.Context, request *backuppb.ListB } // 1, trigger inner sync to get the newest backup list in the milvus cluster - backupPaths, _, err := b.getBackupStorageClient().ListWithPrefix(ctx, b.backupBucketName, b.backupRootPath+SEPERATOR, false) + backupPaths, _, err := b.getBackupStorageClient().ListWithPrefix(ctx, b.backupBucketName, b.backupRootPath+meta.SEPERATOR, false) if err != nil { log.Error("Fail to list backup directory", zap.Error(err)) resp.Code = backuppb.ResponseCode_Fail @@ -453,7 +434,7 @@ func (b *BackupContext) ListBackups(ctx context.Context, request *backuppb.ListB backupNames := make([]string, 0) for _, backupPath := range backupPaths { backupResp := b.GetBackup(ctx, &backuppb.GetBackupRequest{ - BackupName: BackupPathToName(b.backupRootPath, backupPath), + BackupName: meta.BackupPathToName(b.backupRootPath, backupPath), }) if backupResp.GetCode() != backuppb.ResponseCode_Success { log.Warn("Fail to read backup", @@ -526,7 +507,7 @@ func (b *BackupContext) DeleteBackup(ctx context.Context, request *backuppb.Dele BackupName: request.GetBackupName(), }) // always trigger a remove to make sure it is deleted - err := b.getBackupStorageClient().RemoveWithPrefix(ctx, b.backupBucketName, BackupDirPath(b.backupRootPath, request.GetBackupName())) + err := b.getBackupStorageClient().RemoveWithPrefix(ctx, b.backupBucketName, meta.BackupDirPath(b.backupRootPath, request.GetBackupName())) if getResp.GetCode() == backuppb.ResponseCode_Request_Object_Not_Found { resp.Code = backuppb.ResponseCode_Request_Object_Not_Found @@ -564,8 +545,8 @@ func (b *BackupContext) DeleteBackup(ctx context.Context, request *backuppb.Dele // 1. first read backup from full meta // 2. if full meta not exist, which means backup is a very old version, read from seperate files func (b *BackupContext) readBackupV2(ctx context.Context, bucketName string, backupPath string) (*backuppb.BackupInfo, error) { - backupMetaDirPath := backupPath + SEPERATOR + META_PREFIX - fullMetaPath := backupMetaDirPath + SEPERATOR + FULL_META_FILE + backupMetaDirPath := backupPath + meta.SEPERATOR + meta.META_PREFIX + fullMetaPath := backupMetaDirPath + meta.SEPERATOR + meta.FULL_META_FILE exist, err := b.getBackupStorageClient().Exist(ctx, bucketName, fullMetaPath) if err != nil { log.Error("check full meta file failed", zap.String("path", fullMetaPath), zap.Error(err)) @@ -591,11 +572,11 @@ func (b *BackupContext) readBackupV2(ctx context.Context, bucketName string, bac // read backup from seperated meta files func (b *BackupContext) readBackup(ctx context.Context, bucketName string, backupPath string) (*backuppb.BackupInfo, error) { - backupMetaDirPath := backupPath + SEPERATOR + META_PREFIX - backupMetaPath := backupMetaDirPath + SEPERATOR + BACKUP_META_FILE - collectionMetaPath := backupMetaDirPath + SEPERATOR + COLLECTION_META_FILE - partitionMetaPath := backupMetaDirPath + SEPERATOR + PARTITION_META_FILE - segmentMetaPath := backupMetaDirPath + SEPERATOR + SEGMENT_META_FILE + backupMetaDirPath := backupPath + meta.SEPERATOR + meta.META_PREFIX + backupMetaPath := backupMetaDirPath + meta.SEPERATOR + meta.BACKUP_META_FILE + collectionMetaPath := backupMetaDirPath + meta.SEPERATOR + meta.COLLECTION_META_FILE + partitionMetaPath := backupMetaDirPath + meta.SEPERATOR + meta.PARTITION_META_FILE + segmentMetaPath := backupMetaDirPath + meta.SEPERATOR + meta.SEGMENT_META_FILE exist, err := b.getBackupStorageClient().Exist(ctx, bucketName, backupMetaPath) if err != nil { @@ -628,14 +609,14 @@ func (b *BackupContext) readBackup(ctx context.Context, bucketName string, backu return nil, err } - completeBackupMetas := &BackupMetaBytes{ + completeBackupMetas := &meta.BackupMetaBytes{ BackupMetaBytes: backupMetaBytes, CollectionMetaBytes: collectionBackupMetaBytes, PartitionMetaBytes: partitionBackupMetaBytes, SegmentMetaBytes: segmentBackupMetaBytes, } - backupInfo, err := deserialize(completeBackupMetas) + backupInfo, err := meta.Deserialize(completeBackupMetas) if err != nil { log.Error("Fail to deserialize backup info", zap.String("backupPath", backupPath), zap.Error(err)) return nil, err @@ -705,7 +686,7 @@ func (b *BackupContext) Check(ctx context.Context) string { "backup-rootpath: %s\n", version, b.milvusBucketName, b.milvusRootPath, b.backupBucketName, b.backupRootPath) - milvusFiles, _, err := b.getMilvusStorageClient().ListWithPrefix(ctx, b.milvusBucketName, b.milvusRootPath+SEPERATOR, false) + milvusFiles, _, err := b.getMilvusStorageClient().ListWithPrefix(ctx, b.milvusBucketName, b.milvusRootPath+meta.SEPERATOR, false) if err != nil { return "Failed to connect to storage milvus path\n" + info + err.Error() } @@ -714,7 +695,7 @@ func (b *BackupContext) Check(ctx context.Context) string { return "Milvus storage is empty. Please verify whether your cluster is really empty. If not, the configs(minio address, port, bucket, rootPath) may be wrong\n" + info } - _, _, err = b.getBackupStorageClient().ListWithPrefix(ctx, b.backupBucketName, b.backupRootPath+SEPERATOR, false) + _, _, err = b.getBackupStorageClient().ListWithPrefix(ctx, b.backupBucketName, b.backupRootPath+meta.SEPERATOR, false) if err != nil { return "Failed to connect to storage backup path " + info + err.Error() } diff --git a/core/backup_context_test.go b/core/backup_context_test.go index 773df83..1168b91 100644 --- a/core/backup_context_test.go +++ b/core/backup_context_test.go @@ -6,48 +6,51 @@ import ( "math/rand" "testing" + "github.com/zilliztech/milvus-backup/core/meta" + "github.com/stretchr/testify/assert" + "go.uber.org/zap" + "github.com/zilliztech/milvus-backup/core/paramtable" "github.com/zilliztech/milvus-backup/core/proto/backuppb" "github.com/zilliztech/milvus-backup/core/utils" "github.com/zilliztech/milvus-backup/internal/log" - "go.uber.org/zap" ) func TestCreateBackup(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backup := CreateBackupContext(context, params) + ctx := context.Background() + backup := CreateBackupContext(ctx, ¶ms) req := &backuppb.CreateBackupRequest{ BackupName: "test_21", //CollectionNames: []string{"hello_milvus", "hello_milvus2"}, DbCollections: utils.WrapDBCollections(""), } - backup.CreateBackup(context, req) + backup.CreateBackup(ctx, req) } func TestCheck(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backup := CreateBackupContext(context, params) + ctx := context.Background() + backup := CreateBackupContext(ctx, ¶ms) - res := backup.Check(context) + res := backup.Check(ctx) println(res) } func TestListBackups(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backupContext := CreateBackupContext(context, params) + ctx := context.Background() + backupContext := CreateBackupContext(ctx, ¶ms) - backupLists := backupContext.ListBackups(context, &backuppb.ListBackupsRequest{}) + backupLists := backupContext.ListBackups(ctx, &backuppb.ListBackupsRequest{}) assert.Equal(t, backupLists.GetCode(), backuppb.ResponseCode_Success) - backupListsWithCollection := backupContext.ListBackups(context, &backuppb.ListBackupsRequest{ + backupListsWithCollection := backupContext.ListBackups(ctx, &backuppb.ListBackupsRequest{ //CollectionName: "hello_milvus", }) @@ -68,10 +71,10 @@ func TestListBackups(t *testing.T) { func TestGetBackup(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backupContext := CreateBackupContext(context, params) + ctx := context.Background() + backupContext := CreateBackupContext(ctx, ¶ms) - backup := backupContext.GetBackup(context, &backuppb.GetBackupRequest{ + backup := backupContext.GetBackup(ctx, &backuppb.GetBackupRequest{ BackupName: "mybackup", }) assert.Equal(t, backup.GetCode(), backuppb.ResponseCode_Success) @@ -80,15 +83,15 @@ func TestGetBackup(t *testing.T) { func TestDeleteBackup(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backupContext := CreateBackupContext(context, params) + ctx := context.Background() + backupContext := CreateBackupContext(ctx, ¶ms) - backup := backupContext.DeleteBackup(context, &backuppb.DeleteBackupRequest{ + backup := backupContext.DeleteBackup(ctx, &backuppb.DeleteBackupRequest{ BackupName: "test_backup6", }) assert.Equal(t, backup.GetCode(), backuppb.ResponseCode_Success) - backupLists := backupContext.ListBackups(context, &backuppb.ListBackupsRequest{}) + backupLists := backupContext.ListBackups(ctx, &backuppb.ListBackupsRequest{}) assert.Equal(t, backupLists.GetCode(), backuppb.ResponseCode_Success) assert.Equal(t, 0, len(backupLists.GetData())) @@ -98,19 +101,19 @@ func TestDeleteBackup(t *testing.T) { func TestCreateBackupWithNoName(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backup := CreateBackupContext(context, params) + ctx := context.Background() + backup := CreateBackupContext(ctx, ¶ms) randBackupName := "" req := &backuppb.CreateBackupRequest{ BackupName: randBackupName, } - resp := backup.CreateBackup(context, req) + resp := backup.CreateBackup(ctx, req) assert.Equal(t, backuppb.ResponseCode_Success, resp.GetCode()) // clean - backup.DeleteBackup(context, &backuppb.DeleteBackupRequest{ + backup.DeleteBackup(ctx, &backuppb.DeleteBackupRequest{ BackupName: randBackupName, }) } @@ -118,8 +121,8 @@ func TestCreateBackupWithNoName(t *testing.T) { func TestCreateBackupWithUnexistCollection(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backup := CreateBackupContext(context, params) + ctx := context.Background() + backup := CreateBackupContext(ctx, ¶ms) randBackupName := fmt.Sprintf("test_%d", rand.Int()) @@ -127,12 +130,12 @@ func TestCreateBackupWithUnexistCollection(t *testing.T) { BackupName: randBackupName, CollectionNames: []string{"not_exist"}, } - resp := backup.CreateBackup(context, req) + resp := backup.CreateBackup(ctx, req) assert.Equal(t, backuppb.ResponseCode_Fail, resp.GetCode()) assert.Equal(t, "request backup collection does not exist: not_exist", resp.GetMsg()) // clean - backup.DeleteBackup(context, &backuppb.DeleteBackupRequest{ + backup.DeleteBackup(ctx, &backuppb.DeleteBackupRequest{ BackupName: randBackupName, }) } @@ -140,26 +143,26 @@ func TestCreateBackupWithUnexistCollection(t *testing.T) { func TestCreateBackupWithDuplicateName(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backup := CreateBackupContext(context, params) + ctx := context.Background() + backup := CreateBackupContext(ctx, ¶ms) randBackupName := fmt.Sprintf("test_%d", rand.Int()) req := &backuppb.CreateBackupRequest{ BackupName: randBackupName, } - resp := backup.CreateBackup(context, req) + resp := backup.CreateBackup(ctx, req) assert.Equal(t, backuppb.ResponseCode_Success, resp.GetCode()) req2 := &backuppb.CreateBackupRequest{ BackupName: randBackupName, } - resp2 := backup.CreateBackup(context, req2) + resp2 := backup.CreateBackup(ctx, req2) assert.Equal(t, backuppb.ResponseCode_Fail, resp2.GetCode()) assert.Equal(t, fmt.Sprintf("backup already exist with the name: %s", req2.GetBackupName()), resp2.GetMsg()) // clean - backup.DeleteBackup(context, &backuppb.DeleteBackupRequest{ + backup.DeleteBackup(ctx, &backuppb.DeleteBackupRequest{ BackupName: randBackupName, }) } @@ -167,19 +170,19 @@ func TestCreateBackupWithDuplicateName(t *testing.T) { func TestCreateBackupWithIllegalName(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backup := CreateBackupContext(context, params) + ctx := context.Background() + backup := CreateBackupContext(ctx, ¶ms) randBackupName := "dahgg$%123" req := &backuppb.CreateBackupRequest{ BackupName: randBackupName, } - resp := backup.CreateBackup(context, req) + resp := backup.CreateBackup(ctx, req) assert.Equal(t, backuppb.ResponseCode_Fail, resp.GetCode()) // clean - backup.DeleteBackup(context, &backuppb.DeleteBackupRequest{ + backup.DeleteBackup(ctx, &backuppb.DeleteBackupRequest{ BackupName: randBackupName, }) } @@ -187,24 +190,24 @@ func TestCreateBackupWithIllegalName(t *testing.T) { func TestGetBackupAfterCreate(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backupContext := CreateBackupContext(context, params) + ctx := context.Background() + backupContext := CreateBackupContext(ctx, ¶ms) randBackupName := fmt.Sprintf("test_%d", rand.Int()) req := &backuppb.CreateBackupRequest{ BackupName: randBackupName, } - resp := backupContext.CreateBackup(context, req) + resp := backupContext.CreateBackup(ctx, req) assert.Equal(t, backuppb.ResponseCode_Success, resp.GetCode()) - backup := backupContext.GetBackup(context, &backuppb.GetBackupRequest{ + backup := backupContext.GetBackup(ctx, &backuppb.GetBackupRequest{ BackupName: randBackupName, }) assert.Equal(t, backuppb.ResponseCode_Success, backup.GetCode()) // clean - backupContext.DeleteBackup(context, &backuppb.DeleteBackupRequest{ + backupContext.DeleteBackup(ctx, &backuppb.DeleteBackupRequest{ BackupName: randBackupName, }) } @@ -212,31 +215,31 @@ func TestGetBackupAfterCreate(t *testing.T) { func TestGetBackupFaultBackup(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backupContext := CreateBackupContext(context, params) + ctx := context.Background() + backupContext := CreateBackupContext(ctx, ¶ms) backupContext.Start() randBackupName := fmt.Sprintf("test_%d", rand.Int()) - backupContext.DeleteBackup(context, &backuppb.DeleteBackupRequest{ + backupContext.DeleteBackup(ctx, &backuppb.DeleteBackupRequest{ BackupName: randBackupName, }) req := &backuppb.CreateBackupRequest{ BackupName: randBackupName, } - resp := backupContext.CreateBackup(context, req) + resp := backupContext.CreateBackup(ctx, req) assert.Equal(t, backuppb.ResponseCode_Success, resp.GetCode()) - backupContext.getMilvusStorageClient().RemoveWithPrefix(context, params.MinioCfg.BackupBucketName, BackupMetaPath(params.MinioCfg.BackupRootPath, resp.GetData().GetName())) + backupContext.getMilvusStorageClient().RemoveWithPrefix(ctx, params.MinioCfg.BackupBucketName, meta.BackupMetaPath(params.MinioCfg.BackupRootPath, resp.GetData().GetName())) - backup := backupContext.GetBackup(context, &backuppb.GetBackupRequest{ + backup := backupContext.GetBackup(ctx, &backuppb.GetBackupRequest{ BackupName: randBackupName, }) assert.Equal(t, backuppb.ResponseCode_Fail, backup.GetCode()) // clean - backupContext.DeleteBackup(context, &backuppb.DeleteBackupRequest{ + backupContext.DeleteBackup(ctx, &backuppb.DeleteBackupRequest{ BackupName: randBackupName, }) } @@ -244,11 +247,11 @@ func TestGetBackupFaultBackup(t *testing.T) { func TestGetBackupUnexistBackupName(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backupContext := CreateBackupContext(context, params) + ctx := context.Background() + backupContext := CreateBackupContext(ctx, ¶ms) backupContext.Start() - backup := backupContext.GetBackup(context, &backuppb.GetBackupRequest{ + backup := backupContext.GetBackup(ctx, &backuppb.GetBackupRequest{ BackupName: "un_exist", }) assert.Equal(t, backuppb.ResponseCode_Fail, backup.GetCode()) @@ -257,13 +260,13 @@ func TestGetBackupUnexistBackupName(t *testing.T) { func TestRestoreBackup(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backup := CreateBackupContext(context, params) + ctx := context.Background() + backup := CreateBackupContext(ctx, ¶ms) backup.Start() backupName := "demo" //fmt.Sprintf("test_%d", rand.Int()) - restoreResp := backup.RestoreBackup(context, &backuppb.RestoreBackupRequest{ + restoreResp := backup.RestoreBackup(ctx, &backuppb.RestoreBackupRequest{ BackupName: backupName, DbCollections: utils.WrapDBCollections("{\"default\":[]}"), }) @@ -273,8 +276,8 @@ func TestRestoreBackup(t *testing.T) { func TestCreateAndRestoreBackup(t *testing.T) { var params paramtable.BackupParams params.Init() - context := context.Background() - backup := CreateBackupContext(context, params) + ctx := context.Background() + backup := CreateBackupContext(ctx, ¶ms) backup.Start() randBackupName := "test" //fmt.Sprintf("test_%d", rand.Int()) @@ -282,23 +285,23 @@ func TestCreateAndRestoreBackup(t *testing.T) { req := &backuppb.CreateBackupRequest{ BackupName: randBackupName, } - resp := backup.CreateBackup(context, req) + resp := backup.CreateBackup(ctx, req) assert.Equal(t, backuppb.ResponseCode_Success, resp.GetCode()) getReq := &backuppb.GetBackupRequest{ BackupName: randBackupName, } - getResp := backup.GetBackup(context, getReq) + getResp := backup.GetBackup(ctx, getReq) assert.Equal(t, backuppb.ResponseCode_Success, getResp.GetCode()) - restoreResp := backup.RestoreBackup(context, &backuppb.RestoreBackupRequest{ + restoreResp := backup.RestoreBackup(ctx, &backuppb.RestoreBackupRequest{ BackupName: randBackupName, CollectionSuffix: "_recover", }) log.Info("restore backup", zap.Any("resp", restoreResp)) //clean - backup.DeleteBackup(context, &backuppb.DeleteBackupRequest{ + backup.DeleteBackup(ctx, &backuppb.DeleteBackupRequest{ BackupName: randBackupName, }) } diff --git a/core/backup_impl_create_backup.go b/core/backup_impl_create_backup.go index 448e2a7..0f77f99 100644 --- a/core/backup_impl_create_backup.go +++ b/core/backup_impl_create_backup.go @@ -13,9 +13,12 @@ import ( "strings" "time" + "github.com/zilliztech/milvus-backup/core/meta" + "github.com/golang/protobuf/proto" jsoniter "github.com/json-iterator/go" - "github.com/milvus-io/milvus-sdk-go/v2/entity" + "github.com/milvus-io/milvus-proto/go-api/v2/commonpb" + "github.com/milvus-io/milvus-proto/go-api/v2/milvuspb" "github.com/samber/lo" "go.uber.org/zap" @@ -25,6 +28,15 @@ import ( "github.com/zilliztech/milvus-backup/internal/util/retry" ) +func conv2BakKV(kv []*commonpb.KeyValuePair) []*backuppb.KeyValuePair { + return lo.Map(kv, func(item *commonpb.KeyValuePair, _ int) *backuppb.KeyValuePair { + return &backuppb.KeyValuePair{ + Key: item.Key, + Value: item.Value, + } + }) +} + func (b *BackupContext) CreateBackup(ctx context.Context, request *backuppb.CreateBackupRequest) *backuppb.BackupInfoResponse { if request.GetRequestId() == "" { request.RequestId = utils.UUID() @@ -56,7 +68,7 @@ func (b *BackupContext) CreateBackup(ctx context.Context, request *backuppb.Crea request.BackupName = "backup_" + fmt.Sprint(time.Now().UTC().Format("2006_01_02_15_04_05_")) + fmt.Sprint(time.Now().Nanosecond()) } if request.GetBackupName() != "" { - exist, err := b.getBackupStorageClient().Exist(b.ctx, b.backupBucketName, b.backupRootPath+SEPERATOR+request.GetBackupName()) + exist, err := b.getBackupStorageClient().Exist(b.ctx, b.backupBucketName, b.backupRootPath+meta.SEPERATOR+request.GetBackupName()) if err != nil { errMsg := fmt.Sprintf("fail to check whether exist backup with name: %s", request.GetBackupName()) log.Error(errMsg, zap.Error(err)) @@ -72,7 +84,7 @@ func (b *BackupContext) CreateBackup(ctx context.Context, request *backuppb.Crea return resp } } - err := utils.ValidateType(request.GetBackupName(), BACKUP_NAME) + err := utils.ValidateType(request.GetBackupName(), BackupName) if err != nil { log.Error("illegal backup name", zap.Error(err)) resp.Code = backuppb.ResponseCode_Parameter_Error @@ -143,7 +155,7 @@ func (b *BackupContext) parseBackupCollections(request *backuppb.CreateBackupReq dbCollectionsStr := utils.GetCreateDBCollections(request) // first priority: dbCollections if dbCollectionsStr != "" { - var dbCollections DbCollections + var dbCollections meta.DbCollections err := jsoniter.UnmarshalFromString(dbCollectionsStr, &dbCollections) if err != nil { log.Error("fail in unmarshal dbCollections in CreateBackupRequest", zap.String("dbCollections", dbCollectionsStr), zap.Error(err)) @@ -151,14 +163,14 @@ func (b *BackupContext) parseBackupCollections(request *backuppb.CreateBackupReq } for db, collections := range dbCollections { if len(collections) == 0 { - collections, err := b.getMilvusClient().ListCollections(b.ctx, db) + resp, err := b.getMilvusClient().ListCollections(b.ctx, db) if err != nil { log.Error("fail in ListCollections", zap.Error(err)) return nil, err } - for _, coll := range collections { - log.Debug("Add collection to toBackupCollections", zap.String("db", db), zap.String("collection", coll.Name)) - toBackupCollections = append(toBackupCollections, collectionStruct{db, coll.Name}) + for _, coll := range resp.CollectionNames { + log.Debug("Add collection to toBackupCollections", zap.String("db", db), zap.String("collection", coll)) + toBackupCollections = append(toBackupCollections, collectionStruct{db, coll}) } } else { for _, coll := range collections { @@ -174,15 +186,15 @@ func (b *BackupContext) parseBackupCollections(request *backuppb.CreateBackupReq dbs, err := b.getMilvusClient().ListDatabases(b.ctx) if err != nil { // compatible to milvus under v2.2.8 without database support - if strings.Contains(err.Error(), "feature not supported") { + if !b.getMilvusClient().SupportMultiDatabase() { // default database only - collections, err := b.getMilvusClient().ListCollections(b.ctx, "default") + resp, err := b.getMilvusClient().ListCollections(b.ctx, "default") if err != nil { log.Error("fail in ListCollections", zap.Error(err)) return nil, err } - for _, coll := range collections { - toBackupCollections = append(toBackupCollections, collectionStruct{"default", coll.Name}) + for _, coll := range resp.CollectionNames { + toBackupCollections = append(toBackupCollections, collectionStruct{"default", coll}) } } else { log.Error("fail in ListDatabases", zap.Error(err)) @@ -190,13 +202,13 @@ func (b *BackupContext) parseBackupCollections(request *backuppb.CreateBackupReq } } else { for _, db := range dbs { - collections, err := b.getMilvusClient().ListCollections(b.ctx, db.Name) + resp, err := b.getMilvusClient().ListCollections(b.ctx, db) if err != nil { log.Error("fail in ListCollections", zap.Error(err)) return nil, err } - for _, coll := range collections { - toBackupCollections = append(toBackupCollections, collectionStruct{db.Name, coll.Name}) + for _, coll := range resp.CollectionNames { + toBackupCollections = append(toBackupCollections, collectionStruct{db, coll}) } } } @@ -230,26 +242,27 @@ func (b *BackupContext) parseBackupCollections(request *backuppb.CreateBackupReq func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo *backuppb.BackupInfo, collection collectionStruct, force bool) error { log.Info("start backup collection", zap.String("db", collection.db), zap.String("collection", collection.collectionName)) // list collection result is not complete - completeCollection, err := b.getMilvusClient().DescribeCollection(b.ctx, collection.db, collection.collectionName) + descResp, err := b.getMilvusClient().DescribeCollection(b.ctx, collection.db, collection.collectionName) if err != nil { log.Error("fail in DescribeCollection", zap.Error(err)) return err } - fields := make([]*backuppb.FieldSchema, 0) - for _, field := range completeCollection.Schema.Fields { + fields := make([]*backuppb.FieldSchema, 0, len(descResp.Schema.Fields)) + for _, field := range descResp.Schema.Fields { fieldBak := &backuppb.FieldSchema{ - FieldID: field.ID, - Name: field.Name, - IsPrimaryKey: field.PrimaryKey, - Description: field.Description, - AutoID: field.AutoID, - DataType: backuppb.DataType(field.DataType), - TypeParams: utils.MapToKVPair(field.TypeParams), - IndexParams: utils.MapToKVPair(field.IndexParams), - IsDynamic: field.IsDynamic, - IsPartitionKey: field.IsPartitionKey, - Nullable: field.Nullable, - ElementType: backuppb.DataType(field.ElementType), + FieldID: field.FieldID, + Name: field.Name, + IsPrimaryKey: field.IsPrimaryKey, + Description: field.Description, + AutoID: field.AutoID, + DataType: backuppb.DataType(field.DataType), + TypeParams: conv2BakKV(field.TypeParams), + IndexParams: conv2BakKV(field.IndexParams), + IsDynamic: field.IsDynamic, + IsPartitionKey: field.IsPartitionKey, + Nullable: field.Nullable, + ElementType: backuppb.DataType(field.ElementType), + IsFunctionOutput: field.IsFunctionOutput, } defaultValue := field.DefaultValue if defaultValue != nil { @@ -261,53 +274,55 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo } fields = append(fields, fieldBak) } + functions := make([]*backuppb.FunctionSchema, 0, len(descResp.Schema.Functions)) + for _, function := range descResp.Schema.Functions { + functionBak := &backuppb.FunctionSchema{ + Name: function.Name, + Id: function.Id, + Description: function.Description, + Type: backuppb.FunctionType(function.Type), + InputFieldNames: function.InputFieldNames, + InputFieldIds: function.InputFieldIds, + OutputFieldNames: function.OutputFieldNames, + OutputFieldIds: function.OutputFieldIds, + Params: conv2BakKV(function.Params), + } + functions = append(functions, functionBak) + } schema := &backuppb.CollectionSchema{ - Name: completeCollection.Schema.CollectionName, - Description: completeCollection.Schema.Description, - AutoID: completeCollection.Schema.AutoID, + Name: descResp.Schema.Name, + Description: descResp.Schema.Description, + AutoID: descResp.Schema.AutoID, Fields: fields, - EnableDynamicField: completeCollection.Schema.EnableDynamicField, + EnableDynamicField: descResp.Schema.EnableDynamicField, + Functions: functions, } indexInfos := make([]*backuppb.IndexInfo, 0) - indexDict := make(map[string]*backuppb.IndexInfo, 0) - log.Info("try to get index", - zap.String("collection_name", completeCollection.Name)) - for _, field := range completeCollection.Schema.Fields { - //if field.DataType != entity.FieldTypeBinaryVector && field.DataType != entity.FieldTypeFloatVector { - // continue - //} - fieldIndex, err := b.getMilvusClient().DescribeIndex(b.ctx, collection.db, completeCollection.Name, field.Name) - if err != nil { - if strings.Contains(err.Error(), "index not found") || - strings.HasPrefix(err.Error(), "index doesn't exist") { - // todo - log.Info("field has no index", - zap.String("collection_name", completeCollection.Name), - zap.String("field_name", field.Name)) - continue - } else { - log.Error("fail in DescribeIndex", zap.Error(err)) - return err - } - } - log.Info("field index", - zap.String("collection_name", completeCollection.Name), - zap.String("field_name", field.Name), - zap.Any("index info", fieldIndex)) - for _, index := range fieldIndex { - if _, ok := indexDict[index.Name()]; ok { - continue - } else { - indexInfo := &backuppb.IndexInfo{ - FieldName: field.Name, - IndexName: index.Name(), - IndexType: string(index.IndexType()), - Params: index.Params(), - } - indexInfos = append(indexInfos, indexInfo) - indexDict[index.Name()] = indexInfo + indexDict := make(map[string]*backuppb.IndexInfo) + log.Info("try to get index", zap.String("collection_name", descResp.CollectionName)) + indexes, err := b.getMilvusClient().ListIndex(b.ctx, collection.db, descResp.CollectionName) + if err != nil && !strings.Contains(err.Error(), "index not found") { + log.Error("fail in DescribeIndex", zap.Error(err)) + return err + } + + log.Info("List index", zap.String("collection_name", descResp.CollectionName), zap.Any("indexes", indexes)) + for _, index := range indexes { + if _, ok := indexDict[index.IndexName]; ok { + continue + } else { + params := lo.SliceToMap(index.Params, func(item *commonpb.KeyValuePair) (string, string) { + return item.Key, item.Value + }) + indexInfo := &backuppb.IndexInfo{ + FieldName: index.FieldName, + IndexName: index.IndexName, + IndexType: params["index_type"], + Params: params, } + indexInfos = append(indexInfos, indexInfo) + indexDict[index.IndexName] = indexInfo } } @@ -315,18 +330,18 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo Id: backupInfo.Id, StateCode: backuppb.BackupTaskStateCode_BACKUP_INITIAL, StartTime: time.Now().Unix(), - CollectionId: completeCollection.ID, + CollectionId: descResp.CollectionID, DbName: collection.db, - CollectionName: completeCollection.Name, + CollectionName: descResp.CollectionName, Schema: schema, - ShardsNum: completeCollection.ShardNum, - ConsistencyLevel: backuppb.ConsistencyLevel(completeCollection.ConsistencyLevel), + ShardsNum: descResp.ShardsNum, + ConsistencyLevel: backuppb.ConsistencyLevel(descResp.ConsistencyLevel), HasIndex: len(indexInfos) > 0, IndexInfos: indexInfos, } b.meta.AddCollection(collectionBackup) - partitions, err := b.getMilvusClient().ShowPartitions(b.ctx, collectionBackup.GetDbName(), collectionBackup.GetCollectionName()) + showPartResp, err := b.getMilvusClient().ShowPartitions(b.ctx, collectionBackup.GetDbName(), collectionBackup.GetCollectionName()) if err != nil { log.Error("fail to ShowPartitions", zap.Error(err)) return err @@ -340,37 +355,37 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo } var collectionLoadState string - partitionLoadStates := make(map[string]string, 0) + partitionLoadStates := make(map[string]string, len(showPartResp.PartitionNames)) if collectionLoadProgress == 0 { - collectionLoadState = LoadState_NotLoad - for _, partition := range partitions { - partitionLoadStates[partition.Name] = LoadState_NotLoad + collectionLoadState = meta.LoadState_NotLoad + for _, partitionName := range showPartResp.PartitionNames { + partitionLoadStates[partitionName] = meta.LoadState_NotLoad } } else if collectionLoadProgress == 100 { - collectionLoadState = LoadState_Loaded - for _, partition := range partitions { - partitionLoadStates[partition.Name] = LoadState_Loaded + collectionLoadState = meta.LoadState_Loaded + for _, partitionName := range showPartResp.PartitionNames { + partitionLoadStates[partitionName] = meta.LoadState_Loaded } } else { - collectionLoadState = LoadState_Loading - for _, partition := range partitions { - loadProgress, err := b.getMilvusClient().GetLoadingProgress(ctx, collectionBackup.GetDbName(), collectionBackup.GetCollectionName(), []string{partition.Name}) + collectionLoadState = meta.LoadState_Loading + for _, partitionName := range showPartResp.PartitionNames { + loadProgress, err := b.getMilvusClient().GetLoadingProgress(ctx, collectionBackup.GetDbName(), collectionBackup.GetCollectionName(), []string{partitionName}) if err != nil { log.Error("fail to GetLoadingProgress of partition", zap.Error(err)) return err } if loadProgress == 0 { - partitionLoadStates[partition.Name] = LoadState_NotLoad + partitionLoadStates[partitionName] = meta.LoadState_NotLoad } else if loadProgress == 100 { - partitionLoadStates[partition.Name] = LoadState_Loaded + partitionLoadStates[partitionName] = meta.LoadState_Loaded } else { - partitionLoadStates[partition.Name] = LoadState_Loading + partitionLoadStates[partitionName] = meta.LoadState_Loading } } } // fill segments - unfilledSegments := make([]*entity.Segment, 0) + unfilledSegments := make([]*milvuspb.PersistentSegmentInfo, 0) if !force { // Flush segmentEntitiesBeforeFlush, err := b.getMilvusClient().GetPersistentSegmentInfo(ctx, collectionBackup.GetDbName(), collectionBackup.GetCollectionName()) @@ -381,7 +396,7 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo zap.String("databaseName", collectionBackup.GetDbName()), zap.String("collectionName", collectionBackup.GetCollectionName()), zap.Int("segmentNumBeforeFlush", len(segmentEntitiesBeforeFlush))) - newSealedSegmentIDs, flushedSegmentIDs, timeOfSeal, channelCPs, err := b.getMilvusClient().FlushV2(ctx, collectionBackup.GetDbName(), collectionBackup.GetCollectionName(), false) + flushResp, err := b.getMilvusClient().Flush(ctx, collectionBackup.GetDbName(), collectionBackup.GetCollectionName()) if err != nil { log.Error("fail to flush the collection", zap.String("databaseName", collectionBackup.GetDbName()), @@ -393,8 +408,8 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo //collectionBackup.BackupTimestamp = utils.ComposeTS(timeOfSeal, 0) channelCheckpoints := make(map[string]string, 0) var maxChannelBackupTimeStamp uint64 = 0 - for vch, checkpoint := range channelCPs { - channelCheckpoints[vch] = utils.Base64MsgPosition(&checkpoint) + for vch, checkpoint := range flushResp.GetChannelCps() { + channelCheckpoints[vch] = utils.Base64MsgPosition(checkpoint) if maxChannelBackupTimeStamp == 0 { maxChannelBackupTimeStamp = checkpoint.GetTimestamp() } else if maxChannelBackupTimeStamp < checkpoint.GetTimestamp() { @@ -402,29 +417,29 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo } } b.meta.UpdateCollection(collectionBackup.Id, collectionBackup.CollectionId, - setCollectionChannelCheckpoints(channelCheckpoints), - setCollectionBackupTimestamp(maxChannelBackupTimeStamp), - setCollectionBackupPhysicalTimestamp(uint64(timeOfSeal))) + meta.SetCollectionChannelCheckpoints(channelCheckpoints), + meta.SetCollectionBackupTimestamp(maxChannelBackupTimeStamp), + meta.SetCollectionBackupPhysicalTimestamp(uint64(flushResp.GetCollSealTimes()[collectionBackup.GetCollectionName()]))) log.Info("flush segments", zap.String("databaseName", collectionBackup.GetDbName()), zap.String("collectionName", collectionBackup.GetCollectionName()), - zap.Int64s("newSealedSegmentIDs", newSealedSegmentIDs), - zap.Int64s("flushedSegmentIDs", flushedSegmentIDs), - zap.Int64("timeOfSeal", timeOfSeal), + zap.Int64s("newSealedSegmentIDs", flushResp.GetCollSegIDs()[collectionBackup.GetCollectionName()].GetData()), + zap.Int64s("flushedSegmentIDs", flushResp.GetFlushCollSegIDs()[collectionBackup.GetCollectionName()].GetData()), + zap.Uint64("timeOfSeal", uint64(flushResp.GetCollSealTimes()[collectionBackup.GetCollectionName()])), zap.Uint64("BackupTimestamp", collectionBackup.BackupTimestamp), - zap.Any("channelCPs", channelCPs)) + zap.Any("channelCPs", flushResp.GetChannelCps())) segmentEntitiesAfterFlush, err := b.getMilvusClient().GetPersistentSegmentInfo(ctx, collectionBackup.GetDbName(), collectionBackup.GetCollectionName()) if err != nil { return err } - segmentIDsBeforeFlush := lo.Map(segmentEntitiesBeforeFlush, func(segment *entity.Segment, _ int) int64 { return segment.ID }) - segmentIDsAfterFlush := lo.Map(segmentEntitiesAfterFlush, func(segment *entity.Segment, _ int) int64 { return segment.ID }) - newL0Segments := lo.Filter(segmentEntitiesAfterFlush, func(segment *entity.Segment, _ int) bool { - return !lo.Contains(segmentIDsBeforeFlush, segment.ID) && segment.NumRows == 0 + segmentIDsBeforeFlush := lo.Map(segmentEntitiesBeforeFlush, func(segment *milvuspb.PersistentSegmentInfo, _ int) int64 { return segment.SegmentID }) + segmentIDsAfterFlush := lo.Map(segmentEntitiesAfterFlush, func(segment *milvuspb.PersistentSegmentInfo, _ int) int64 { return segment.SegmentID }) + newL0Segments := lo.Filter(segmentEntitiesAfterFlush, func(segment *milvuspb.PersistentSegmentInfo, _ int) bool { + return !lo.Contains(segmentIDsBeforeFlush, segment.SegmentID) && segment.Level == commonpb.SegmentLevel_L0 }) - newL0SegmentsIDs := lo.Map(newL0Segments, func(segment *entity.Segment, _ int) int64 { return segment.ID }) + newL0SegmentsIDs := lo.Map(newL0Segments, func(segment *milvuspb.PersistentSegmentInfo, _ int) int64 { return segment.SegmentID }) log.Info("GetPersistentSegmentInfo after flush from milvus", zap.String("databaseName", collectionBackup.GetDbName()), @@ -452,7 +467,7 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo } } - newSegIDs := lo.Map(unfilledSegments, func(segment *entity.Segment, _ int) int64 { return segment.ID }) + newSegIDs := lo.Map(unfilledSegments, func(segment *milvuspb.PersistentSegmentInfo, _ int) int64 { return segment.SegmentID }) log.Debug("Finished fill segment", zap.String("databaseName", collectionBackup.GetDbName()), zap.String("collectionName", collectionBackup.GetCollectionName()), @@ -462,35 +477,35 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo for _, v := range unfilledSegments { segment := v segmentInfo := &backuppb.SegmentBackupInfo{ - SegmentId: segment.ID, + SegmentId: segment.SegmentID, CollectionId: segment.CollectionID, - PartitionId: segment.ParititionID, + PartitionId: segment.PartitionID, NumOfRows: segment.NumRows, } b.meta.AddSegment(segmentInfo) - partSegInfoMap[segment.ParititionID] = append(partSegInfoMap[segment.ParititionID], segmentInfo) + partSegInfoMap[segment.PartitionID] = append(partSegInfoMap[segment.PartitionID], segmentInfo) } - for _, partition := range partitions { - partitionSegments := partSegInfoMap[partition.ID] + for i, partitionID := range showPartResp.PartitionIDs { + partitionSegments := partSegInfoMap[partitionID] var size int64 = 0 for _, seg := range partitionSegments { size += seg.GetSize() } partitionBackupInfo := &backuppb.PartitionBackupInfo{ - PartitionId: partition.ID, - PartitionName: partition.Name, + PartitionId: partitionID, + PartitionName: showPartResp.PartitionNames[i], CollectionId: collectionBackup.GetCollectionId(), - SegmentBackups: partSegInfoMap[partition.ID], + SegmentBackups: partSegInfoMap[partitionID], Size: size, - LoadState: partitionLoadStates[partition.Name], + LoadState: partitionLoadStates[showPartResp.PartitionNames[i]], } b.meta.AddPartition(partitionBackupInfo) } l0segments, exist := partSegInfoMap[-1] if exist { - b.meta.UpdateCollection(collectionBackup.Id, collectionBackup.CollectionId, setL0Segments(l0segments)) + b.meta.UpdateCollection(collectionBackup.Id, collectionBackup.CollectionId, meta.SetL0Segments(l0segments)) } partitionBackupInfos := b.meta.GetPartitions(collectionBackup.CollectionId) @@ -504,14 +519,14 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo collectionBackupSize += part.GetSize() } - b.meta.UpdateCollection(collectionBackup.Id, collectionBackup.CollectionId, setCollectionLoadState(collectionLoadState), setCollectionSize(collectionBackupSize)) + b.meta.UpdateCollection(collectionBackup.Id, collectionBackup.CollectionId, meta.SetCollectionLoadState(collectionLoadState), meta.SetCollectionSize(collectionBackupSize)) return nil } func (b *BackupContext) backupCollectionExecute(ctx context.Context, collectionBackup *backuppb.CollectionBackupInfo) error { log.Info("backupCollectionExecute", zap.Any("collectionMeta", collectionBackup.String())) backupInfo := b.meta.GetBackupByCollectionID(collectionBackup.GetCollectionId()) - backupBinlogPath := BackupBinlogDirPath(b.backupRootPath, backupInfo.GetName()) + backupBinlogPath := meta.BackupBinlogDirPath(b.backupRootPath, backupInfo.GetName()) for _, partition := range b.meta.GetPartitions(collectionBackup.CollectionId) { segmentBackupInfos := make([]*backuppb.SegmentBackupInfo, 0) var currentSize int64 = 0 @@ -533,14 +548,14 @@ func (b *BackupContext) backupCollectionExecute(ctx context.Context, collectionB currentSize = 0 } currentSize = currentSize + segment.GetSize() - b.meta.UpdateSegment(segment.GetPartitionId(), segment.GetSegmentId(), setGroupID(groupID)) + b.meta.UpdateSegment(segment.GetPartitionId(), segment.GetSegmentId(), meta.SetGroupID(groupID)) } else { //if currentSize > BackupSegmentGroupMaxSizeInMB*1024*1024 { // 256MB // l0GroupID++ // currentL0Size = 0 //} //currentL0Size = currentL0Size + segment.GetSize() - b.meta.UpdateSegment(segment.GetPartitionId(), segment.GetSegmentId(), setGroupID(segment.GetSegmentId())) + b.meta.UpdateSegment(segment.GetPartitionId(), segment.GetSegmentId(), meta.SetGroupID(segment.GetSegmentId())) } segmentBackupInfos = append(segmentBackupInfos, segment) } @@ -581,9 +596,9 @@ func (b *BackupContext) backupCollectionExecute(ctx context.Context, collectionB log.Error("Fail to fill segment backup info", zap.Error(err)) return err } - b.meta.UpdateCollection(collectionBackup.Id, collectionBackup.CollectionId, setL0Segments(segmentBackupInfos)) + b.meta.UpdateCollection(collectionBackup.Id, collectionBackup.CollectionId, meta.SetL0Segments(segmentBackupInfos)) - b.meta.UpdateCollection(collectionBackup.Id, collectionBackup.CollectionId, setCollectionEndTime(time.Now().Unix())) + b.meta.UpdateCollection(collectionBackup.Id, collectionBackup.CollectionId, meta.SetCollectionEndTime(time.Now().Unix())) log.Info("Finish copy data", zap.String("dbName", collectionBackup.GetDbName()), zap.String("collectionName", collectionBackup.GetCollectionName())) @@ -598,14 +613,14 @@ func (b *BackupContext) pauseMilvusGC(ctx context.Context, gcAddress string, pau response, err := http.Get(fullURL) if err != nil { - log.Warn("Pause Milvus GC Error:"+GC_Warn_Message, zap.Error(err)) + log.Warn("Pause Milvus GC Error:"+GcWarnMessage, zap.Error(err)) return } defer response.Body.Close() // Read the response body body, err := ioutil.ReadAll(response.Body) if err != nil { - log.Warn("Read response Error:"+GC_Warn_Message, zap.Error(err)) + log.Warn("Read response Error:"+GcWarnMessage, zap.Error(err)) return } log.Info("Pause Milvus GC response", zap.String("response", string(body)), zap.String("address", gcAddress), zap.Int("pauseSeconds", pauseSeconds)) @@ -616,13 +631,13 @@ func (b *BackupContext) resumeMilvusGC(ctx context.Context, gcAddress string) { fullURL := gcAddress + pauseAPI response, err := http.Get(fullURL) if err != nil { - log.Warn("Resume Milvus GC Error:"+GC_Warn_Message, zap.Error(err)) + log.Warn("Resume Milvus GC Error:"+GcWarnMessage, zap.Error(err)) return } // Read the response body body, err := ioutil.ReadAll(response.Body) if err != nil { - log.Warn("Read response Error:"+GC_Warn_Message, zap.Error(err)) + log.Warn("Read response Error:"+GcWarnMessage, zap.Error(err)) return } log.Info("Resume Milvus GC response", zap.String("response", string(body)), zap.String("address", gcAddress)) @@ -633,7 +648,7 @@ func (b *BackupContext) executeCreateBackup(ctx context.Context, request *backup defer b.mu.Unlock() // set backup state - b.meta.UpdateBackup(backupInfo.Id, setStateCode(backuppb.BackupTaskStateCode_BACKUP_EXECUTING)) + b.meta.UpdateBackup(backupInfo.Id, meta.SetStateCode(backuppb.BackupTaskStateCode_BACKUP_EXECUTING)) // pause GC if request.GetGcPauseEnable() || b.params.BackupCfg.GcPauseEnable { @@ -657,7 +672,7 @@ func (b *BackupContext) executeCreateBackup(ctx context.Context, request *backup toBackupCollections, err := b.parseBackupCollections(request) if err != nil { log.Error("parse backup collections from request failed", zap.Error(err)) - b.meta.UpdateBackup(backupInfo.Id, setStateCode(backuppb.BackupTaskStateCode_BACKUP_FAIL), setErrorMessage(err.Error())) + b.meta.UpdateBackup(backupInfo.Id, meta.SetStateCode(backuppb.BackupTaskStateCode_BACKUP_FAIL), meta.SetErrorMessage(err.Error())) return err } collectionNames := make([]string, len(toBackupCollections)) @@ -695,7 +710,7 @@ func (b *BackupContext) executeCreateBackup(ctx context.Context, request *backup } err = b.getBackupCollectionWorkerPool().WaitJobs(jobIds) if err != nil { - b.meta.UpdateBackup(backupInfo.Id, setStateCode(backuppb.BackupTaskStateCode_BACKUP_FAIL), setErrorMessage(err.Error())) + b.meta.UpdateBackup(backupInfo.Id, meta.SetStateCode(backuppb.BackupTaskStateCode_BACKUP_FAIL), meta.SetErrorMessage(err.Error())) return err } log.Info("Finish prepare all collections meta") @@ -714,14 +729,14 @@ func (b *BackupContext) executeCreateBackup(ctx context.Context, request *backup err = b.getBackupCollectionWorkerPool().WaitJobs(jobIds) if err != nil { - b.meta.UpdateBackup(backupInfo.Id, setStateCode(backuppb.BackupTaskStateCode_BACKUP_FAIL), setErrorMessage(err.Error())) + b.meta.UpdateBackup(backupInfo.Id, meta.SetStateCode(backuppb.BackupTaskStateCode_BACKUP_FAIL), meta.SetErrorMessage(err.Error())) return err } } else { log.Info("skip copy data because it is a metaOnly backup request") } backupInfo.StateCode = backuppb.BackupTaskStateCode_BACKUP_SUCCESS - b.meta.UpdateBackup(backupInfo.Id, setStateCode(backuppb.BackupTaskStateCode_BACKUP_SUCCESS), setEndTime(time.Now().UnixNano()/int64(time.Millisecond))) + b.meta.UpdateBackup(backupInfo.Id, meta.SetStateCode(backuppb.BackupTaskStateCode_BACKUP_SUCCESS), meta.SetEndTime(time.Now().UnixNano()/int64(time.Millisecond))) if request.GetRbac() { err = b.backupRBAC(ctx, backupInfo) @@ -737,8 +752,8 @@ func (b *BackupContext) executeCreateBackup(ctx context.Context, request *backup if err != nil { backupInfo.StateCode = backuppb.BackupTaskStateCode_BACKUP_FAIL backupInfo.ErrorMessage = err.Error() - b.meta.UpdateBackup(backupInfo.Id, setStateCode(backuppb.BackupTaskStateCode_BACKUP_FAIL), - setErrorMessage(err.Error())) + b.meta.UpdateBackup(backupInfo.Id, meta.SetStateCode(backuppb.BackupTaskStateCode_BACKUP_FAIL), + meta.SetErrorMessage(err.Error())) return err } log.Info("finish backup all collections", @@ -752,7 +767,7 @@ func (b *BackupContext) executeCreateBackup(ctx context.Context, request *backup func (b *BackupContext) writeBackupInfoMeta(ctx context.Context, id string) error { backupInfo := b.meta.GetFullMeta(id) log.Debug("Final backupInfo", zap.String("backupInfo", backupInfo.String())) - output, _ := serialize(backupInfo) + output, _ := meta.Serialize(backupInfo) log.Debug("backup meta", zap.String("value", string(output.BackupMetaBytes))) log.Debug("collection meta", zap.String("value", string(output.CollectionMetaBytes))) log.Debug("partition meta", zap.String("value", string(output.PartitionMetaBytes))) @@ -777,15 +792,15 @@ func (b *BackupContext) writeBackupInfoMeta(ctx context.Context, id string) erro } log.Debug("channel cp meta", zap.String("value", string(channelCPsBytes))) - b.getBackupStorageClient().Write(ctx, b.backupBucketName, BackupMetaPath(b.backupRootPath, backupInfo.GetName()), output.BackupMetaBytes) - b.getBackupStorageClient().Write(ctx, b.backupBucketName, CollectionMetaPath(b.backupRootPath, backupInfo.GetName()), output.CollectionMetaBytes) - b.getBackupStorageClient().Write(ctx, b.backupBucketName, PartitionMetaPath(b.backupRootPath, backupInfo.GetName()), output.PartitionMetaBytes) - b.getBackupStorageClient().Write(ctx, b.backupBucketName, SegmentMetaPath(b.backupRootPath, backupInfo.GetName()), output.SegmentMetaBytes) - b.getBackupStorageClient().Write(ctx, b.backupBucketName, FullMetaPath(b.backupRootPath, backupInfo.GetName()), output.FullMetaBytes) - b.getBackupStorageClient().Write(ctx, b.backupBucketName, ChannelCPMetaPath(b.backupRootPath, backupInfo.GetName()), channelCPsBytes) + b.getBackupStorageClient().Write(ctx, b.backupBucketName, meta.BackupMetaPath(b.backupRootPath, backupInfo.GetName()), output.BackupMetaBytes) + b.getBackupStorageClient().Write(ctx, b.backupBucketName, meta.CollectionMetaPath(b.backupRootPath, backupInfo.GetName()), output.CollectionMetaBytes) + b.getBackupStorageClient().Write(ctx, b.backupBucketName, meta.PartitionMetaPath(b.backupRootPath, backupInfo.GetName()), output.PartitionMetaBytes) + b.getBackupStorageClient().Write(ctx, b.backupBucketName, meta.SegmentMetaPath(b.backupRootPath, backupInfo.GetName()), output.SegmentMetaBytes) + b.getBackupStorageClient().Write(ctx, b.backupBucketName, meta.FullMetaPath(b.backupRootPath, backupInfo.GetName()), output.FullMetaBytes) + b.getBackupStorageClient().Write(ctx, b.backupBucketName, meta.ChannelCPMetaPath(b.backupRootPath, backupInfo.GetName()), channelCPsBytes) log.Info("finish writeBackupInfoMeta", - zap.String("path", BackupDirPath(b.backupRootPath, backupInfo.GetName())), + zap.String("path", meta.BackupDirPath(b.backupRootPath, backupInfo.GetName())), zap.String("backupName", backupInfo.GetName()), zap.String("backup meta", string(output.BackupMetaBytes))) return nil @@ -818,7 +833,7 @@ func (b *BackupContext) copySegment(ctx context.Context, backupBinlogPath string // backup_rootpath/backup_name/binlog/insert_log/collection_id/partition_id/group_id/segment_id backupPathFunc := func(binlogPath, rootPath, backupBinlogPath string) string { if rootPath == "" { - return backupBinlogPath + SEPERATOR + binlogPath + return backupBinlogPath + meta.SEPERATOR + binlogPath } else { return strings.Replace(binlogPath, rootPath, backupBinlogPath, 1) } @@ -916,7 +931,7 @@ func (b *BackupContext) copySegment(ctx context.Context, backupBinlogPath string } } } - b.meta.UpdateSegment(segment.GetPartitionId(), segment.GetSegmentId(), setSegmentBackuped(true)) + b.meta.UpdateSegment(segment.GetPartitionId(), segment.GetSegmentId(), meta.SetSegmentBackuped(true)) return nil } @@ -946,7 +961,7 @@ func (b *BackupContext) fillSegmentBackupInfo(ctx context.Context, segmentBackup insertLogs := make([]*backuppb.FieldBinlog, 0) for _, fieldLogDir := range fieldsLogDir { binlogPaths, sizes, _ := b.getMilvusStorageClient().ListWithPrefix(ctx, b.milvusBucketName, fieldLogDir, false) - fieldIdStr := strings.Replace(strings.Replace(fieldLogDir, insertPath, "", 1), SEPERATOR, "", -1) + fieldIdStr := strings.Replace(strings.Replace(fieldLogDir, insertPath, "", 1), meta.SEPERATOR, "", -1) fieldId, _ := strconv.ParseInt(fieldIdStr, 10, 64) binlogs := make([]*backuppb.Binlog, 0) for index, binlogPath := range binlogPaths { @@ -967,7 +982,7 @@ func (b *BackupContext) fillSegmentBackupInfo(ctx context.Context, segmentBackup deltaLogs := make([]*backuppb.FieldBinlog, 0) for _, deltaFieldLogDir := range deltaFieldsLogDir { binlogPaths, sizes, _ := b.getMilvusStorageClient().ListWithPrefix(ctx, b.milvusBucketName, deltaFieldLogDir, false) - fieldIdStr := strings.Replace(strings.Replace(deltaFieldLogDir, deltaLogPath, "", 1), SEPERATOR, "", -1) + fieldIdStr := strings.Replace(strings.Replace(deltaFieldLogDir, deltaLogPath, "", 1), meta.SEPERATOR, "", -1) fieldId, _ := strconv.ParseInt(fieldIdStr, 10, 64) binlogs := make([]*backuppb.Binlog, 0) for index, binlogPath := range binlogPaths { @@ -983,60 +998,36 @@ func (b *BackupContext) fillSegmentBackupInfo(ctx context.Context, segmentBackup }) } if len(deltaLogs) == 0 { - deltaLogs = append(deltaLogs, &backuppb.FieldBinlog{ - FieldID: 0, - }) + deltaLogs = append(deltaLogs, &backuppb.FieldBinlog{FieldID: 0}) } - //statsLogPath := fmt.Sprintf("%s/%s/%v/%v/%v/", b.params.MinioCfg.RootPath, "stats_log", collectionID, partitionID, segmentID) - //statsFieldsLogDir, _, _ := b.milvusStorageClient.ListWithPrefix(ctx, b.milvusBucketName, statsLogPath, false) - //statsLogs := make([]*backuppb.FieldBinlog, 0) - //for _, statsFieldLogDir := range statsFieldsLogDir { - // binlogPaths, sizes, _ := b.milvusStorageClient.ListWithPrefix(ctx, b.milvusBucketName, statsFieldLogDir, false) - // fieldIdStr := strings.Replace(strings.Replace(statsFieldLogDir, statsLogPath, "", 1), SEPERATOR, "", -1) - // fieldId, _ := strconv.ParseInt(fieldIdStr, 10, 64) - // binlogs := make([]*backuppb.Binlog, 0) - // for index, binlogPath := range binlogPaths { - // binlogs = append(binlogs, &backuppb.Binlog{ - // LogPath: binlogPath, - // LogSize: sizes[index], - // }) - // } - // statsLogs = append(statsLogs, &backuppb.FieldBinlog{ - // FieldID: fieldId, - // Binlogs: binlogs, - // }) - //} - - //segmentBackupInfo.Binlogs = insertLogs - //segmentBackupInfo.Deltalogs = deltaLogs segmentBackupInfo.Size = size segmentBackupInfo.IsL0 = isL0 - b.meta.UpdateSegment(segmentBackupInfo.GetPartitionId(), segmentBackupInfo.GetSegmentId(), setSegmentBinlogs(insertLogs), setSegmentDeltaBinlogs(deltaLogs), setSegmentSize(size), setSegmentL0(isL0)) + b.meta.UpdateSegment(segmentBackupInfo.GetPartitionId(), segmentBackupInfo.GetSegmentId(), meta.SetSegmentBinlogs(insertLogs), meta.SetSegmentDeltaBinlogs(deltaLogs), meta.SetSegmentSize(size), meta.SetSegmentL0(isL0)) log.Debug("fill segment info", zap.Int64("segId", segmentBackupInfo.GetSegmentId()), zap.Int64("size", size)) return nil } func (b *BackupContext) backupRBAC(ctx context.Context, backupInfo *backuppb.BackupInfo) error { log.Info("backup RBAC") - rbacMeta, err := b.getMilvusClient().BackupRBAC(ctx) + resp, err := b.getMilvusClient().BackupRBAC(ctx) if err != nil { log.Error("fail in BackupMeta", zap.Error(err)) return err } + rbacMeta := resp.RBACMeta - users := make([]*backuppb.UserInfo, 0) - roles := make([]*backuppb.RoleEntity, 0) - grants := make([]*backuppb.GrantEntity, 0) - + users := make([]*backuppb.UserInfo, 0, len(rbacMeta.Users)) + roles := make([]*backuppb.RoleEntity, 0, len(rbacMeta.Roles)) + grants := make([]*backuppb.GrantEntity, 0, len(rbacMeta.Grants)) for _, user := range rbacMeta.Users { - roles := lo.Map(user.Roles, func(role string, index int) *backuppb.RoleEntity { - return &backuppb.RoleEntity{Name: role} + rs := lo.Map(user.Roles, func(role *milvuspb.RoleEntity, index int) *backuppb.RoleEntity { + return &backuppb.RoleEntity{Name: role.Name} }) userP := &backuppb.UserInfo{ - User: user.Name, + User: user.User, Password: user.Password, - Roles: roles, + Roles: rs, } users = append(users, userP) } @@ -1048,21 +1039,21 @@ func (b *BackupContext) backupRBAC(ctx context.Context, backupInfo *backuppb.Bac roles = append(roles, roleP) } - for _, roleGrant := range rbacMeta.RoleGrants { + for _, roleGrant := range rbacMeta.Grants { roleGrantP := &backuppb.GrantEntity{ Role: &backuppb.RoleEntity{ - Name: roleGrant.RoleName, + Name: roleGrant.Role.Name, }, Object: &backuppb.ObjectEntity{ - Name: roleGrant.Object, + Name: roleGrant.Object.Name, }, ObjectName: roleGrant.ObjectName, Grantor: &backuppb.GrantorEntity{ User: &backuppb.UserEntity{ - Name: roleGrant.GrantorName, + Name: roleGrant.Grantor.User.Name, }, Privilege: &backuppb.PrivilegeEntity{ - Name: roleGrant.PrivilegeName, + Name: roleGrant.Grantor.Privilege.Name, }, }, DbName: roleGrant.DbName, @@ -1077,6 +1068,6 @@ func (b *BackupContext) backupRBAC(ctx context.Context, backupInfo *backuppb.Bac } log.Info("backup RBAC", zap.Int("users", len(users)), zap.Int("roles", len(roles)), zap.Int("grants", len(grants))) - b.meta.UpdateBackup(backupInfo.Id, setRBACMeta(rbacPb)) + b.meta.UpdateBackup(backupInfo.Id, meta.SetRBACMeta(rbacPb)) return nil } diff --git a/core/backup_impl_restore_backup.go b/core/backup_impl_restore_backup.go index 05ffeb5..03de97a 100644 --- a/core/backup_impl_restore_backup.go +++ b/core/backup_impl_restore_backup.go @@ -3,25 +3,21 @@ package core import ( "context" "fmt" - "path" "strings" "time" - "github.com/cockroachdb/errors" - "github.com/golang/protobuf/proto" + "github.com/zilliztech/milvus-backup/core/meta" + "github.com/zilliztech/milvus-backup/core/restore" + jsoniter "github.com/json-iterator/go" - "github.com/milvus-io/milvus-proto/go-api/v2/schemapb" - gomilvus "github.com/milvus-io/milvus-sdk-go/v2/client" - "github.com/milvus-io/milvus-sdk-go/v2/entity" + "github.com/milvus-io/milvus-proto/go-api/v2/milvuspb" "github.com/samber/lo" - "go.uber.org/atomic" "go.uber.org/zap" "github.com/zilliztech/milvus-backup/core/proto/backuppb" "github.com/zilliztech/milvus-backup/core/utils" "github.com/zilliztech/milvus-backup/internal/common" "github.com/zilliztech/milvus-backup/internal/log" - "github.com/zilliztech/milvus-backup/internal/util/retry" ) func (b *BackupContext) RestoreBackup(ctx context.Context, request *backuppb.RestoreBackupRequest) *backuppb.RestoreBackupResponse { @@ -62,7 +58,7 @@ func (b *BackupContext) RestoreBackup(ctx context.Context, request *backuppb.Res // 1, get and validate if request.GetCollectionSuffix() != "" { - err := utils.ValidateType(request.GetCollectionSuffix(), COLLECTION_RENAME_SUFFIX) + err := utils.ValidateType(request.GetCollectionSuffix(), CollectionRenameSuffix) if err != nil { log.Error("illegal collection rename suffix", zap.Error(err)) resp.Code = backuppb.ResponseCode_Parameter_Error @@ -81,10 +77,10 @@ func (b *BackupContext) RestoreBackup(ctx context.Context, request *backuppb.Res var backupPath string if request.GetBucketName() == "" || request.GetPath() == "" { backupBucketName = b.backupBucketName - backupPath = b.backupRootPath + SEPERATOR + request.GetBackupName() + backupPath = b.backupRootPath + meta.SEPERATOR + request.GetBackupName() } else { backupBucketName = request.GetBucketName() - backupPath = request.GetPath() + SEPERATOR + request.GetBackupName() + backupPath = request.GetPath() + meta.SEPERATOR + request.GetBackupName() } if getResp.GetCode() != backuppb.ResponseCode_Success { @@ -138,7 +134,7 @@ func (b *BackupContext) RestoreBackup(ctx context.Context, request *backuppb.Res dbCollectionsStr := utils.GetRestoreDBCollections(request) if dbCollectionsStr != "" { - var dbCollections DbCollections + var dbCollections meta.DbCollections err := jsoniter.UnmarshalFromString(dbCollectionsStr, &dbCollections) if err != nil { log.Error("fail in unmarshal dbCollections in RestoreBackupRequest", zap.String("dbCollections", dbCollectionsStr), zap.Error(err)) @@ -252,7 +248,7 @@ func (b *BackupContext) RestoreBackup(ctx context.Context, request *backuppb.Res } var hasDatabase = false for _, db := range dbs { - if db.Name == targetDBName { + if db == targetDBName { hasDatabase = true break } @@ -269,7 +265,7 @@ func (b *BackupContext) RestoreBackup(ctx context.Context, request *backuppb.Res log.Info("create database", zap.String("database", targetDBName)) } - // check if the collection exist, if exist, will not restore + // check if the collection exist, if existed, will not restore if !request.GetSkipCreateCollection() { exist, err := b.getMilvusClient().HasCollection(ctx, targetDBName, targetCollectionName) if err != nil { @@ -358,7 +354,7 @@ func (b *BackupContext) executeRestoreBackupTask(ctx context.Context, backupBuck log.Info("Start collection level restore pool", zap.Int("parallelism", b.params.BackupCfg.RestoreParallelism)) id := task.GetId() - b.meta.UpdateRestoreTask(id, setRestoreStateCode(backuppb.RestoreTaskStateCode_EXECUTING)) + b.meta.UpdateRestoreTask(id, meta.SetRestoreStateCode(backuppb.RestoreTaskStateCode_EXECUTING)) log.Info("executeRestoreBackupTask start", zap.String("backup_name", backup.GetName()), zap.String("backupBucketName", backupBucketName), @@ -372,11 +368,11 @@ func (b *BackupContext) executeRestoreBackupTask(ctx context.Context, backupBuck job := func(ctx context.Context) error { endTask, err := b.executeRestoreCollectionTask(ctx, backupBucketName, backupPath, restoreCollectionTaskClone, id) if err != nil { - b.meta.UpdateRestoreTask(id, setRestoreStateCode(backuppb.RestoreTaskStateCode_FAIL), - setRestoreErrorMessage(endTask.ErrorMessage)) + b.meta.UpdateRestoreTask(id, meta.SetRestoreStateCode(backuppb.RestoreTaskStateCode_FAIL), + meta.SetRestoreErrorMessage(endTask.ErrorMessage)) b.meta.UpdateRestoreCollectionTask(id, endTask.Id, - setRestoreCollectionStateCode(backuppb.RestoreTaskStateCode_FAIL), - setRestoreCollectionErrorMessage(endTask.ErrorMessage)) + meta.SetRestoreCollectionStateCode(backuppb.RestoreTaskStateCode_FAIL), + meta.SetRestoreCollectionErrorMessage(endTask.ErrorMessage)) log.Error("executeRestoreCollectionTask failed", zap.String("TargetDBName", restoreCollectionTaskClone.GetTargetDbName()), zap.String("TargetCollectionName", restoreCollectionTaskClone.GetTargetCollectionName()), @@ -400,7 +396,7 @@ func (b *BackupContext) executeRestoreBackupTask(ctx context.Context, backupBuck endTime := time.Now().Unix() task.EndTime = endTime - b.meta.UpdateRestoreTask(id, setRestoreStateCode(backuppb.RestoreTaskStateCode_SUCCESS), setRestoreEndTime(endTime)) + b.meta.UpdateRestoreTask(id, meta.SetRestoreStateCode(backuppb.RestoreTaskStateCode_SUCCESS), meta.SetRestoreEndTime(endTime)) log.Info("finish restore all collections", zap.String("backupName", backup.GetName()), @@ -411,575 +407,72 @@ func (b *BackupContext) executeRestoreBackupTask(ctx context.Context, backupBuck } func (b *BackupContext) executeRestoreCollectionTask(ctx context.Context, backupBucketName string, backupPath string, task *backuppb.RestoreCollectionTask, parentTaskID string) (*backuppb.RestoreCollectionTask, error) { - targetDBName := task.GetTargetDbName() - targetCollectionName := task.GetTargetCollectionName() - task.StateCode = backuppb.RestoreTaskStateCode_EXECUTING - log := log.With( - zap.String("backup_db_name", task.GetCollBackup().DbName), - zap.String("backup_collection_name", task.GetCollBackup().DbName), - zap.String("target_db_name", targetDBName), - zap.String("target_collection_name", targetCollectionName), - zap.Bool("skipDiskQuotaCheck", task.GetSkipDiskQuotaCheck()), - zap.Int32("maxShardNum", task.GetMaxShardNum())) - log.Info("start restore", - zap.String("backupBucketName", backupBucketName), - zap.String("backupPath", backupPath)) - // create collection - fields := make([]*entity.Field, 0) - hasPartitionKey := false - for _, field := range task.GetCollBackup().GetSchema().GetFields() { - fieldRestore := &entity.Field{ - ID: field.GetFieldID(), - Name: field.GetName(), - PrimaryKey: field.GetIsPrimaryKey(), - AutoID: field.GetAutoID(), - Description: field.GetDescription(), - DataType: entity.FieldType(field.GetDataType()), - TypeParams: utils.KvPairsMap(field.GetTypeParams()), - IndexParams: utils.KvPairsMap(field.GetIndexParams()), - IsDynamic: field.GetIsDynamic(), - IsPartitionKey: field.GetIsPartitionKey(), - Nullable: field.GetNullable(), - ElementType: entity.FieldType(field.GetElementType()), - } - if field.DefaultValueProto != "" { - defaultValue := &schemapb.ValueField{} - err := proto.Unmarshal([]byte(field.DefaultValueProto), defaultValue) - if err != nil { - return nil, err - } - fieldRestore.DefaultValue = defaultValue - } - - fields = append(fields, fieldRestore) - if field.GetIsPartitionKey() { - hasPartitionKey = true - } - } - - log.Info("collection schema", zap.Any("fields", fields)) - - collectionSchema := &entity.Schema{ - CollectionName: targetCollectionName, - Description: task.GetCollBackup().GetSchema().GetDescription(), - AutoID: task.GetCollBackup().GetSchema().GetAutoID(), - Fields: fields, - EnableDynamicField: task.GetCollBackup().GetSchema().GetEnableDynamicField(), - } - - if task.GetDropExistCollection() { - //check if the collection exist, if collection exist, will drop it - exist, err := b.milvusClient.HasCollection(ctx, targetDBName, targetCollectionName) - if err != nil { - errorMsg := fmt.Sprintf("fail to check whether the collection is exist, collection_name: %s, err: %s", targetCollectionName, err) - log.Error(errorMsg) - } - if exist { - err := b.milvusClient.DropCollection(ctx, targetDBName, targetCollectionName) - if err != nil { - errorMsg := fmt.Sprintf("fail to drop collection, CollectionName: %s.%s err: %s", targetDBName, targetCollectionName, err) - log.Error(errorMsg) - task.StateCode = backuppb.RestoreTaskStateCode_FAIL - task.ErrorMessage = errorMsg - return task, err - } - } - } - //in function RestoreBackup, before executing the restore, - //the SkipCreateCollection has been checked, - //so here it is necessary to be compatible with the situation where SkipCreateCollection and DropExistCollection are enabled at the same time. - if !task.GetSkipCreateCollection() || task.GetDropExistCollection() { - err := retry.Do(ctx, func() error { - // overwrite shardNum by request parameter - shardNum := task.GetCollBackup().GetShardsNum() - if shardNum > task.GetMaxShardNum() && task.GetMaxShardNum() != 0 { - shardNum = task.GetMaxShardNum() - log.Info("overwrite shardNum by request parameter", zap.Int32("oldShardNum", task.GetCollBackup().GetShardsNum()), zap.Int32("newShardNum", shardNum)) - - } - if hasPartitionKey { - partitionNum := len(task.GetCollBackup().GetPartitionBackups()) - return b.getMilvusClient().CreateCollection( - ctx, - targetDBName, - collectionSchema, - shardNum, - gomilvus.WithConsistencyLevel(entity.ConsistencyLevel(task.GetCollBackup().GetConsistencyLevel())), - gomilvus.WithPartitionNum(int64(partitionNum))) - } - return b.getMilvusClient().CreateCollection( - ctx, - targetDBName, - collectionSchema, - shardNum, - gomilvus.WithConsistencyLevel(entity.ConsistencyLevel(task.GetCollBackup().GetConsistencyLevel()))) - }, retry.Attempts(10), retry.Sleep(1*time.Second)) - if err != nil { - errorMsg := fmt.Sprintf("fail to create collection, targetCollectionName: %s err: %s", targetCollectionName, err) - log.Error(errorMsg) - task.StateCode = backuppb.RestoreTaskStateCode_FAIL - task.ErrorMessage = errorMsg - return task, err - } - log.Info("create collection", - zap.Bool("hasPartitionKey", hasPartitionKey)) - } else { - log.Info("skip create collection", - zap.Bool("hasPartitionKey", hasPartitionKey)) - } - - if task.GetDropExistIndex() { - for _, field := range task.CollBackup.Schema.Fields { - fieldIndexs, err := b.getMilvusClient().DescribeIndex(b.ctx, targetDBName, targetCollectionName, field.Name) - if err != nil { - if strings.Contains(err.Error(), "index not found") || - strings.HasPrefix(err.Error(), "index doesn't exist") { - // todo - log.Info("field has no index", - zap.String("field_name", field.Name)) - continue - } else { - log.Error("fail in DescribeIndex", zap.Error(err)) - return task, err - } - } - for _, fieldIndex := range fieldIndexs { - err = b.milvusClient.DropIndex(ctx, targetDBName, targetCollectionName, fieldIndex.Name()) - if err != nil { - log.Warn("Fail to drop index", - zap.Error(err)) - return task, err - } - log.Info("drop index", - zap.String("field_name", field.Name), - zap.String("index_name", fieldIndex.Name())) - } - } - } - - if task.GetRestoreIndex() { - vectorFields := make(map[string]bool, 0) - for _, field := range collectionSchema.Fields { - if strings.HasSuffix(strings.ToLower(field.DataType.Name()), "vector") { - vectorFields[field.Name] = true - } - } - indexes := task.GetCollBackup().GetIndexInfos() - for _, index := range indexes { - var idx entity.Index - log.Info("source index", - zap.String("indexName", index.GetIndexName()), - zap.String("indexType", index.GetIndexType()), - zap.Any("params", index.GetParams())) - if _, ok := vectorFields[index.GetFieldName()]; ok && task.GetUseAutoIndex() { - log.Info("use auto index") - params := make(map[string]string, 0) - // auto index only support index_type and metric_type in params - params["index_type"] = "AUTOINDEX" - params["metric_type"] = index.GetParams()["metric_type"] - idx = entity.NewGenericIndex(index.GetIndexName(), entity.AUTOINDEX, params) - } else { - log.Info("not auto index") - indexType := index.GetIndexType() - if indexType == "marisa-trie" { - indexType = "Trie" - } - params := index.GetParams() - if params["index_type"] == "marisa-trie" { - params["index_type"] = "Trie" - } - idx = entity.NewGenericIndex(index.GetIndexName(), entity.IndexType(indexType), index.GetParams()) - } - err := b.getMilvusClient().CreateIndex(ctx, targetDBName, targetCollectionName, index.GetFieldName(), idx, true) - if err != nil { - log.Warn("Fail to restore index", zap.Error(err)) - return task, err - } - } - } - - tempDir := fmt.Sprintf("restore-temp-%s-%s-%s%s", parentTaskID, task.TargetDbName, task.TargetCollectionName, SEPERATOR) - isSameBucket := b.milvusBucketName == backupBucketName - isSameStorage := b.getMilvusStorageClient().Config().StorageType == b.getBackupStorageClient().Config().StorageType - // clean the temporary file - defer func() { - if !isSameBucket && !b.params.BackupCfg.KeepTempFiles { - log.Info("Delete temporary file", zap.String("dir", tempDir)) - err := b.getMilvusStorageClient().RemoveWithPrefix(ctx, b.milvusBucketName, tempDir) - if err != nil { - log.Warn("Delete temporary file failed", zap.Error(err)) - } - } - }() - - // bulk insert - copyAndBulkInsert := func(dbName, collectionName, partitionName string, files []string, isL0 bool, skipDiskQuotaCheck bool) error { - realFiles := make([]string, len(files)) - // if milvus bucket and backup bucket are not the same, should copy the data first - if !isSameBucket || !isSameStorage { - log.Info("milvus and backup store in different bucket, copy the data first", zap.Strings("files", files), zap.String("copyDataPath", tempDir)) - for i, file := range files { - // empty delta file, no need to copy - if file == "" { - realFiles[i] = file - } else { - tempFileKey := path.Join(tempDir, strings.Replace(file, b.params.MinioCfg.BackupRootPath, "", 1)) + SEPERATOR - log.Debug("Copy temporary restore file", zap.String("from", file), zap.String("to", tempFileKey)) - err := retry.Do(ctx, func() error { - return b.getRestoreCopier().Copy(ctx, file, tempFileKey, backupBucketName, b.milvusBucketName) - }, retry.Sleep(2*time.Second), retry.Attempts(5)) - if err != nil { - log.Error("fail to copy backup date from backup bucket to restore target milvus bucket after retry", zap.Error(err)) - return err - } - realFiles[i] = tempFileKey - } - } - } else { - realFiles = files - } - - err := b.executeBulkInsert(ctx, dbName, collectionName, partitionName, realFiles, int64(task.GetCollBackup().BackupTimestamp), isL0, skipDiskQuotaCheck) - if err != nil { - log.Error("fail to bulk insert to partition", - zap.String("partition", partitionName), - zap.Error(err)) - return err - } - return nil - } - - jobIds := make([]int64, 0) - restoredSize := atomic.Int64{} - - type partitionL0Segment struct { - collectionID int64 - partitionName string - partitionID int64 - segmentID int64 - } - partitionL0Segments := make([]partitionL0Segment, 0) - for _, v := range task.GetCollBackup().GetPartitionBackups() { - partitionBackup := v - log.Info("start restore partition", zap.String("partition", partitionBackup.GetPartitionName())) - // pre-check whether partition exist, if not create it - exist, err := b.getMilvusClient().HasPartition(ctx, targetDBName, targetCollectionName, partitionBackup.GetPartitionName()) - if err != nil { - log.Error("fail to check has partition", zap.Error(err)) - return task, err - } - if !exist { - err = retry.Do(ctx, func() error { - return b.getMilvusClient().CreatePartition(ctx, targetDBName, targetCollectionName, partitionBackup.GetPartitionName()) - }, retry.Attempts(10), retry.Sleep(1*time.Second)) - if err != nil { - log.Error("fail to create partition", zap.Error(err)) - return task, err - } - log.Info("create partition", zap.String("partitionName", partitionBackup.GetPartitionName())) - } - - type restoreGroup struct { - files []string - size int64 - } - restoreFileGroups := make([]restoreGroup, 0) - - var l0Segments []*backuppb.SegmentBackupInfo = lo.Filter(partitionBackup.GetSegmentBackups(), func(segment *backuppb.SegmentBackupInfo, _ int) bool { - return segment.IsL0 - }) - notl0Segments := lo.Filter(partitionBackup.GetSegmentBackups(), func(segment *backuppb.SegmentBackupInfo, _ int) bool { - return !segment.IsL0 - }) - groupIds := collectGroupIdsFromSegments(notl0Segments) - if len(groupIds) == 1 && groupIds[0] == 0 { - // backward compatible old backup without group id - files, size, err := b.getBackupPartitionPaths(ctx, backupBucketName, backupPath, partitionBackup) - if err != nil { - log.Error("fail to get partition backup binlog files", - zap.Error(err), - zap.String("partition", partitionBackup.GetPartitionName())) - return task, err - } - restoreFileGroups = append(restoreFileGroups, restoreGroup{files: files, size: size}) - } else { - // bulk insert by segment groups - for _, groupId := range groupIds { - files, size, err := b.getBackupPartitionPathsWithGroupID(ctx, backupBucketName, backupPath, partitionBackup, groupId) - if err != nil { - log.Error("fail to get partition backup binlog files", - zap.Error(err), - zap.String("partition", partitionBackup.GetPartitionName())) - return task, err - } - restoreFileGroups = append(restoreFileGroups, restoreGroup{files: files, size: size}) - } - } - - for _, value := range restoreFileGroups { - group := value - job := func(ctx context.Context) error { - err := copyAndBulkInsert(targetDBName, targetCollectionName, partitionBackup.GetPartitionName(), group.files, false, task.GetSkipDiskQuotaCheck()) - if err != nil { - return err - } else { - b.meta.UpdateRestoreTask(parentTaskID, addCollectionRestoredSize(task.GetCollBackup().GetCollectionId(), group.size)) - restoredSize.Add(group.size) - task.RestoredSize = restoredSize.Load() - return nil - } - } - jobId := b.getRestoreWorkerPool(parentTaskID).SubmitWithId(job) - jobIds = append(jobIds, jobId) - } - - if len(l0Segments) > 0 { - for _, segment := range l0Segments { - partitionL0Segments = append(partitionL0Segments, partitionL0Segment{ - collectionID: segment.CollectionId, - partitionName: partitionBackup.GetPartitionName(), - partitionID: segment.GetPartitionId(), - segmentID: segment.GetSegmentId(), - }) - } - } - } - - err := b.getRestoreWorkerPool(parentTaskID).WaitJobs(jobIds) - if err != nil { - return task, err - } - - // restore l0 segments - l0JobIds := make([]int64, 0) - log.Info("start restore l0 segments", zap.Int("global_l0_segment_num", len(task.GetCollBackup().GetL0Segments())), zap.Int("partition_l0_segment_num", len(partitionL0Segments))) - for _, v := range partitionL0Segments { - segmentBackup := v - job := func(ctx context.Context) error { - l0Files := fmt.Sprintf("%s/%s/%s/%d/%d/%d", backupPath, BINGLOG_DIR, DELTA_LOG_DIR, segmentBackup.collectionID, segmentBackup.partitionID, segmentBackup.segmentID) - log.Info("restore l0 segment ", zap.String("files", l0Files)) - return copyAndBulkInsert(targetDBName, targetCollectionName, segmentBackup.partitionName, []string{l0Files}, true, task.GetSkipDiskQuotaCheck()) - } - jobId := b.getRestoreWorkerPool(parentTaskID).SubmitWithId(job) - l0JobIds = append(l0JobIds, jobId) - } - - if len(task.GetCollBackup().GetL0Segments()) > 0 { - for _, v := range task.GetCollBackup().GetL0Segments() { - segment := v - job := func(ctx context.Context) error { - l0Files := fmt.Sprintf("%s/%s/%s/%d/%d/%d", backupPath, BINGLOG_DIR, DELTA_LOG_DIR, task.CollBackup.CollectionId, -1, segment.GetSegmentId()) - log.Info("restore l0 segment ", zap.String("files", l0Files)) - return copyAndBulkInsert(targetDBName, targetCollectionName, "", []string{l0Files}, true, task.GetSkipDiskQuotaCheck()) - } - jobId := b.getRestoreWorkerPool(parentTaskID).SubmitWithId(job) - l0JobIds = append(l0JobIds, jobId) - } - } - err = b.getRestoreWorkerPool(parentTaskID).WaitJobs(l0JobIds) + collTask := restore.NewCollectionTask(task, + b.meta, + b.params, + parentTaskID, + backupBucketName, + backupPath, + b.getBackupStorageClient(), + b.getMilvusStorageClient(), + b.getMilvusClient(), + b.getRestfulClient()) + + err := collTask.Execute(ctx) return task, err } -func collectGroupIdsFromSegments(segments []*backuppb.SegmentBackupInfo) []int64 { - dict := make(map[int64]bool) - res := make([]int64, 0) - for _, seg := range segments { - if _, ok := dict[seg.GetGroupId()]; !ok { - dict[seg.GetGroupId()] = true - res = append(res, seg.GetGroupId()) - } - } - return res -} - -func (b *BackupContext) executeBulkInsert(ctx context.Context, db, coll string, partition string, files []string, endTime int64, isL0 bool, skipDiskQuotaCheck bool) error { - log.Info("execute bulk insert", - zap.String("db", db), - zap.String("collection", coll), - zap.String("partition", partition), - zap.Strings("files", files), - zap.Int64("endTime", endTime)) - var taskId int64 - var err error - if endTime == 0 { - if isL0 { - taskId, err = b.getMilvusClient().BulkInsert(ctx, db, coll, partition, files, gomilvus.IsL0(isL0), gomilvus.SkipDiskQuotaCheck(skipDiskQuotaCheck)) - } else { - taskId, err = b.getMilvusClient().BulkInsert(ctx, db, coll, partition, files, gomilvus.IsBackup(), gomilvus.SkipDiskQuotaCheck(skipDiskQuotaCheck)) - } - } else { - if isL0 { - taskId, err = b.getMilvusClient().BulkInsert(ctx, db, coll, partition, files, gomilvus.IsL0(isL0), gomilvus.SkipDiskQuotaCheck(skipDiskQuotaCheck), gomilvus.WithEndTs(endTime)) - } else { - taskId, err = b.getMilvusClient().BulkInsert(ctx, db, coll, partition, files, gomilvus.IsBackup(), gomilvus.SkipDiskQuotaCheck(skipDiskQuotaCheck), gomilvus.WithEndTs(endTime)) - } - } - if err != nil { - log.Error("fail to bulk insert", - zap.String("db", db), - zap.String("collectionName", coll), - zap.String("partitionName", partition), - zap.Strings("files", files), - zap.Error(err)) - return err - } - err = b.watchBulkInsertState(ctx, taskId, BULKINSERT_TIMEOUT, BULKINSERT_SLEEP_INTERVAL) - if err != nil { - log.Error("fail or timeout to bulk insert", - zap.Error(err), - zap.Int64("taskId", taskId), - zap.String("targetCollectionName", coll), - zap.String("partitionName", partition)) - return err - } - return nil -} - -func (b *BackupContext) watchBulkInsertState(ctx context.Context, taskId int64, timeout int64, sleepSeconds int) error { - lastProgress := 0 - lastUpdateTime := time.Now().Unix() - for { - importTaskState, err := b.getMilvusClient().GetBulkInsertState(ctx, taskId) - currentTimestamp := time.Now().Unix() - if err != nil { - return err - } - log.Info("bulkinsert task state", - zap.Int64("id", taskId), - zap.Int32("state", int32(importTaskState.State)), - zap.Any("state", importTaskState), - zap.Int("progress", importTaskState.Progress()), - zap.Int64("currentTimestamp", currentTimestamp), - zap.Int64("lastUpdateTime", lastUpdateTime)) - switch importTaskState.State { - case entity.BulkInsertFailed: - if value, ok := importTaskState.Infos["failed_reason"]; ok { - return errors.New("bulk insert fail, info: " + value) - } else { - return errors.New("bulk insert fail") - } - case entity.BulkInsertCompleted: - return nil - default: - currentProgress := importTaskState.Progress() - if currentProgress > lastProgress { - lastUpdateTime = time.Now().Unix() - } else if (currentTimestamp - lastUpdateTime) >= timeout { - log.Warn(fmt.Sprintf("bulkinsert task state progress hang for more than %d s", timeout)) - return errors.New("import task timeout") - } - time.Sleep(time.Second * time.Duration(sleepSeconds)) - continue - } - } - return errors.New("import task timeout") -} - -func (b *BackupContext) getBackupPartitionPaths(ctx context.Context, bucketName string, backupPath string, partition *backuppb.PartitionBackupInfo) ([]string, int64, error) { - log.Info("getBackupPartitionPaths", - zap.String("bucketName", bucketName), - zap.String("backupPath", backupPath), - zap.Int64("partitionID", partition.PartitionId)) - - insertPath := fmt.Sprintf("%s/%s/%s/%v/%v/", backupPath, BINGLOG_DIR, INSERT_LOG_DIR, partition.GetCollectionId(), partition.GetPartitionId()) - deltaPath := fmt.Sprintf("%s/%s/%s/%v/%v/", backupPath, BINGLOG_DIR, DELTA_LOG_DIR, partition.GetCollectionId(), partition.GetPartitionId()) - - exist, err := b.getBackupStorageClient().Exist(ctx, bucketName, deltaPath) - if err != nil { - log.Warn("check binlog exist fail", zap.Error(err)) - return []string{}, 0, err - } - log.Debug("check delta log exist", - zap.Int64("partitionID", partition.PartitionId), - zap.String("deltaPath", deltaPath), - zap.Bool("exist", exist)) - if !exist { - return []string{insertPath, ""}, partition.GetSize(), nil - } - return []string{insertPath, deltaPath}, partition.GetSize(), nil -} - -func (b *BackupContext) getBackupPartitionPathsWithGroupID(ctx context.Context, bucketName string, backupPath string, partition *backuppb.PartitionBackupInfo, groupId int64) ([]string, int64, error) { - log.Info("getBackupPartitionPaths", - zap.String("bucketName", bucketName), - zap.String("backupPath", backupPath), - zap.Int64("partitionID", partition.GetPartitionId()), - zap.Int64("groupId", groupId)) - - insertPath := fmt.Sprintf("%s/%s/%s/%v/%v/%d/", backupPath, BINGLOG_DIR, INSERT_LOG_DIR, partition.GetCollectionId(), partition.GetPartitionId(), groupId) - deltaPath := fmt.Sprintf("%s/%s/%s/%v/%v/%d/", backupPath, BINGLOG_DIR, DELTA_LOG_DIR, partition.GetCollectionId(), partition.GetPartitionId(), groupId) - - var totalSize int64 - for _, seg := range partition.GetSegmentBackups() { - if seg.GetGroupId() == groupId { - totalSize += seg.GetSize() - } - } - - exist, err := b.getBackupStorageClient().Exist(ctx, bucketName, deltaPath) - if err != nil { - log.Warn("check binlog exist fail", zap.Error(err)) - return []string{}, 0, err - } - if !exist { - return []string{insertPath, ""}, totalSize, nil - } - - return []string{insertPath, deltaPath}, totalSize, nil -} - func (b *BackupContext) restoreRBAC(ctx context.Context, backupInfo *backuppb.BackupInfo) error { log.Info("restore RBAC") - curRBAC, err := b.getMilvusClient().BackupRBAC(ctx) + resp, err := b.getMilvusClient().BackupRBAC(ctx) if err != nil { return fmt.Errorf("fail to get current RBAC, err: %s", err) } + curRBAC := resp.RBACMeta rbacBackup := backupInfo.GetRbacMeta() - curUsers := lo.SliceToMap(curRBAC.Users, func(user *entity.UserInfo) (string, struct{}) { - return user.Name, struct{}{} + curUsers := lo.SliceToMap(curRBAC.Users, func(user *milvuspb.UserInfo) (string, struct{}) { + return user.User, struct{}{} }) - users := make([]*entity.UserInfo, 0, len(rbacBackup.GetUsers())) + users := make([]*milvuspb.UserInfo, 0, len(rbacBackup.GetUsers())) for _, user := range rbacBackup.GetUsers() { // skip if user already exist if _, ok := curUsers[user.GetUser()]; ok { continue } - ur := lo.Map(user.GetRoles(), func(role *backuppb.RoleEntity, index int) string { - return role.Name + ur := lo.Map(user.GetRoles(), func(role *backuppb.RoleEntity, index int) *milvuspb.RoleEntity { + return &milvuspb.RoleEntity{Name: role.Name} }) - userEntity := &entity.UserInfo{ - UserDescription: entity.UserDescription{ - Name: user.GetUser(), - Roles: ur, - }, + userEntity := &milvuspb.UserInfo{ + User: user.User, Password: user.Password, + Roles: ur, } users = append(users, userEntity) } - curRoles := lo.SliceToMap(curRBAC.Roles, func(role *entity.Role) (string, struct{}) { + curRoles := lo.SliceToMap(curRBAC.Roles, func(role *milvuspb.RoleEntity) (string, struct{}) { return role.Name, struct{}{} }) - roles := make([]*entity.Role, 0, len(rbacBackup.GetRoles())) + roles := make([]*milvuspb.RoleEntity, 0, len(rbacBackup.GetRoles())) for _, role := range rbacBackup.GetRoles() { // skip if role already exist if _, ok := curRoles[role.GetName()]; ok { continue } - roleEntity := &entity.Role{ + roleEntity := &milvuspb.RoleEntity{ Name: role.GetName(), } roles = append(roles, roleEntity) } - grants := make([]*entity.RoleGrants, 0, len(rbacBackup.GetGrants())) - curGrants := lo.SliceToMap(curRBAC.RoleGrants, func(grant *entity.RoleGrants) (string, struct{}) { - return fmt.Sprintf("%s/%s/%s/%s/%s/%s", grant.Object, grant.ObjectName, grant.RoleName, grant.GrantorName, grant.PrivilegeName, grant.DbName), struct{}{} + grants := make([]*milvuspb.GrantEntity, 0, len(rbacBackup.GetGrants())) + curGrants := lo.SliceToMap(curRBAC.Grants, func(grant *milvuspb.GrantEntity) (string, struct{}) { + return fmt.Sprintf("%s/%s/%s/%s/%s/%s", grant.Object, grant.ObjectName, grant.Role.Name, grant.Grantor.User, grant.Grantor.Privilege.Name, grant.DbName), struct{}{} }) for _, roleGrant := range rbacBackup.GetGrants() { key := fmt.Sprintf("%s/%s/%s/%s/%s/%s", roleGrant.Object.GetName(), roleGrant.GetObjectName(), roleGrant.GetRole().GetName(), roleGrant.GetGrantor().GetUser().GetName(), roleGrant.GetGrantor().GetPrivilege().GetName(), roleGrant.GetDbName()) @@ -987,21 +480,23 @@ func (b *BackupContext) restoreRBAC(ctx context.Context, backupInfo *backuppb.Ba if _, ok := curGrants[key]; ok { continue } - roleGrantEntity := &entity.RoleGrants{ - Object: roleGrant.Object.GetName(), - ObjectName: roleGrant.GetObjectName(), - RoleName: roleGrant.GetRole().GetName(), - GrantorName: roleGrant.GetGrantor().GetUser().GetName(), - PrivilegeName: roleGrant.GetGrantor().GetPrivilege().GetName(), - DbName: roleGrant.GetDbName(), + roleGrantEntity := &milvuspb.GrantEntity{ + Object: &milvuspb.ObjectEntity{Name: roleGrant.Object.Name}, + ObjectName: roleGrant.GetObjectName(), + Role: &milvuspb.RoleEntity{Name: roleGrant.Role.Name}, + Grantor: &milvuspb.GrantorEntity{ + User: &milvuspb.UserEntity{Name: roleGrant.Grantor.User.Name}, + Privilege: &milvuspb.PrivilegeEntity{Name: roleGrant.Grantor.Privilege.Name}, + }, + DbName: roleGrant.GetDbName(), } grants = append(grants, roleGrantEntity) } - rbacMeta := &entity.RBACMeta{ - Users: users, - Roles: roles, - RoleGrants: grants, + rbacMeta := &milvuspb.RBACMeta{ + Users: users, + Roles: roles, + Grants: grants, } log.Info("restore RBAC", zap.Int("users", len(users)), zap.Int("roles", len(roles)), zap.Int("grants", len(grants))) diff --git a/core/backup_meta_test.go b/core/backup_meta_test.go index 6df005a..763b2fe 100644 --- a/core/backup_meta_test.go +++ b/core/backup_meta_test.go @@ -8,6 +8,8 @@ import ( "strconv" "testing" + "github.com/zilliztech/milvus-backup/core/meta" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" @@ -134,24 +136,24 @@ func TestBackupSerialize(t *testing.T) { CollectionBackups: []*backuppb.CollectionBackupInfo{collection}, } - serData, err := serialize(backup) + serData, err := meta.serialize(backup) assert.NoError(t, err) log.Info(string(serData.BackupMetaBytes)) log.Info(string(serData.CollectionMetaBytes)) log.Info(string(serData.PartitionMetaBytes)) log.Info(string(serData.SegmentMetaBytes)) - deserBackup, err := deserialize(serData) + deserBackup, err := meta.deserialize(serData) log.Info(deserBackup.String()) } func TestDbCollectionJson(t *testing.T) { - dbCollection := DbCollections{"db1": []string{"coll1", "coll2"}, "db2": []string{"coll3", "coll4"}} + dbCollection := meta.DbCollections{"db1": []string{"coll1", "coll2"}, "db2": []string{"coll3", "coll4"}} jsonStr, err := jsoniter.MarshalToString(dbCollection) assert.NoError(t, err) println(jsonStr) - var dbCollection2 DbCollections + var dbCollection2 meta.DbCollections jsoniter.UnmarshalFromString(jsonStr, &dbCollection2) println(dbCollection2) } @@ -202,14 +204,14 @@ func readBackup(backupDir string) (*backuppb.BackupInfo, error) { return nil, err } - completeBackupMetas := &BackupMetaBytes{ + completeBackupMetas := &meta.BackupMetaBytes{ BackupMetaBytes: backupMetaBytes, CollectionMetaBytes: collectionBackupMetaBytes, PartitionMetaBytes: partitionBackupMetaBytes, SegmentMetaBytes: segmentBackupMetaBytes, } - deserBackup, err := deserialize(completeBackupMetas) + deserBackup, err := meta.deserialize(completeBackupMetas) return deserBackup, err } @@ -220,11 +222,11 @@ func TestReadBackupFile(t *testing.T) { backupInfo, err := readBackup(filepath) assert.NoError(t, err) - levelBackupInfo, err := treeToLevel(backupInfo) + levelBackupInfo, err := meta.treeToLevel(backupInfo) assert.NoError(t, err) assert.NotNil(t, levelBackupInfo) - output, _ := serialize(backupInfo) + output, _ := meta.serialize(backupInfo) BackupMetaStr := string(output.BackupMetaBytes) segmentMetaStr := string(output.SegmentMetaBytes) fmt.Sprintf(BackupMetaStr) @@ -239,7 +241,7 @@ func TestSimpleBackupResponse(t *testing.T) { Msg: "not found", Data: nil, } - simpleInfo := SimpleBackupResponse(info) + simpleInfo := meta.SimpleBackupResponse(info) assert.Nil(t, simpleInfo.Data) assert.Equal(t, info.Code, simpleInfo.Code) assert.Equal(t, info.Msg, simpleInfo.Msg) @@ -253,7 +255,7 @@ func TestSimpleRestoreResponse(t *testing.T) { Msg: "not found", Data: nil, } - simpleInfo := SimpleRestoreResponse(info) + simpleInfo := meta.SimpleRestoreResponse(info) assert.Nil(t, simpleInfo.Data) assert.Equal(t, info.Code, simpleInfo.Code) assert.Equal(t, info.Msg, simpleInfo.Msg) diff --git a/core/backup_server.go b/core/backup_server.go index ff210e0..03e78ca 100644 --- a/core/backup_server.go +++ b/core/backup_server.go @@ -2,15 +2,18 @@ package core import ( "context" + "net/http" + + "github.com/zilliztech/milvus-backup/core/meta" + "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" + "go.uber.org/zap" + "github.com/zilliztech/milvus-backup/core/paramtable" "github.com/zilliztech/milvus-backup/core/proto/backuppb" "github.com/zilliztech/milvus-backup/internal/log" - "go.uber.org/zap" - "net/http" - "net/http/pprof" ) const ( @@ -36,7 +39,7 @@ type Server struct { config *BackupConfig } -func NewServer(ctx context.Context, params paramtable.BackupParams, opts ...BackupOption) (*Server, error) { +func NewServer(ctx context.Context, params *paramtable.BackupParams, opts ...BackupOption) (*Server, error) { c := newDefaultBackupConfig() for _, opt := range opts { opt(c) @@ -57,7 +60,6 @@ func (s *Server) Init() { } func (s *Server) Start() { - s.registerProfilePort() err := s.engine.Run(s.config.port) if err != nil { log.Error("Failed to start server", zap.Error(err)) @@ -79,15 +81,7 @@ func (s *Server) registerHTTPServer() { s.engine = ginHandler } -// registerHTTPServer register the http server, panic when failed -func (s *Server) registerProfilePort() { - go func() { - http.HandleFunc("/debug/pprof/heap", pprof.Index) - http.ListenAndServe("localhost:8089", nil) - }() -} - -func handleHello(c *gin.Context) (interface{}, error) { +func handleHello(c *gin.Context) (any, error) { c.String(200, "Hello, This is backup service") return nil, nil } @@ -145,7 +139,7 @@ func (h *Handlers) handleCreateBackup(c *gin.Context) (interface{}, error) { requestBody.RequestId = c.GetHeader("request_id") resp := h.backupContext.CreateBackup(h.backupContext.ctx, &requestBody) if h.backupContext.params.HTTPCfg.SimpleResponse { - resp = SimpleBackupResponse(resp) + resp = meta.SimpleBackupResponse(resp) } c.JSON(http.StatusOK, resp) return nil, nil @@ -167,7 +161,7 @@ func (h *Handlers) handleListBackups(c *gin.Context) (interface{}, error) { } resp := h.backupContext.ListBackups(h.backupContext.ctx, &req) if h.backupContext.params.HTTPCfg.SimpleResponse { - resp = SimpleListBackupsResponse(resp) + resp = meta.SimpleListBackupsResponse(resp) } c.JSON(http.StatusOK, resp) return nil, nil @@ -191,7 +185,7 @@ func (h *Handlers) handleGetBackup(c *gin.Context) (interface{}, error) { } resp := h.backupContext.GetBackup(h.backupContext.ctx, &req) if h.backupContext.params.HTTPCfg.SimpleResponse { - resp = SimpleBackupResponse(resp) + resp = meta.SimpleBackupResponse(resp) } c.JSON(http.StatusOK, resp) return nil, nil @@ -240,7 +234,7 @@ func (h *Handlers) handleRestoreBackup(c *gin.Context) (interface{}, error) { requestBody.RequestId = c.GetHeader("request_id") resp := h.backupContext.RestoreBackup(h.backupContext.ctx, &requestBody) if h.backupContext.params.HTTPCfg.SimpleResponse { - resp = SimpleRestoreResponse(resp) + resp = meta.SimpleRestoreResponse(resp) } c.JSON(http.StatusOK, resp) return nil, nil @@ -262,7 +256,7 @@ func (h *Handlers) handleGetRestore(c *gin.Context) (interface{}, error) { } resp := h.backupContext.GetRestore(h.backupContext.ctx, &req) if h.backupContext.params.HTTPCfg.SimpleResponse { - resp = SimpleRestoreResponse(resp) + resp = meta.SimpleRestoreResponse(resp) } log.Info("End to GetRestoreStateRequest", zap.Any("resp", resp)) c.JSON(http.StatusOK, resp) diff --git a/core/backup_server_test.go b/core/backup_server_test.go index c55bebd..d14a71d 100644 --- a/core/backup_server_test.go +++ b/core/backup_server_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/zilliztech/milvus-backup/core/paramtable" ) @@ -18,7 +19,7 @@ func TestBackupService(t *testing.T) { params.Init() context := context.Background() - server, err := NewServer(context, params) + server, err := NewServer(context, ¶ms) assert.NoError(t, err) server.Init() server.Start() diff --git a/core/client/cfg.go b/core/client/cfg.go new file mode 100644 index 0000000..29b4409 --- /dev/null +++ b/core/client/cfg.go @@ -0,0 +1,75 @@ +package client + +import ( + "crypto/tls" + "encoding/base64" + "errors" + "fmt" + "net/url" + "regexp" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" +) + +var _httpsScheme = regexp.MustCompile(`^https?://`) +var _httpScheme = regexp.MustCompile(`^http?://`) + +type Cfg struct { + Address string // Remote address, "localhost:19530". + EnableTLS bool // Enable TLS for connection. + DialOpts []grpc.DialOption + + Username string // Username for auth. + Password string // Password for auth. +} + +func (cfg *Cfg) parseAuth() string { + if cfg.Username != "" || cfg.Password != "" { + value := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", cfg.Username, cfg.Password))) + return value + } + + return "" +} + +func (cfg *Cfg) parseGrpc() (*url.URL, []grpc.DialOption, error) { + var opts []grpc.DialOption + address := cfg.Address + if !_httpsScheme.MatchString(address) { + address = fmt.Sprintf("tcp://%s", address) + } + remoteURL, err := url.Parse(address) + if err != nil { + return nil, nil, errors.New("milvus address parse fail") + } + // Remote Host should never be empty. + if remoteURL.Host == "" { + return nil, nil, errors.New("empty remote host of milvus address") + } + + if remoteURL.Scheme == "https" || cfg.EnableTLS { + opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) + } else { + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) + } + if remoteURL.Port() == "" && cfg.EnableTLS { + remoteURL.Host += ":443" + } + + return remoteURL, opts, nil +} + +func (cfg *Cfg) parseRestful() (*url.URL, error) { + address := cfg.Address + if !_httpsScheme.MatchString(address) && !_httpScheme.MatchString(address) { + if cfg.EnableTLS { + address = fmt.Sprintf("https://%s", address) + } else { + address = fmt.Sprintf("http://%s", address) + } + } + + return url.Parse(address) +} diff --git a/core/client/grpc.go b/core/client/grpc.go new file mode 100644 index 0000000..aa61f92 --- /dev/null +++ b/core/client/grpc.go @@ -0,0 +1,530 @@ +package client + +import ( + "context" + "errors" + "fmt" + "math" + "os" + "strconv" + "time" + + grpcretry "github.com/grpc-ecosystem/go-grpc-middleware/retry" + "google.golang.org/grpc/backoff" + "google.golang.org/grpc/keepalive" + + "github.com/golang/protobuf/proto" + "github.com/milvus-io/milvus-proto/go-api/v2/commonpb" + "github.com/milvus-io/milvus-proto/go-api/v2/milvuspb" + "github.com/milvus-io/milvus-proto/go-api/v2/schemapb" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + + "github.com/zilliztech/milvus-backup/internal/log" + "github.com/zilliztech/milvus-backup/version" +) + +const ( + disableDatabase uint64 = 1 << iota +) + +func defaultDialOpt() []grpc.DialOption { + opts := []grpc.DialOption{ + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 5 * time.Second, + Timeout: 10 * time.Second, + PermitWithoutStream: true, + }), + grpc.WithConnectParams(grpc.ConnectParams{ + Backoff: backoff.Config{ + BaseDelay: 100 * time.Millisecond, + Multiplier: 1.6, + Jitter: 0.2, + MaxDelay: 3 * time.Second, + }, + MinConnectTimeout: 3 * time.Second, + }), + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(math.MaxInt32), // math.MaxInt32 = 2147483647, 2GB - 1 + // not setting max send msg size, since default is Unlimited + ), + grpc.WithChainUnaryInterceptor(grpcretry.UnaryClientInterceptor( + grpcretry.WithMax(6), + grpcretry.WithBackoff(func(attempt uint) time.Duration { + return 60 * time.Millisecond * time.Duration(math.Pow(3, float64(attempt))) + }), + grpcretry.WithCodes(codes.Unavailable, codes.ResourceExhausted)), + ), + } + + return opts +} + +type Grpc interface { + Close() error + SupportMultiDatabase() bool + GetVersion(ctx context.Context) (string, error) + CreateDatabase(ctx context.Context, dbName string) error + ListDatabases(ctx context.Context) ([]string, error) + DescribeCollection(ctx context.Context, db, collName string) (*milvuspb.DescribeCollectionResponse, error) + DropCollection(ctx context.Context, db, collectionName string) error + ListIndex(ctx context.Context, db, collName string) ([]*milvuspb.IndexDescription, error) + ShowPartitions(ctx context.Context, db, collName string) (*milvuspb.ShowPartitionsResponse, error) + GetLoadingProgress(ctx context.Context, db, collName string, partitionNames []string) (int64, error) + GetPersistentSegmentInfo(ctx context.Context, db, collName string) ([]*milvuspb.PersistentSegmentInfo, error) + Flush(ctx context.Context, db, collName string) (*milvuspb.FlushResponse, error) + ListCollections(ctx context.Context, db string) (*milvuspb.ShowCollectionsResponse, error) + HasCollection(ctx context.Context, db, collName string) (bool, error) + BulkInsert(ctx context.Context, input BulkInsertInput) (int64, error) + GetBulkInsertState(ctx context.Context, taskID int64) (*milvuspb.GetImportStateResponse, error) + CreateCollection(ctx context.Context, input CreateCollectionInput) error + CreatePartition(ctx context.Context, db, collName, partitionName string) error + HasPartition(ctx context.Context, db, collName, partitionName string) (bool, error) + CreateIndex(ctx context.Context, input CreateIndexInput) error + DropIndex(ctx context.Context, db, collName, indexName string) error + BackupRBAC(ctx context.Context) (*milvuspb.BackupRBACMetaResponse, error) + RestoreRBAC(ctx context.Context, rbacMeta *milvuspb.RBACMeta) error +} + +const ( + authorizationHeader = `authorization` + identifierHeader = `identifier` + databaseHeader = `dbname` +) + +func ok(status *commonpb.Status) bool { return status.GetCode() == 0 } + +func checkResponse(resp any, err error) error { + if err != nil { + return err + } + + switch resp.(type) { + case interface{ GetStatus() *commonpb.Status }: + if !ok(resp.(interface{ GetStatus() *commonpb.Status }).GetStatus()) { + return fmt.Errorf("client: operation failed: %v", resp.(interface{ GetStatus() *commonpb.Status }).GetStatus()) + } + case *commonpb.Status: + if !ok(resp.(*commonpb.Status)) { + return fmt.Errorf("client: operation failed: %v", resp.(*commonpb.Status)) + } + } + return nil +} + +type GrpcClient struct { + cfg *Cfg + + conn *grpc.ClientConn + srv milvuspb.MilvusServiceClient + + auth string + serverVersion string + identifier string + + flags uint64 +} + +func NewGrpc(cfg *Cfg) (*GrpcClient, error) { + addr, opts, err := cfg.parseGrpc() + if err != nil { + return nil, fmt.Errorf("client: parse address failed: %w", err) + } + auth := cfg.parseAuth() + + opts = append(opts, defaultDialOpt()...) + + conn, err := grpc.NewClient(addr.Host, opts...) + if err != nil { + return nil, fmt.Errorf("client: create grpc client failed: %w", err) + } + srv := milvuspb.NewMilvusServiceClient(conn) + + cli := &GrpcClient{ + cfg: cfg, + + conn: conn, + srv: srv, + + auth: auth, + } + + return cli, nil +} + +func (m *GrpcClient) hasFlags(flags uint64) bool { return (m.flags & flags) > 0 } +func (m *GrpcClient) SupportMultiDatabase() bool { return !m.hasFlags(disableDatabase) } + +func (m *GrpcClient) newCtx(ctx context.Context) context.Context { + if m.auth != "" { + return metadata.AppendToOutgoingContext(ctx, authorizationHeader, m.auth) + } + if m.identifier != "" { + return metadata.AppendToOutgoingContext(ctx, identifierHeader, m.identifier) + } + return ctx +} + +func (m *GrpcClient) newCtxWithDB(ctx context.Context, db string) context.Context { + ctx = m.newCtx(ctx) + return metadata.AppendToOutgoingContext(ctx, databaseHeader, db) +} + +func (m *GrpcClient) connect(ctx context.Context) error { + hostName, err := os.Hostname() + if err != nil { + return fmt.Errorf("get hostname failed: %w", err) + } + + connReq := &milvuspb.ConnectRequest{ + ClientInfo: &commonpb.ClientInfo{ + SdkType: "Backup Tool Custom SDK", + SdkVersion: version.Version, + LocalTime: time.Now().String(), + User: m.cfg.Username, + Host: hostName, + }, + } + + resp, err := m.srv.Connect(ctx, connReq) + if err != nil { + s, ok := status.FromError(err) + if ok { + if s.Code() == codes.Unimplemented { + log.Info("The server does not support the Connect API, skipping") + m.flags |= disableDatabase + } + } + return fmt.Errorf("client: connect to server failed: %w", err) + } + + if !ok(resp.GetStatus()) { + return fmt.Errorf("client: connect to server failed: %v", resp.GetStatus()) + } + + m.serverVersion = resp.GetServerInfo().GetBuildTags() + m.identifier = strconv.FormatInt(resp.GetIdentifier(), 10) + return nil +} + +func (m *GrpcClient) Close() error { + return m.conn.Close() +} + +func (m *GrpcClient) GetVersion(ctx context.Context) (string, error) { + ctx = m.newCtx(ctx) + resp, err := m.srv.GetVersion(ctx, &milvuspb.GetVersionRequest{}) + if err := checkResponse(resp, err); err != nil { + return "", fmt.Errorf("client: get version failed: %w", err) + } + + return resp.GetVersion(), nil +} + +func (m *GrpcClient) CreateDatabase(ctx context.Context, dbName string) error { + ctx = m.newCtx(ctx) + if m.hasFlags(disableDatabase) { + return errors.New("client: the server does not support database") + } + + resp, err := m.srv.CreateDatabase(ctx, &milvuspb.CreateDatabaseRequest{DbName: dbName}) + if err := checkResponse(resp, err); err != nil { + return fmt.Errorf("client: create database failed: %w", err) + } + + return nil +} + +func (m *GrpcClient) ListDatabases(ctx context.Context) ([]string, error) { + ctx = m.newCtx(ctx) + if m.hasFlags(disableDatabase) { + return nil, errors.New("client: the server does not support database") + } + + resp, err := m.srv.ListDatabases(ctx, &milvuspb.ListDatabasesRequest{}) + if err := checkResponse(resp, err); err != nil { + return nil, fmt.Errorf("client: list databases failed: %w", err) + } + + return resp.GetDbNames(), nil +} + +func (m *GrpcClient) DescribeCollection(ctx context.Context, db, collName string) (*milvuspb.DescribeCollectionResponse, error) { + ctx = m.newCtxWithDB(ctx, db) + resp, err := m.srv.DescribeCollection(ctx, &milvuspb.DescribeCollectionRequest{CollectionName: collName}) + if err := checkResponse(resp, err); err != nil { + return nil, fmt.Errorf("client: describe collection failed: %w", err) + } + + return resp, nil +} + +func (m *GrpcClient) ListIndex(ctx context.Context, db, collName string) ([]*milvuspb.IndexDescription, error) { + ctx = m.newCtxWithDB(ctx, db) + resp, err := m.srv.DescribeIndex(ctx, &milvuspb.DescribeIndexRequest{CollectionName: collName}) + if err := checkResponse(resp, err); err != nil { + return nil, fmt.Errorf("client: describe index failed: %w", err) + } + + return resp.IndexDescriptions, nil +} + +func (m *GrpcClient) ShowPartitions(ctx context.Context, db, collName string) (*milvuspb.ShowPartitionsResponse, error) { + ctx = m.newCtxWithDB(ctx, db) + resp, err := m.srv.ShowPartitions(ctx, &milvuspb.ShowPartitionsRequest{CollectionName: collName}) + if err := checkResponse(resp, err); err != nil { + return nil, fmt.Errorf("client: show partitions failed: %w", err) + } + return resp, nil +} + +func (m *GrpcClient) GetLoadingProgress(ctx context.Context, db, collName string, partitionNames []string) (int64, error) { + ctx = m.newCtxWithDB(ctx, db) + resp, err := m.srv.GetLoadingProgress(ctx, &milvuspb.GetLoadingProgressRequest{CollectionName: collName, PartitionNames: partitionNames}) + if err != nil { + return 0, fmt.Errorf("client: get loading progress failed: %w", err) + } + + return resp.GetProgress(), nil +} + +func (m *GrpcClient) GetPersistentSegmentInfo(ctx context.Context, db, collName string) ([]*milvuspb.PersistentSegmentInfo, error) { + ctx = m.newCtxWithDB(ctx, db) + resp, err := m.srv.GetPersistentSegmentInfo(ctx, &milvuspb.GetPersistentSegmentInfoRequest{CollectionName: collName}) + if err := checkResponse(resp, err); err != nil { + return nil, fmt.Errorf("client: get persistent segment info failed: %w", err) + } + + return resp.GetInfos(), nil +} + +func (m *GrpcClient) Flush(ctx context.Context, db, collName string) (*milvuspb.FlushResponse, error) { + ctx = m.newCtxWithDB(ctx, db) + resp, err := m.srv.Flush(ctx, &milvuspb.FlushRequest{CollectionNames: []string{collName}}) + if err := checkResponse(resp, err); err != nil { + return nil, fmt.Errorf("client: flush failed: %w", err) + } + + segmentIDs, has := resp.GetCollSegIDs()[collName] + ids := segmentIDs.GetData() + if has && len(ids) > 0 { + flushed := func() bool { + getFlushResp, err := m.srv.GetFlushState(ctx, &milvuspb.GetFlushStateRequest{ + SegmentIDs: ids, + FlushTs: resp.GetCollFlushTs()[collName], + CollectionName: collName, + }) + if err != nil { + // TODO max retry + return false + } + return getFlushResp.GetFlushed() + } + for !flushed() { + // respect context deadline/cancel + select { + case <-ctx.Done(): + return nil, errors.New("deadline exceeded") + default: + } + time.Sleep(200 * time.Millisecond) + } + } + + return resp, nil +} + +func (m *GrpcClient) ListCollections(ctx context.Context, db string) (*milvuspb.ShowCollectionsResponse, error) { + ctx = m.newCtxWithDB(ctx, db) + resp, err := m.srv.ShowCollections(ctx, &milvuspb.ShowCollectionsRequest{}) + if err := checkResponse(resp, err); err != nil { + return nil, fmt.Errorf("client: list collections failed: %w", err) + } + + return resp, nil +} + +func (m *GrpcClient) HasCollection(ctx context.Context, db, collName string) (bool, error) { + ctx = m.newCtxWithDB(ctx, db) + resp, err := m.srv.HasCollection(ctx, &milvuspb.HasCollectionRequest{CollectionName: collName}) + if err := checkResponse(resp, err); err != nil { + return false, fmt.Errorf("client: has collection failed: %w", err) + } + return resp.GetValue(), nil +} + +type BulkInsertInput struct { + DB string + CollectionName string + PartitionName string + // offset 0 is path to insertLog file, offset 1 is path to deleteLog file + Paths []string + EndTime int64 + IsL0 bool + SkipDiskQuotaCheck bool +} + +func (m *GrpcClient) BulkInsert(ctx context.Context, input BulkInsertInput) (int64, error) { + ctx = m.newCtxWithDB(ctx, input.DB) + var opts []*commonpb.KeyValuePair + if input.EndTime > 0 { + opts = append(opts, &commonpb.KeyValuePair{Key: "end_time", Value: strconv.FormatInt(input.EndTime, 10)}) + } + if input.IsL0 { + opts = append(opts, &commonpb.KeyValuePair{Key: "l0_import", Value: "true"}) + } else { + opts = append(opts, &commonpb.KeyValuePair{Key: "backup", Value: "true"}) + } + skipOpt := &commonpb.KeyValuePair{Key: "skip_disk_quota_check", Value: strconv.FormatBool(input.SkipDiskQuotaCheck)} + opts = append(opts, skipOpt) + + in := &milvuspb.ImportRequest{ + CollectionName: input.CollectionName, + PartitionName: input.PartitionName, + Files: input.Paths, + Options: opts, + } + resp, err := m.srv.Import(ctx, in) + if err := checkResponse(resp, err); err != nil { + return 0, fmt.Errorf("client: bulk insert failed: %w", err) + } + + return resp.GetTasks()[0], nil +} + +func (m *GrpcClient) GetBulkInsertState(ctx context.Context, taskID int64) (*milvuspb.GetImportStateResponse, error) { + ctx = m.newCtx(ctx) + resp, err := m.srv.GetImportState(ctx, &milvuspb.GetImportStateRequest{Task: taskID}) + if err := checkResponse(resp, err); err != nil { + return nil, fmt.Errorf("client: get bulk insert state failed: %w", err) + } + + return resp, nil +} + +type CreateCollectionInput struct { + DB string + Schema *schemapb.CollectionSchema + ConsLevel commonpb.ConsistencyLevel + ShardNum int32 + partitionNum int64 +} + +func (m *GrpcClient) CreateCollection(ctx context.Context, input CreateCollectionInput) error { + ctx = m.newCtxWithDB(ctx, input.DB) + bs, err := proto.Marshal(input.Schema) + if err != nil { + return fmt.Errorf("client: create collection failed: %w", err) + } + in := &milvuspb.CreateCollectionRequest{ + CollectionName: input.Schema.Name, + Schema: bs, + ConsistencyLevel: input.ConsLevel, + ShardsNum: input.ShardNum, + NumPartitions: input.partitionNum, + } + + resp, err := m.srv.CreateCollection(ctx, in) + if err := checkResponse(resp, err); err != nil { + return fmt.Errorf("client: create collection failed: %w", err) + } + + return nil +} + +func (m *GrpcClient) DropCollection(ctx context.Context, db string, collectionName string) error { + ctx = m.newCtxWithDB(ctx, db) + resp, err := m.srv.DropCollection(ctx, &milvuspb.DropCollectionRequest{CollectionName: collectionName}) + if err := checkResponse(resp, err); err != nil { + return fmt.Errorf("client: drop collection failed: %w", err) + } + + return nil +} + +func (m *GrpcClient) CreatePartition(ctx context.Context, db, collName, partitionName string) error { + ctx = m.newCtxWithDB(ctx, db) + in := &milvuspb.CreatePartitionRequest{CollectionName: collName, PartitionName: partitionName} + resp, err := m.srv.CreatePartition(ctx, in) + if err := checkResponse(resp, err); err != nil { + return fmt.Errorf("client: create partition failed: %w", err) + } + + return nil +} + +func (m *GrpcClient) HasPartition(ctx context.Context, db, collName string, partitionName string) (bool, error) { + ctx = m.newCtxWithDB(ctx, db) + in := &milvuspb.HasPartitionRequest{CollectionName: collName, PartitionName: partitionName} + resp, err := m.srv.HasPartition(ctx, in) + if err := checkResponse(resp, err); err != nil { + return false, fmt.Errorf("client: has partition failed: %w", err) + } + return resp.GetValue(), nil +} + +func mapKvPairs(m map[string]string) []*commonpb.KeyValuePair { + pairs := make([]*commonpb.KeyValuePair, 0, len(m)) + for k, v := range m { + pair := &commonpb.KeyValuePair{Key: k, Value: v} + pairs = append(pairs, pair) + } + return pairs +} + +type CreateIndexInput struct { + DB string + CollectionName string + FieldName string + IndexName string + Params map[string]string +} + +func (m *GrpcClient) CreateIndex(ctx context.Context, input CreateIndexInput) error { + ctx = m.newCtxWithDB(ctx, input.DB) + in := &milvuspb.CreateIndexRequest{ + CollectionName: input.CollectionName, + FieldName: input.FieldName, + IndexName: input.IndexName, + ExtraParams: mapKvPairs(input.Params), + } + + resp, err := m.srv.CreateIndex(ctx, in) + if err := checkResponse(resp, err); err != nil { + return fmt.Errorf("client: create index failed: %w", err) + } + + return nil +} + +func (m *GrpcClient) DropIndex(ctx context.Context, db, collName, indexName string) error { + ctx = m.newCtxWithDB(ctx, db) + in := &milvuspb.DropIndexRequest{CollectionName: collName, IndexName: indexName} + resp, err := m.srv.DropIndex(ctx, in) + if err := checkResponse(resp, err); err != nil { + return fmt.Errorf("client: drop index failed: %w", err) + } + return nil +} + +func (m *GrpcClient) BackupRBAC(ctx context.Context) (*milvuspb.BackupRBACMetaResponse, error) { + ctx = m.newCtx(ctx) + resp, err := m.srv.BackupRBAC(ctx, &milvuspb.BackupRBACMetaRequest{}) + if err := checkResponse(resp, err); err != nil { + return nil, fmt.Errorf("client: backup rbac failed: %w", err) + } + + return resp, nil +} + +func (m *GrpcClient) RestoreRBAC(ctx context.Context, rbacMeta *milvuspb.RBACMeta) error { + ctx = m.newCtx(ctx) + resp, err := m.srv.RestoreRBAC(ctx, &milvuspb.RestoreRBACMetaRequest{RBACMeta: rbacMeta}) + if err := checkResponse(resp, err); err != nil { + return fmt.Errorf("client: restore rbac failed: %w", err) + } + + return nil +} diff --git a/core/client/restful.go b/core/client/restful.go new file mode 100644 index 0000000..9cdd0a6 --- /dev/null +++ b/core/client/restful.go @@ -0,0 +1,145 @@ +package client + +import ( + "context" + "fmt" + "strconv" + "time" + + "github.com/imroc/req/v3" + "go.uber.org/zap" + + "github.com/zilliztech/milvus-backup/internal/log" +) + +type Restful interface { + BulkInsert(ctx context.Context, db, collName, partitionName string, files []string, endTime int64, isL0 bool, skipDiskQuotaCheck bool) (string, error) + GetBulkInsertState(ctx context.Context, db, jobID string) (*GetProcessResp, error) +} + +type ImportDetail struct { + FileName string `json:"fileName"` + FileSize int `json:"fileSize"` + State string `json:"state"` + Progress int `json:"progress"` + CompleteTime time.Time `json:"completeTime"` + Reason string `json:"reason"` +} + +type GetProcessResp struct { + Code int `json:"code"` + Data struct { + JobId string `json:"jobId"` + CollectionName string `json:"collectionName"` + FileName string `json:"fileName"` + FileSize int `json:"fileSize"` + State string `json:"state"` + Progress int `json:"progress"` + CompleteTime string `json:"completeTime"` + Reason string `json:"reason"` + TotalRows int `json:"totalRows"` + Details []struct { + FileName string `json:"fileName"` + FileSize int `json:"fileSize"` + State string `json:"state"` + Progress int `json:"progress"` + CompleteTime string `json:"completeTime"` + Reason string `json:"reason"` + } `json:"details"` + } `json:"data"` +} + +type GetProgressReq struct { + DBName string `json:"dbName,omitempty"` + JobId string `json:"jobId"` +} + +type createImportResp struct { + Code int `json:"code"` + Data struct { + JobId string `json:"jobId"` + } `json:"data"` +} + +type createImportReq struct { + DbName string `json:"dbName,omitempty"` + CollectionName string `json:"collectionName"` + PartitionName string `json:"partitionName,omitempty"` + Files [][]string `json:"files"` + Options map[string]string `json:"options,omitempty"` +} + +type RestfulClient struct { + cli *req.Client +} + +func (r *RestfulClient) BulkInsert(ctx context.Context, db, collName, partitionName string, files []string, endTime int64, isL0 bool, skipDiskQuotaCheck bool) (string, error) { + opts := make(map[string]string) + if endTime > 0 { + opts["end_time"] = strconv.FormatInt(endTime, 10) + } + if isL0 { + opts["l0_import"] = "true" + } else { + opts["backup"] = "true" + } + opts["skip_disk_quota_check"] = strconv.FormatBool(skipDiskQuotaCheck) + + createReq := createImportReq{ + DbName: db, + CollectionName: collName, + PartitionName: partitionName, + Files: [][]string{files}, + Options: opts, + } + var createResp createImportResp + log.Info("create import job via restful", zap.Any("createReq", createReq)) + resp, err := r.cli.R(). + SetContext(ctx). + SetBody(createReq). + SetSuccessResult(&createResp). + Post("/v2/vectordb/jobs/import/create") + if err != nil { + return "", fmt.Errorf("client: failed to create import job via restful: %w", err) + } + log.Info("create import job via restful", zap.Any("createResp", resp)) + if resp.IsErrorState() { + return "", fmt.Errorf("client: failed to create import job via restful: %v", resp) + } + if createResp.Code != 0 { + return "", fmt.Errorf("client: failed to create import job via restful: %v", createResp) + } + + return createResp.Data.JobId, nil +} + +func (r *RestfulClient) GetBulkInsertState(ctx context.Context, dbName, jobID string) (*GetProcessResp, error) { + getReq := &GetProgressReq{DBName: dbName, JobId: jobID} + + var getResp GetProcessResp + resp, err := r.cli.R(). + SetContext(ctx). + SetBody(getReq). + SetSuccessResult(&getResp). + Post("/v2/vectordb/jobs/import/describe") + if err != nil { + return nil, fmt.Errorf("client: failed to get import job state via restful: %w", err) + } + log.Info("get import job state via restful", zap.Any("getResp", resp)) + if resp.IsErrorState() { + return nil, fmt.Errorf("client: failed to get import job state via restful: %v", resp) + } + + return &getResp, nil +} + +func NewRestful(cfg *Cfg) (*RestfulClient, error) { + baseURL, err := cfg.parseRestful() + if err != nil { + return nil, fmt.Errorf("client: failed to parse restful address: %w", err) + } + cli := req.C(). + SetBaseURL(baseURL.String()). + SetCommonBearerAuthToken(fmt.Sprintf("%s:%s", cfg.Username, cfg.Password)) + return &RestfulClient{cli: cli}, nil +} diff --git a/core/backup_meta.go b/core/meta/backup_meta.go similarity index 97% rename from core/backup_meta.go rename to core/meta/backup_meta.go index 9d38ca9..e958f9d 100644 --- a/core/backup_meta.go +++ b/core/meta/backup_meta.go @@ -1,4 +1,4 @@ -package core +package meta import ( "encoding/json" @@ -6,6 +6,7 @@ import ( "strings" "github.com/golang/protobuf/proto" + "github.com/zilliztech/milvus-backup/core/proto/backuppb" ) @@ -19,10 +20,7 @@ const ( CP_META_FILE = "channel_cp_meta.json" SEPERATOR = "/" - BINGLOG_DIR = "binlogs" - INSERT_LOG_DIR = "insert_log" - DELTA_LOG_DIR = "delta_log" - STATS_LOG_DIR = "stats_log" + BinglogDir = "binlogs" LoadState_NotExist = "NotExist" LoadState_NotLoad = "NotLoad" @@ -111,7 +109,7 @@ func treeToLevel(backup *backuppb.BackupInfo) (LeveledBackupInfo, error) { }, nil } -func serialize(backup *backuppb.BackupInfo) (*BackupMetaBytes, error) { +func Serialize(backup *backuppb.BackupInfo) (*BackupMetaBytes, error) { level, err := treeToLevel(backup) if err != nil { return nil, err @@ -194,7 +192,7 @@ func levelToTree(level *LeveledBackupInfo) (*backuppb.BackupInfo, error) { return backupInfo, nil } -func deserialize(backup *BackupMetaBytes) (*backuppb.BackupInfo, error) { +func Deserialize(backup *BackupMetaBytes) (*backuppb.BackupInfo, error) { backupInfo := &backuppb.BackupInfo{} err := json.Unmarshal(backup.BackupMetaBytes, backupInfo) if err != nil { @@ -252,7 +250,7 @@ func ChannelCPMetaPath(backupRootPath, backupName string) string { } func BackupBinlogDirPath(backupRootPath, backupName string) string { - return backupRootPath + SEPERATOR + backupName + SEPERATOR + BINGLOG_DIR + return backupRootPath + SEPERATOR + backupName + SEPERATOR + BinglogDir } func SimpleListBackupsResponse(input *backuppb.ListBackupsResponse) *backuppb.ListBackupsResponse { diff --git a/core/backup_meta_manager.go b/core/meta/backup_meta_manager.go similarity index 92% rename from core/backup_meta_manager.go rename to core/meta/backup_meta_manager.go index 612a088..d5f71de 100644 --- a/core/backup_meta_manager.go +++ b/core/meta/backup_meta_manager.go @@ -1,4 +1,4 @@ -package core +package meta import ( "sync" @@ -23,7 +23,7 @@ type MetaManager struct { mu sync.Mutex } -func newMetaManager() *MetaManager { +func NewMetaManager() *MetaManager { return &MetaManager{ backups: make(map[string]*backuppb.BackupInfo, 0), collections: make(map[string]map[int64]*backuppb.CollectionBackupInfo, 0), @@ -101,13 +101,13 @@ func (meta *MetaManager) AddSegment(segment *backuppb.SegmentBackupInfo) { type BackupOpt func(backup *backuppb.BackupInfo) -func setStateCode(stateCode backuppb.BackupTaskStateCode) BackupOpt { +func SetStateCode(stateCode backuppb.BackupTaskStateCode) BackupOpt { return func(backup *backuppb.BackupInfo) { backup.StateCode = stateCode } } -func setErrorMessage(errorMessage string) BackupOpt { +func SetErrorMessage(errorMessage string) BackupOpt { return func(backup *backuppb.BackupInfo) { backup.ErrorMessage = errorMessage } @@ -118,7 +118,7 @@ func setStartTime(startTime int64) BackupOpt { } } -func setEndTime(endTime int64) BackupOpt { +func SetEndTime(endTime int64) BackupOpt { return func(backup *backuppb.BackupInfo) { backup.EndTime = endTime } @@ -164,7 +164,7 @@ func setMilvusVersion(milvusVersion string) BackupOpt { } } -func setRBACMeta(rbacMeta *backuppb.RBACMeta) BackupOpt { +func SetRBACMeta(rbacMeta *backuppb.RBACMeta) BackupOpt { return func(backup *backuppb.BackupInfo) { backup.RbacMeta = rbacMeta } @@ -201,7 +201,7 @@ func setCollectionStartTime(startTime int64) CollectionOpt { } } -func setCollectionEndTime(endTime int64) CollectionOpt { +func SetCollectionEndTime(endTime int64) CollectionOpt { return func(collection *backuppb.CollectionBackupInfo) { collection.EndTime = endTime } @@ -214,19 +214,19 @@ func setCollectionProgress(progress int32) CollectionOpt { } // backup timestamp -func setCollectionBackupTimestamp(backupTimestamp uint64) CollectionOpt { +func SetCollectionBackupTimestamp(backupTimestamp uint64) CollectionOpt { return func(collection *backuppb.CollectionBackupInfo) { collection.BackupTimestamp = backupTimestamp } } -func setCollectionSize(size int64) CollectionOpt { +func SetCollectionSize(size int64) CollectionOpt { return func(collection *backuppb.CollectionBackupInfo) { collection.Size = size } } -func setL0Segments(segments []*backuppb.SegmentBackupInfo) CollectionOpt { +func SetL0Segments(segments []*backuppb.SegmentBackupInfo) CollectionOpt { return func(collection *backuppb.CollectionBackupInfo) { collection.L0Segments = segments } @@ -280,19 +280,19 @@ func setCollectionIndexInfos(indexInfos []*backuppb.IndexInfo) CollectionOpt { } } -func setCollectionLoadState(loadState string) CollectionOpt { +func SetCollectionLoadState(loadState string) CollectionOpt { return func(collection *backuppb.CollectionBackupInfo) { collection.LoadState = loadState } } -func setCollectionBackupPhysicalTimestamp(backupPhysicalTimestamp uint64) CollectionOpt { +func SetCollectionBackupPhysicalTimestamp(backupPhysicalTimestamp uint64) CollectionOpt { return func(collection *backuppb.CollectionBackupInfo) { collection.BackupPhysicalTimestamp = backupPhysicalTimestamp } } -func setCollectionChannelCheckpoints(channelCheckpoints map[string]string) CollectionOpt { +func SetCollectionChannelCheckpoints(channelCheckpoints map[string]string) CollectionOpt { return func(collection *backuppb.CollectionBackupInfo) { collection.ChannelCheckpoints = channelCheckpoints } @@ -370,25 +370,25 @@ func setSegmentNumOfRows(numOfRows int64) SegmentOpt { } } -func setSegmentSize(size int64) SegmentOpt { +func SetSegmentSize(size int64) SegmentOpt { return func(segment *backuppb.SegmentBackupInfo) { segment.Size = size } } -func setSegmentL0(isL0 bool) SegmentOpt { +func SetSegmentL0(isL0 bool) SegmentOpt { return func(segment *backuppb.SegmentBackupInfo) { segment.IsL0 = isL0 } } -func setGroupID(groupID int64) SegmentOpt { +func SetGroupID(groupID int64) SegmentOpt { return func(segment *backuppb.SegmentBackupInfo) { segment.GroupId = groupID } } -func setSegmentBinlogs(binlogs []*backuppb.FieldBinlog) SegmentOpt { +func SetSegmentBinlogs(binlogs []*backuppb.FieldBinlog) SegmentOpt { return func(segment *backuppb.SegmentBackupInfo) { segment.Binlogs = binlogs } @@ -400,7 +400,7 @@ func setSegmentStatsBinlogs(binlogs []*backuppb.FieldBinlog) SegmentOpt { } } -func setSegmentDeltaBinlogs(binlogs []*backuppb.FieldBinlog) SegmentOpt { +func SetSegmentDeltaBinlogs(binlogs []*backuppb.FieldBinlog) SegmentOpt { return func(segment *backuppb.SegmentBackupInfo) { segment.Deltalogs = binlogs } @@ -412,7 +412,7 @@ func setSegmentGroupId(groupId int64) SegmentOpt { } } -func setSegmentBackuped(backuped bool) SegmentOpt { +func SetSegmentBackuped(backuped bool) SegmentOpt { return func(segment *backuppb.SegmentBackupInfo) { segment.Backuped = backuped } @@ -504,13 +504,13 @@ func (meta *MetaManager) GetFullMeta(id string) *backuppb.BackupInfo { type RestoreTaskOpt func(task *backuppb.RestoreBackupTask) -func setRestoreStateCode(stateCode backuppb.RestoreTaskStateCode) RestoreTaskOpt { +func SetRestoreStateCode(stateCode backuppb.RestoreTaskStateCode) RestoreTaskOpt { return func(task *backuppb.RestoreBackupTask) { task.StateCode = stateCode } } -func setRestoreErrorMessage(errorMessage string) RestoreTaskOpt { +func SetRestoreErrorMessage(errorMessage string) RestoreTaskOpt { return func(task *backuppb.RestoreBackupTask) { task.ErrorMessage = errorMessage } @@ -522,7 +522,7 @@ func setRestoreStartTime(startTime int64) RestoreTaskOpt { } } -func setRestoreEndTime(endTime int64) RestoreTaskOpt { +func SetRestoreEndTime(endTime int64) RestoreTaskOpt { return func(task *backuppb.RestoreBackupTask) { task.EndTime = endTime } @@ -534,7 +534,7 @@ func addRestoreRestoredSize(restoredSize int64) RestoreTaskOpt { } } -func addCollectionRestoredSize(collectionID, restoredSize int64) RestoreTaskOpt { +func AddCollectionRestoredSize(collectionID, restoredSize int64) RestoreTaskOpt { return func(task *backuppb.RestoreBackupTask) { task.RestoredSize = task.RestoredSize + restoredSize for _, coll := range task.GetCollectionRestoreTasks() { @@ -588,13 +588,13 @@ func (meta *MetaManager) UpdateRestoreCollectionTask(restoreID string, restoreCo type RestoreCollectionTaskOpt func(task *backuppb.RestoreCollectionTask) -func setRestoreCollectionStateCode(stateCode backuppb.RestoreTaskStateCode) RestoreCollectionTaskOpt { +func SetRestoreCollectionStateCode(stateCode backuppb.RestoreTaskStateCode) RestoreCollectionTaskOpt { return func(task *backuppb.RestoreCollectionTask) { task.StateCode = stateCode } } -func setRestoreCollectionErrorMessage(errorMessage string) RestoreCollectionTaskOpt { +func SetRestoreCollectionErrorMessage(errorMessage string) RestoreCollectionTaskOpt { return func(task *backuppb.RestoreCollectionTask) { task.ErrorMessage = errorMessage } diff --git a/core/milvus_sdk_test.go b/core/milvus_sdk_test.go deleted file mode 100644 index 70d2421..0000000 --- a/core/milvus_sdk_test.go +++ /dev/null @@ -1,360 +0,0 @@ -package core - -import ( - "context" - "fmt" - "testing" - "time" - - "github.com/zilliztech/milvus-backup/internal/log" - - gomilvus "github.com/milvus-io/milvus-sdk-go/v2/client" - "github.com/milvus-io/milvus-sdk-go/v2/entity" - "github.com/stretchr/testify/assert" - "go.uber.org/zap" -) - -func TestProxyClient(t *testing.T) { - ctx := context.Background() - milvusAddr := "localhost:19530" - //c, err := proxy.NewClient(context, milvusAddr) - //assert.NoError(t, err) - - c2, err := gomilvus.NewGrpcClient(ctx, milvusAddr) - assert.NoError(t, err) - collections, err := c2.ListCollections(ctx) - for _, coll := range collections { - log.Info("collections", zap.Any("coll", coll.Name), zap.Int64("id", coll.ID)) - } - - //coll, err := c2.DescribeCollection(ctx, "hello_milvus") - //log.Info("collection", zap.Any("hello_milvus", coll)) - - //c2.DropCollection(ctx, "demo_bulkinsert") - //c2.DropCollection(ctx, "hello_milvus") - //c2.DropCollection(ctx, "hello_milvus_recover") - - //idCol, randomCol, embeddingCol = "ID", "random", "embeddings" - pks := entity.NewColumnInt64("ID", []int64{0, 1}) - res, err := c2.QueryByPks(ctx, "hello_milvus_recover", nil, pks, []string{"random"}, gomilvus.WithSearchQueryConsistencyLevel(entity.ClStrong)) - log.Info("query result", zap.Any("query result", res)) - - //assert.Empty(t, collections) -} - -func TestCreateCollection(t *testing.T) { - ctx := context.Background() - milvusAddr := "local:19530" - //c, err := proxy.NewClient(context, milvusAddr) - //assert.NoError(t, err) - - client, err := gomilvus.NewGrpcClient(ctx, milvusAddr) - assert.NoError(t, err) - - //MILVUS_DATA_PATH := "/tmp/milvus/data/" - - _COLLECTION_NAME := "create_demo" - _ID_FIELD_NAME := "id_field" - _VECTOR_FIELD_NAME := "float_vector_field" - _STR_FIELD_NAME := "str_field" - _ARRAY_FIELD_NAME := "arr_field" - - // String field parameter - _MAX_LENGTH := "65535" - _ARRAY_MAX_CAPACITY := "100" - // Vector field parameter - _DIM := "8" - - //field1 = FieldSchema(name=_ID_FIELD_NAME, dtype=DataType.INT64, description="int64", is_primary=True, auto_id=True) - //field2 = FieldSchema(name=_VECTOR_FIELD_NAME, dtype=DataType.FLOAT_VECTOR, description="float vector", dim=_DIM, - // is_primary=False) - //field3 = FieldSchema(name=_STR_FIELD_NAME, dtype=DataType.VARCHAR, description="string", - // max_length=_MAX_LENGTH, is_primary=False) - //schema = CollectionSchema(fields=[field1, field2, field3], description="collection description") - //collection = Collection(name=_COLLECTION_NAME, data=None, schema=schema) - - field1 := &entity.Field{ - Name: _ID_FIELD_NAME, - DataType: entity.FieldTypeInt64, - Description: "int64", - PrimaryKey: true, - AutoID: true, - } - field2 := &entity.Field{ - Name: _VECTOR_FIELD_NAME, - DataType: entity.FieldTypeFloatVector, - Description: "float vector", - TypeParams: map[string]string{ - entity.TypeParamDim: _DIM, - }, - PrimaryKey: false, - } - field3 := &entity.Field{ - Name: _STR_FIELD_NAME, - DataType: entity.FieldTypeVarChar, - Description: "string", - PrimaryKey: false, - TypeParams: map[string]string{ - entity.TypeParamMaxLength: _MAX_LENGTH, - }, - } - field4 := &entity.Field{ - Name: _ARRAY_FIELD_NAME, - DataType: entity.FieldTypeArray, - Description: "arr", - ElementType: entity.FieldTypeInt64, - TypeParams: map[string]string{ - entity.TypeParamMaxCapacity: _ARRAY_MAX_CAPACITY, - }, - } - schema := &entity.Schema{ - CollectionName: _COLLECTION_NAME, - Description: "demo bulkinsert", - AutoID: true, - Fields: []*entity.Field{field1, field2, field3, field4}, - } - //client.DropCollection(ctx, _COLLECTION_NAME) - - err = client.CreateCollection(ctx, schema, 2) - println(err) - _PART_1 := "part_1" - client.CreatePartition(ctx, _COLLECTION_NAME, _PART_1) - - //client.DropCollection(ctx, _COLLECTION_NAME) -} - -func TestBulkInsert(t *testing.T) { - ctx := context.Background() - milvusAddr := "localhost:19530" - //c, err := proxy.NewClient(context, milvusAddr) - //assert.NoError(t, err) - - client, err := gomilvus.NewGrpcClient(ctx, milvusAddr) - assert.NoError(t, err) - - //MILVUS_DATA_PATH := "/tmp/milvus/data/" - - _COLLECTION_NAME := "demo_bulk_insert" - _ID_FIELD_NAME := "id_field" - _VECTOR_FIELD_NAME := "float_vector_field" - _STR_FIELD_NAME := "str_field" - - // String field parameter - _MAX_LENGTH := "65535" - - // Vector field parameter - _DIM := "8" - - //field1 = FieldSchema(name=_ID_FIELD_NAME, dtype=DataType.INT64, description="int64", is_primary=True, auto_id=True) - //field2 = FieldSchema(name=_VECTOR_FIELD_NAME, dtype=DataType.FLOAT_VECTOR, description="float vector", dim=_DIM, - // is_primary=False) - //field3 = FieldSchema(name=_STR_FIELD_NAME, dtype=DataType.VARCHAR, description="string", - // max_length=_MAX_LENGTH, is_primary=False) - //schema = CollectionSchema(fields=[field1, field2, field3], description="collection description") - //collection = Collection(name=_COLLECTION_NAME, data=None, schema=schema) - - field1 := &entity.Field{ - Name: _ID_FIELD_NAME, - DataType: entity.FieldTypeInt64, - Description: "int64", - PrimaryKey: true, - AutoID: true, - } - field2 := &entity.Field{ - Name: _VECTOR_FIELD_NAME, - DataType: entity.FieldTypeFloatVector, - Description: "float vector", - TypeParams: map[string]string{ - entity.TypeParamDim: _DIM, - }, - PrimaryKey: false, - } - field3 := &entity.Field{ - Name: _STR_FIELD_NAME, - DataType: entity.FieldTypeVarChar, - Description: "string", - PrimaryKey: false, - TypeParams: map[string]string{ - entity.TypeParamMaxLength: _MAX_LENGTH, - }, - } - schema := &entity.Schema{ - CollectionName: _COLLECTION_NAME, - Description: "demo bulkinsert", - AutoID: true, - Fields: []*entity.Field{field1, field2, field3}, - } - client.DropCollection(ctx, _COLLECTION_NAME) - - client.CreateCollection(ctx, schema, 2) - _PART_1 := "part_1" - client.CreatePartition(ctx, _COLLECTION_NAME, _PART_1) - file_names := make([]string, 0) - file_names = append(file_names, "rows_0.json") - file_names = append(file_names, "rows_1.json") - file_names = append(file_names, "rows_2.json") - - id, err := client.BulkInsert(ctx, _COLLECTION_NAME, _PART_1, file_names) - - log.Info("bulk insert task ids", zap.Int64("id", id)) - - for { - state, _ := client.GetBulkInsertState(ctx, id) - log.Info("bulk insert task state", zap.Any("state", state)) - time.Sleep(3 * time.Second) - } - //time.Sleep(30 * time.Second) - - client.DropCollection(ctx, _COLLECTION_NAME) -} - -func TestGetBulkInsertState(t *testing.T) { - ctx := context.Background() - milvusAddr := "10.102.9.123:19530" - //c, err := proxy.NewClient(context, milvusAddr) - //assert.NoError(t, err) - - client, err := gomilvus.NewGrpcClient(ctx, milvusAddr) - assert.NoError(t, err) - - state, err := client.GetBulkInsertState(ctx, 446469603780484268) - - println(state.State) - log.Info("bulk insert task state", zap.Any("state", state)) -} - -func TestGetIndex(t *testing.T) { - ctx := context.Background() - milvusAddr := "localhost:19530" - c, err := gomilvus.NewGrpcClient(ctx, milvusAddr) - assert.NoError(t, err) - - coll, err := c.DescribeCollection(ctx, "hello_milvus_recover") - - //log.Info("coll", zap.Any("coll", coll)) - fmt.Println(coll.Schema.Fields[0]) - fmt.Println(coll.Schema.Fields[1]) - fmt.Println(coll.Schema.Fields[2]) - - index, err := c.DescribeIndex(ctx, "hello_milvus_recover", "embeddings") - fmt.Println(index) - - indexState, err := c.GetIndexState(ctx, "hello_milvus", "embeddings") - fmt.Println(indexState) - progress, err := c.GetLoadingProgress(ctx, "hello_milvus_recover", []string{}) - fmt.Println(progress) - - loadState, err := c.GetLoadState(ctx, "hello_milvus_recover", []string{}) - fmt.Println(loadState) - -} - -func TestCreateIndex(t *testing.T) { - ctx := context.Background() - milvusAddr := "localhost:19530" - client, err := gomilvus.NewGrpcClient(ctx, milvusAddr) - assert.NoError(t, err) - - _COLLECTION_NAME := "demo_bulk_insert2" - _ID_FIELD_NAME := "id_field" - _VECTOR_FIELD_NAME := "float_vector_field" - _STR_FIELD_NAME := "str_field" - - // String field parameter - _MAX_LENGTH := "65535" - - // Vector field parameter - _DIM := "8" - - //field1 = FieldSchema(name=_ID_FIELD_NAME, dtype=DataType.INT64, description="int64", is_primary=True, auto_id=True) - //field2 = FieldSchema(name=_VECTOR_FIELD_NAME, dtype=DataType.FLOAT_VECTOR, description="float vector", dim=_DIM, - // is_primary=False) - //field3 = FieldSchema(name=_STR_FIELD_NAME, dtype=DataType.VARCHAR, description="string", - // max_length=_MAX_LENGTH, is_primary=False) - //schema = CollectionSchema(fields=[field1, field2, field3], description="collection description") - //collection = Collection(name=_COLLECTION_NAME, data=None, schema=schema) - - field1 := &entity.Field{ - Name: _ID_FIELD_NAME, - DataType: entity.FieldTypeInt64, - Description: "int64", - PrimaryKey: true, - AutoID: true, - } - field2 := &entity.Field{ - Name: _VECTOR_FIELD_NAME, - DataType: entity.FieldTypeFloatVector, - Description: "float vector", - TypeParams: map[string]string{ - entity.TypeParamDim: _DIM, - }, - PrimaryKey: false, - } - field3 := &entity.Field{ - Name: _STR_FIELD_NAME, - DataType: entity.FieldTypeVarChar, - Description: "string", - PrimaryKey: false, - TypeParams: map[string]string{ - entity.TypeParamMaxLength: _MAX_LENGTH, - }, - } - schema := &entity.Schema{ - CollectionName: _COLLECTION_NAME, - Description: "demo bulkinsert", - AutoID: true, - Fields: []*entity.Field{field1, field2, field3}, - } - //client.DropCollection(ctx, _COLLECTION_NAME) - fmt.Println(schema) - client.CreateCollection(ctx, schema, 2) - - idx := entity.NewScalarIndex() - err = client.CreateIndex(ctx, _COLLECTION_NAME, _STR_FIELD_NAME, idx, false, gomilvus.WithIndexName("_default_idx_102")) - fmt.Println(err) - - idx2, _ := entity.NewIndexHNSW(entity.L2, 8, 96) - //err = client.DropIndex(ctx, _COLLECTION_NAME, _VECTOR_FIELD_NAME, gomilvus.WithIndexName("_default_idx_101")) - //fmt.Println(err) - err = client.CreateIndex(ctx, _COLLECTION_NAME, _VECTOR_FIELD_NAME, idx2, false, gomilvus.WithIndexName("_default_idx_102")) - - fmt.Println(err) -} - -func TestDescribeIndex(t *testing.T) { - ctx := context.Background() - milvusAddr := "localhost:19530" - client, err := gomilvus.NewGrpcClient(ctx, milvusAddr) - assert.NoError(t, err) - - _COLLECTION_NAME := "demo_bulk_insert2" - _STR_FIELD_NAME := "str_field" - _VECTOR_FIELD_NAME := "float_vector_field" - - idxs, err := client.DescribeIndex(ctx, _COLLECTION_NAME, _STR_FIELD_NAME) - fmt.Println(idxs) - fmt.Println(err) - idxs2, err := client.DescribeIndex(ctx, _COLLECTION_NAME, _VECTOR_FIELD_NAME) - fmt.Println(idxs2) - fmt.Println(err) -} - -func TestCleanAll(t *testing.T) { - ctx := context.Background() - milvusAddr := "10.102.9.64:19530" - - c2, err := gomilvus.NewGrpcClient(ctx, milvusAddr) - assert.NoError(t, err) - - dbs, err := c2.ListDatabases(ctx) - - for _, db := range dbs { - c2.UsingDatabase(ctx, db.Name) - collections, _ := c2.ListCollections(ctx) - for _, coll := range collections { - c2.DropCollection(ctx, coll.Name) - log.Info("collections", zap.Any("coll", coll.Name), zap.Int64("id", coll.ID)) - } - c2.DropDatabase(ctx, db.Name) - } -} diff --git a/core/milvus_sdk_wrapper.go b/core/milvus_sdk_wrapper.go deleted file mode 100644 index 5816040..0000000 --- a/core/milvus_sdk_wrapper.go +++ /dev/null @@ -1,209 +0,0 @@ -package core - -import ( - "context" - "sync" - "time" - - "github.com/milvus-io/milvus-proto/go-api/v2/msgpb" - gomilvus "github.com/milvus-io/milvus-sdk-go/v2/client" - "github.com/milvus-io/milvus-sdk-go/v2/entity" - - "github.com/zilliztech/milvus-backup/internal/util/retry" -) - -// MilvusClient wrap db into milvus API to make it thread safe -type MilvusClient struct { - mu sync.Mutex - client gomilvus.Client -} - -func (m *MilvusClient) Close() error { - return m.client.Close() -} - -func (m *MilvusClient) GetVersion(ctx context.Context) (string, error) { - return m.client.GetVersion(ctx) -} - -func (m *MilvusClient) CreateDatabase(ctx context.Context, dbName string) error { - return m.client.CreateDatabase(ctx, dbName) -} - -func (m *MilvusClient) ListDatabases(ctx context.Context) ([]entity.Database, error) { - return m.client.ListDatabases(ctx) -} - -func (m *MilvusClient) DescribeCollection(ctx context.Context, db, collName string) (*entity.Collection, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return nil, err - } - return m.client.DescribeCollection(ctx, collName) -} - -func (m *MilvusClient) DescribeIndex(ctx context.Context, db, collName, fieldName string) ([]entity.Index, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return nil, err - } - return m.client.DescribeIndex(ctx, collName, fieldName) -} - -func (m *MilvusClient) ShowPartitions(ctx context.Context, db, collName string) ([]*entity.Partition, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return nil, err - } - return m.client.ShowPartitions(ctx, collName) -} - -func (m *MilvusClient) GetLoadingProgress(ctx context.Context, db, collName string, partitionNames []string) (int64, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return 0, err - } - return m.client.GetLoadingProgress(ctx, collName, partitionNames) -} - -func (m *MilvusClient) GetPersistentSegmentInfo(ctx context.Context, db, collName string) ([]*entity.Segment, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return nil, err - } - return m.client.GetPersistentSegmentInfo(ctx, collName) -} - -func (m *MilvusClient) FlushV2(ctx context.Context, db, collName string, async bool) ([]int64, []int64, int64, map[string]msgpb.MsgPosition, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return nil, nil, 0, nil, err - } - return m.client.FlushV2(ctx, collName, async) -} - -func (m *MilvusClient) ListCollections(ctx context.Context, db string) ([]*entity.Collection, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return nil, err - } - return m.client.ListCollections(ctx) -} - -func (m *MilvusClient) HasCollection(ctx context.Context, db, collName string) (bool, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return false, err - } - return m.client.HasCollection(ctx, collName) -} - -func (m *MilvusClient) BulkInsert(ctx context.Context, db, collName string, partitionName string, files []string, opts ...gomilvus.BulkInsertOption) (int64, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return 0, err - } - return m.client.BulkInsert(ctx, collName, partitionName, files, opts...) -} - -func (m *MilvusClient) GetBulkInsertState(ctx context.Context, taskID int64) (*entity.BulkInsertTaskState, error) { - return m.client.GetBulkInsertState(ctx, taskID) -} - -func (m *MilvusClient) CreateCollection(ctx context.Context, db string, schema *entity.Schema, shardsNum int32, opts ...gomilvus.CreateCollectionOption) error { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return err - } - // add retry to make sure won't be block by rate control - return retry.Do(ctx, func() error { - return m.client.CreateCollection(ctx, schema, shardsNum, opts...) - }, retry.Sleep(2*time.Second), retry.Attempts(10)) -} - -func (m *MilvusClient) DropCollection(ctx context.Context, db string, collectionName string) error { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return err - } - // add retry to make sure won't be block by rate control - return retry.Do(ctx, func() error { - return m.client.DropCollection(ctx, collectionName) - }, retry.Sleep(2*time.Second), retry.Attempts(10)) -} - -func (m *MilvusClient) CreatePartition(ctx context.Context, db, collName string, partitionName string) error { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return err - } - return retry.Do(ctx, func() error { - return m.client.CreatePartition(ctx, collName, partitionName) - }, retry.Sleep(2*time.Second), retry.Attempts(10)) -} - -func (m *MilvusClient) HasPartition(ctx context.Context, db, collName string, partitionName string) (bool, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return false, err - } - return m.client.HasPartition(ctx, collName, partitionName) -} - -func (m *MilvusClient) CreateIndex(ctx context.Context, db, collName string, fieldName string, idx entity.Index, async bool) error { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return err - } - return m.client.CreateIndex(ctx, collName, fieldName, idx, async, gomilvus.WithIndexName(idx.Name())) -} - -func (m *MilvusClient) DropIndex(ctx context.Context, db, collName string, indexName string) error { - m.mu.Lock() - defer m.mu.Unlock() - err := m.client.UsingDatabase(ctx, db) - if err != nil { - return err - } - return m.client.DropIndex(ctx, collName, "", gomilvus.WithIndexName(indexName)) -} - -func (m *MilvusClient) BackupRBAC(ctx context.Context) (*entity.RBACMeta, error) { - m.mu.Lock() - defer m.mu.Unlock() - return m.client.BackupRBAC(ctx) -} - -func (m *MilvusClient) RestoreRBAC(ctx context.Context, rbacMeta *entity.RBACMeta) error { - m.mu.Lock() - defer m.mu.Unlock() - return m.client.RestoreRBAC(ctx, rbacMeta) -} diff --git a/core/milvus_storage_test.go b/core/milvus_storage_test.go deleted file mode 100644 index 1c109c6..0000000 --- a/core/milvus_storage_test.go +++ /dev/null @@ -1,136 +0,0 @@ -package core - -import ( - "context" - "os" - "strconv" - "strings" - "testing" - - "github.com/minio/minio-go/v7" - "github.com/minio/minio-go/v7/pkg/credentials" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/zilliztech/milvus-backup/core/storage/tencent" - - "github.com/zilliztech/milvus-backup/core/paramtable" - "github.com/zilliztech/milvus-backup/core/storage" - "github.com/zilliztech/milvus-backup/internal/log" - "go.uber.org/zap" -) - -var Params paramtable.BackupParams - -func newMinioChunkManager(ctx context.Context, bucketName string) (*storage.MinioChunkManager, error) { - endPoint := getMinioAddress() - accessKeyID, _ := Params.Load("minio.accessKeyID") - secretAccessKey, _ := Params.Load("minio.secretAccessKey") - useSSLStr, _ := Params.Load("minio.useSSL") - useSSL, _ := strconv.ParseBool(useSSLStr) - - storageConfig := &storage.StorageConfig{ - StorageType: "minio", - Address: endPoint, - AccessKeyID: accessKeyID, - SecretAccessKeyID: secretAccessKey, - UseSSL: useSSL, - CreateBucket: true, - UseIAM: false, - IAMEndpoint: "", - } - - client, err := storage.NewMinioChunkManagerWithConfig(ctx, storageConfig) - return client, err -} - -func getMinioAddress() string { - minioHost := Params.LoadWithDefault("minio.address", paramtable.DefaultMinioAddress) - if strings.Contains(minioHost, ":") { - return minioHost - } - port := Params.LoadWithDefault("minio.port", paramtable.DefaultMinioPort) - return minioHost + ":" + port -} - -func TestWriteAEmptyBackupFile(t *testing.T) { - - Params.Init() - testBucket, err := Params.Load("minio.bucketName") - require.NoError(t, err) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - testCM, err := newMinioChunkManager(ctx, testBucket) - err = testCM.Write(ctx, testBucket, "backup/test_backup6", nil) - assert.NoError(t, err) -} - -func TestReadBackupFiles(t *testing.T) { - - Params.Init() - testBucket, err := Params.Load("minio.bucketName") - require.NoError(t, err) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - testCM, err := newMinioChunkManager(ctx, testBucket) - files, _, err := testCM.ListWithPrefix(ctx, testBucket, "/backup", true) - assert.NoError(t, err) - - for _, file := range files { - log.Info("BackupFiles", zap.String("path", file)) - } - -} - -func TestReadMilvusData(t *testing.T) { - var params paramtable.BackupParams - params.GlobalInitWithYaml("backup.yaml") - params.Init() - - context := context.Background() - //backupContext := CreateBackupContext(context, params) - - client, err := createStorageClient(context, params) - assert.NoError(t, err) - paths, _, err := client.ListWithPrefix(context, params.MinioCfg.BucketName, "file/insert_log/437296492118216229/437296492118216230/", true) - assert.NoError(t, err) - for _, path := range paths { - if strings.Contains(path, "index_files") { - continue - } - if strings.Contains(path, "437296588890839162") || - strings.Contains(path, "437296588890833721") || - strings.Contains(path, "437296584963129351") || - strings.Contains(path, "437296581056135434") || - strings.Contains(path, "437296588890833719") { - log.Info(path) - bytes, err := client.Read(context, params.MinioCfg.BucketName, path) - os.MkdirAll(path, os.ModePerm) - os.Remove(path) - err = os.WriteFile(path, bytes, 0666) - assert.NoError(t, err) - //log.Info("paths", zap.Strings("paths", paths)) - } - - //log.Info(path) - } - -} - -func TestTencentOSS(t *testing.T) { - var creds *credentials.Credentials - bucketLookupType := minio.BucketLookupDNS - minioOpts := &minio.Options{ - BucketLookup: bucketLookupType, - Creds: creds, - Secure: true, - } - client, err := tencent.NewMinioClient("cos.ap-nanjing.myqcloud.com", minioOpts) - assert.NoError(t, err) - exist, err := client.BucketExists(context.Background(), "") - assert.NoError(t, err) - assert.True(t, exist) -} diff --git a/core/paramtable/base_table_test.go b/core/paramtable/base_table_test.go index aac7cc4..ccd5673 100644 --- a/core/paramtable/base_table_test.go +++ b/core/paramtable/base_table_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + memkv "github.com/zilliztech/milvus-backup/internal/kv/mem" ) diff --git a/core/pbconv/bak_to_milvus.go b/core/pbconv/bak_to_milvus.go new file mode 100644 index 0000000..e38ede3 --- /dev/null +++ b/core/pbconv/bak_to_milvus.go @@ -0,0 +1,22 @@ +package pbconv + +import ( + "github.com/milvus-io/milvus-proto/go-api/v2/commonpb" + "github.com/samber/lo" + + "github.com/zilliztech/milvus-backup/core/proto/backuppb" +) + +func BakKVToMilvusKV(kv []*backuppb.KeyValuePair, skipKeys ...string) []*commonpb.KeyValuePair { + skip := lo.SliceToMap(skipKeys, func(item string) (string, struct{}) { + return item, struct{}{} + }) + + return lo.FilterMap(kv, func(item *backuppb.KeyValuePair, i int) (*commonpb.KeyValuePair, bool) { + if _, ok := skip[item.Key]; ok { + return nil, false + } + + return &commonpb.KeyValuePair{Key: item.Key, Value: item.Value}, true + }) +} diff --git a/core/pbconv/bak_to_milvus_test.go b/core/pbconv/bak_to_milvus_test.go new file mode 100644 index 0000000..626c32a --- /dev/null +++ b/core/pbconv/bak_to_milvus_test.go @@ -0,0 +1,24 @@ +package pbconv + +import ( + "testing" + + "github.com/milvus-io/milvus-proto/go-api/v2/commonpb" + "github.com/stretchr/testify/assert" + + "github.com/zilliztech/milvus-backup/core/proto/backuppb" +) + +func TestBakKVToMilvusKV(t *testing.T) { + kvs := []*backuppb.KeyValuePair{{Key: "key1", Value: "value1"}, {Key: "key2", Value: "value2"}} + expect := []*commonpb.KeyValuePair{{Key: "key1", Value: "value1"}, {Key: "key2", Value: "value2"}} + res := BakKVToMilvusKV(kvs) + assert.Len(t, res, len(expect)) + assert.ElementsMatch(t, res, expect) + + skip := []string{"key1"} + expect = []*commonpb.KeyValuePair{{Key: "key2", Value: "value2"}} + res = BakKVToMilvusKV(kvs, skip...) + assert.Len(t, res, len(kvs)-len(skip)) + assert.ElementsMatch(t, res, expect) +} diff --git a/core/proto/backup.proto b/core/proto/backup.proto index 498c273..b08df50 100644 --- a/core/proto/backup.proto +++ b/core/proto/backup.proto @@ -245,6 +245,15 @@ enum RestoreTaskStateCode { TIMEOUT = 4; } +message SkipParams { + repeated string collection_properties = 1; + + repeated string filed_index_params = 2; + repeated string filed_type_params = 3; + + repeated string index_params = 4; +} + message RestoreBackupRequest { // uuid of request, will generate one if not set string requestId = 1; @@ -285,6 +294,8 @@ message RestoreBackupRequest { bool rbac = 18; // target max shard number int32 maxShardNum = 19; + // if key is set, will skip the params in restore process + SkipParams skip_params = 20; } message RestorePartitionTask { @@ -325,6 +336,7 @@ message RestoreCollectionTask { bool skipDiskQuotaCheck = 19; // target max shard number int32 maxShardNum = 20; + SkipParams skip_params = 21; } message RestoreBackupTask { @@ -385,6 +397,12 @@ enum ConsistencyLevel { Customized = 4; // Users pass their own `guarantee_timestamp`. } +enum FunctionType{ + Unknown =0; + BM25 =1; + TextEmbedding =2; +} + // copied from milvus schema.proto @@ -434,9 +452,6 @@ message ValueField { } } -/** - * @brief Field schema. The same as https://github.com/milvus-io/milvus-proto schema.proto - */ message FieldSchema { int64 fieldID = 1; string name = 2; @@ -453,6 +468,19 @@ message FieldSchema { bool is_partition_key = 13; // enable logic partitions bool nullable = 14; string default_value_proto = 15; // json not support marshall oneof, so use proto string + bool is_function_output = 16; +} + +message FunctionSchema { + string name = 1; + int64 id =2; + string description = 3; + FunctionType type = 4; + repeated string input_field_names = 5; + repeated int64 input_field_ids = 6; + repeated string output_field_names = 7; + repeated int64 output_field_ids = 8; + repeated KeyValuePair params = 9; } /** @@ -464,6 +492,8 @@ message CollectionSchema { bool autoID = 3; // deprecated later, keep compatible with c++ part now repeated FieldSchema fields = 4; bool enable_dynamic_field = 5; // mark whether this table has the dynamic field function enabled. + repeated KeyValuePair properties = 6; + repeated FunctionSchema functions = 7; } message CheckRequest { diff --git a/core/proto/backuppb/backup.pb.go b/core/proto/backuppb/backup.pb.go index fff0429..1ca874f 100644 --- a/core/proto/backuppb/backup.pb.go +++ b/core/proto/backuppb/backup.pb.go @@ -1,29 +1,30 @@ // Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.33.0 +// protoc v3.9.0 // source: backup.proto package backuppb import ( context "context" - fmt "fmt" - proto "github.com/golang/protobuf/proto" + reflect "reflect" + sync "sync" + _struct "github.com/golang/protobuf/ptypes/struct" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - math "math" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) type ResponseCode int32 @@ -36,30 +37,51 @@ const ( ResponseCode_Request_Object_Not_Found ResponseCode = 404 ) -var ResponseCode_name = map[int32]string{ - 0: "Success", - 1: "Not_Support", - 2: "No_Permission", - 3: "Fail", - 400: "Parameter_Error", - 404: "Request_Object_Not_Found", -} +// Enum value maps for ResponseCode. +var ( + ResponseCode_name = map[int32]string{ + 0: "Success", + 1: "Not_Support", + 2: "No_Permission", + 3: "Fail", + 400: "Parameter_Error", + 404: "Request_Object_Not_Found", + } + ResponseCode_value = map[string]int32{ + "Success": 0, + "Not_Support": 1, + "No_Permission": 2, + "Fail": 3, + "Parameter_Error": 400, + "Request_Object_Not_Found": 404, + } +) -var ResponseCode_value = map[string]int32{ - "Success": 0, - "Not_Support": 1, - "No_Permission": 2, - "Fail": 3, - "Parameter_Error": 400, - "Request_Object_Not_Found": 404, +func (x ResponseCode) Enum() *ResponseCode { + p := new(ResponseCode) + *p = x + return p } func (x ResponseCode) String() string { - return proto.EnumName(ResponseCode_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ResponseCode) Descriptor() protoreflect.EnumDescriptor { + return file_backup_proto_enumTypes[0].Descriptor() +} + +func (ResponseCode) Type() protoreflect.EnumType { + return &file_backup_proto_enumTypes[0] +} + +func (x ResponseCode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use ResponseCode.Descriptor instead. func (ResponseCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{0} + return file_backup_proto_rawDescGZIP(), []int{0} } type BackupTaskStateCode int32 @@ -72,28 +94,49 @@ const ( BackupTaskStateCode_BACKUP_TIMEOUT BackupTaskStateCode = 4 ) -var BackupTaskStateCode_name = map[int32]string{ - 0: "BACKUP_INITIAL", - 1: "BACKUP_EXECUTING", - 2: "BACKUP_SUCCESS", - 3: "BACKUP_FAIL", - 4: "BACKUP_TIMEOUT", -} +// Enum value maps for BackupTaskStateCode. +var ( + BackupTaskStateCode_name = map[int32]string{ + 0: "BACKUP_INITIAL", + 1: "BACKUP_EXECUTING", + 2: "BACKUP_SUCCESS", + 3: "BACKUP_FAIL", + 4: "BACKUP_TIMEOUT", + } + BackupTaskStateCode_value = map[string]int32{ + "BACKUP_INITIAL": 0, + "BACKUP_EXECUTING": 1, + "BACKUP_SUCCESS": 2, + "BACKUP_FAIL": 3, + "BACKUP_TIMEOUT": 4, + } +) -var BackupTaskStateCode_value = map[string]int32{ - "BACKUP_INITIAL": 0, - "BACKUP_EXECUTING": 1, - "BACKUP_SUCCESS": 2, - "BACKUP_FAIL": 3, - "BACKUP_TIMEOUT": 4, +func (x BackupTaskStateCode) Enum() *BackupTaskStateCode { + p := new(BackupTaskStateCode) + *p = x + return p } func (x BackupTaskStateCode) String() string { - return proto.EnumName(BackupTaskStateCode_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BackupTaskStateCode) Descriptor() protoreflect.EnumDescriptor { + return file_backup_proto_enumTypes[1].Descriptor() +} + +func (BackupTaskStateCode) Type() protoreflect.EnumType { + return &file_backup_proto_enumTypes[1] +} + +func (x BackupTaskStateCode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use BackupTaskStateCode.Descriptor instead. func (BackupTaskStateCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{1} + return file_backup_proto_rawDescGZIP(), []int{1} } type RestoreTaskStateCode int32 @@ -106,62 +149,153 @@ const ( RestoreTaskStateCode_TIMEOUT RestoreTaskStateCode = 4 ) -var RestoreTaskStateCode_name = map[int32]string{ - 0: "INITIAL", - 1: "EXECUTING", - 2: "SUCCESS", - 3: "FAIL", - 4: "TIMEOUT", -} +// Enum value maps for RestoreTaskStateCode. +var ( + RestoreTaskStateCode_name = map[int32]string{ + 0: "INITIAL", + 1: "EXECUTING", + 2: "SUCCESS", + 3: "FAIL", + 4: "TIMEOUT", + } + RestoreTaskStateCode_value = map[string]int32{ + "INITIAL": 0, + "EXECUTING": 1, + "SUCCESS": 2, + "FAIL": 3, + "TIMEOUT": 4, + } +) -var RestoreTaskStateCode_value = map[string]int32{ - "INITIAL": 0, - "EXECUTING": 1, - "SUCCESS": 2, - "FAIL": 3, - "TIMEOUT": 4, +func (x RestoreTaskStateCode) Enum() *RestoreTaskStateCode { + p := new(RestoreTaskStateCode) + *p = x + return p } func (x RestoreTaskStateCode) String() string { - return proto.EnumName(RestoreTaskStateCode_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RestoreTaskStateCode) Descriptor() protoreflect.EnumDescriptor { + return file_backup_proto_enumTypes[2].Descriptor() +} + +func (RestoreTaskStateCode) Type() protoreflect.EnumType { + return &file_backup_proto_enumTypes[2] +} + +func (x RestoreTaskStateCode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use RestoreTaskStateCode.Descriptor instead. func (RestoreTaskStateCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{2} + return file_backup_proto_rawDescGZIP(), []int{2} } type ConsistencyLevel int32 const ( ConsistencyLevel_Strong ConsistencyLevel = 0 - ConsistencyLevel_Session ConsistencyLevel = 1 + ConsistencyLevel_Session ConsistencyLevel = 1 // default in PyMilvus ConsistencyLevel_Bounded ConsistencyLevel = 2 ConsistencyLevel_Eventually ConsistencyLevel = 3 - ConsistencyLevel_Customized ConsistencyLevel = 4 + ConsistencyLevel_Customized ConsistencyLevel = 4 // Users pass their own `guarantee_timestamp`. ) -var ConsistencyLevel_name = map[int32]string{ - 0: "Strong", - 1: "Session", - 2: "Bounded", - 3: "Eventually", - 4: "Customized", -} +// Enum value maps for ConsistencyLevel. +var ( + ConsistencyLevel_name = map[int32]string{ + 0: "Strong", + 1: "Session", + 2: "Bounded", + 3: "Eventually", + 4: "Customized", + } + ConsistencyLevel_value = map[string]int32{ + "Strong": 0, + "Session": 1, + "Bounded": 2, + "Eventually": 3, + "Customized": 4, + } +) -var ConsistencyLevel_value = map[string]int32{ - "Strong": 0, - "Session": 1, - "Bounded": 2, - "Eventually": 3, - "Customized": 4, +func (x ConsistencyLevel) Enum() *ConsistencyLevel { + p := new(ConsistencyLevel) + *p = x + return p } func (x ConsistencyLevel) String() string { - return proto.EnumName(ConsistencyLevel_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ConsistencyLevel) Descriptor() protoreflect.EnumDescriptor { + return file_backup_proto_enumTypes[3].Descriptor() +} + +func (ConsistencyLevel) Type() protoreflect.EnumType { + return &file_backup_proto_enumTypes[3] } +func (x ConsistencyLevel) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ConsistencyLevel.Descriptor instead. func (ConsistencyLevel) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{3} + return file_backup_proto_rawDescGZIP(), []int{3} +} + +type FunctionType int32 + +const ( + FunctionType_Unknown FunctionType = 0 + FunctionType_BM25 FunctionType = 1 + FunctionType_TextEmbedding FunctionType = 2 +) + +// Enum value maps for FunctionType. +var ( + FunctionType_name = map[int32]string{ + 0: "Unknown", + 1: "BM25", + 2: "TextEmbedding", + } + FunctionType_value = map[string]int32{ + "Unknown": 0, + "BM25": 1, + "TextEmbedding": 2, + } +) + +func (x FunctionType) Enum() *FunctionType { + p := new(FunctionType) + *p = x + return p +} + +func (x FunctionType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FunctionType) Descriptor() protoreflect.EnumDescriptor { + return file_backup_proto_enumTypes[4].Descriptor() +} + +func (FunctionType) Type() protoreflect.EnumType { + return &file_backup_proto_enumTypes[4] +} + +func (x FunctionType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use FunctionType.Descriptor instead. +func (FunctionType) EnumDescriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{4} } // * @@ -178,7 +312,7 @@ const ( DataType_Float DataType = 10 DataType_Double DataType = 11 DataType_String DataType = 20 - DataType_VarChar DataType = 21 + DataType_VarChar DataType = 21 // variable-length strings with a specified maximum length DataType_Array DataType = 22 DataType_Json DataType = 23 DataType_BinaryVector DataType = 100 @@ -188,52 +322,73 @@ const ( DataType_SparseFloatVector DataType = 104 ) -var DataType_name = map[int32]string{ - 0: "None", - 1: "Bool", - 2: "Int8", - 3: "Int16", - 4: "Int32", - 5: "Int64", - 10: "Float", - 11: "Double", - 20: "String", - 21: "VarChar", - 22: "Array", - 23: "Json", - 100: "BinaryVector", - 101: "FloatVector", - 102: "Float16Vector", - 103: "BFloat16Vector", - 104: "SparseFloatVector", -} - -var DataType_value = map[string]int32{ - "None": 0, - "Bool": 1, - "Int8": 2, - "Int16": 3, - "Int32": 4, - "Int64": 5, - "Float": 10, - "Double": 11, - "String": 20, - "VarChar": 21, - "Array": 22, - "Json": 23, - "BinaryVector": 100, - "FloatVector": 101, - "Float16Vector": 102, - "BFloat16Vector": 103, - "SparseFloatVector": 104, +// Enum value maps for DataType. +var ( + DataType_name = map[int32]string{ + 0: "None", + 1: "Bool", + 2: "Int8", + 3: "Int16", + 4: "Int32", + 5: "Int64", + 10: "Float", + 11: "Double", + 20: "String", + 21: "VarChar", + 22: "Array", + 23: "Json", + 100: "BinaryVector", + 101: "FloatVector", + 102: "Float16Vector", + 103: "BFloat16Vector", + 104: "SparseFloatVector", + } + DataType_value = map[string]int32{ + "None": 0, + "Bool": 1, + "Int8": 2, + "Int16": 3, + "Int32": 4, + "Int64": 5, + "Float": 10, + "Double": 11, + "String": 20, + "VarChar": 21, + "Array": 22, + "Json": 23, + "BinaryVector": 100, + "FloatVector": 101, + "Float16Vector": 102, + "BFloat16Vector": 103, + "SparseFloatVector": 104, + } +) + +func (x DataType) Enum() *DataType { + p := new(DataType) + *p = x + return p } func (x DataType) String() string { - return proto.EnumName(DataType_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DataType) Descriptor() protoreflect.EnumDescriptor { + return file_backup_proto_enumTypes[5].Descriptor() +} + +func (DataType) Type() protoreflect.EnumType { + return &file_backup_proto_enumTypes[5] +} + +func (x DataType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use DataType.Descriptor instead. func (DataType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{4} + return file_backup_proto_rawDescGZIP(), []int{5} } type FieldState int32 @@ -245,87 +400,116 @@ const ( FieldState_FieldDropped FieldState = 3 ) -var FieldState_name = map[int32]string{ - 0: "FieldCreated", - 1: "FieldCreating", - 2: "FieldDropping", - 3: "FieldDropped", -} +// Enum value maps for FieldState. +var ( + FieldState_name = map[int32]string{ + 0: "FieldCreated", + 1: "FieldCreating", + 2: "FieldDropping", + 3: "FieldDropped", + } + FieldState_value = map[string]int32{ + "FieldCreated": 0, + "FieldCreating": 1, + "FieldDropping": 2, + "FieldDropped": 3, + } +) -var FieldState_value = map[string]int32{ - "FieldCreated": 0, - "FieldCreating": 1, - "FieldDropping": 2, - "FieldDropped": 3, +func (x FieldState) Enum() *FieldState { + p := new(FieldState) + *p = x + return p } func (x FieldState) String() string { - return proto.EnumName(FieldState_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (FieldState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{5} +func (FieldState) Descriptor() protoreflect.EnumDescriptor { + return file_backup_proto_enumTypes[6].Descriptor() } -type IndexInfo struct { - FieldName string `protobuf:"bytes,1,opt,name=field_name,json=fieldName,proto3" json:"field_name,omitempty"` - IndexName string `protobuf:"bytes,2,opt,name=index_name,json=indexName,proto3" json:"index_name,omitempty"` - IndexType string `protobuf:"bytes,3,opt,name=index_type,json=indexType,proto3" json:"index_type,omitempty"` - Params map[string]string `protobuf:"bytes,4,rep,name=params,proto3" json:"params,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *IndexInfo) Reset() { *m = IndexInfo{} } -func (m *IndexInfo) String() string { return proto.CompactTextString(m) } -func (*IndexInfo) ProtoMessage() {} -func (*IndexInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{0} +func (FieldState) Type() protoreflect.EnumType { + return &file_backup_proto_enumTypes[6] +} + +func (x FieldState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } -func (m *IndexInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IndexInfo.Unmarshal(m, b) +// Deprecated: Use FieldState.Descriptor instead. +func (FieldState) EnumDescriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{6} } -func (m *IndexInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IndexInfo.Marshal(b, m, deterministic) + +type IndexInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FieldName string `protobuf:"bytes,1,opt,name=field_name,json=fieldName,proto3" json:"field_name,omitempty"` + IndexName string `protobuf:"bytes,2,opt,name=index_name,json=indexName,proto3" json:"index_name,omitempty"` + IndexType string `protobuf:"bytes,3,opt,name=index_type,json=indexType,proto3" json:"index_type,omitempty"` + Params map[string]string `protobuf:"bytes,4,rep,name=params,proto3" json:"params,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *IndexInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_IndexInfo.Merge(m, src) + +func (x *IndexInfo) Reset() { + *x = IndexInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *IndexInfo) XXX_Size() int { - return xxx_messageInfo_IndexInfo.Size(m) + +func (x *IndexInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *IndexInfo) XXX_DiscardUnknown() { - xxx_messageInfo_IndexInfo.DiscardUnknown(m) + +func (*IndexInfo) ProtoMessage() {} + +func (x *IndexInfo) ProtoReflect() protoreflect.Message { + mi := &file_backup_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) } -var xxx_messageInfo_IndexInfo proto.InternalMessageInfo +// Deprecated: Use IndexInfo.ProtoReflect.Descriptor instead. +func (*IndexInfo) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{0} +} -func (m *IndexInfo) GetFieldName() string { - if m != nil { - return m.FieldName +func (x *IndexInfo) GetFieldName() string { + if x != nil { + return x.FieldName } return "" } -func (m *IndexInfo) GetIndexName() string { - if m != nil { - return m.IndexName +func (x *IndexInfo) GetIndexName() string { + if x != nil { + return x.IndexName } return "" } -func (m *IndexInfo) GetIndexType() string { - if m != nil { - return m.IndexType +func (x *IndexInfo) GetIndexType() string { + if x != nil { + return x.IndexType } return "" } -func (m *IndexInfo) GetParams() map[string]string { - if m != nil { - return m.Params +func (x *IndexInfo) GetParams() map[string]string { + if x != nil { + return x.Params } return nil } @@ -333,6 +517,10 @@ func (m *IndexInfo) GetParams() map[string]string { // * // lite version of Collection info type CollectionBackupInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` StateCode BackupTaskStateCode `protobuf:"varint,2,opt,name=state_code,json=stateCode,proto3,enum=milvus.proto.backup.BackupTaskStateCode" json:"state_code"` ErrorMessage string `protobuf:"bytes,3,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` @@ -356,259 +544,271 @@ type CollectionBackupInfo struct { BackupPhysicalTimestamp uint64 `protobuf:"varint,19,opt,name=backup_physical_timestamp,json=backupPhysicalTimestamp,proto3" json:"backup_physical_timestamp,omitempty"` ChannelCheckpoints map[string]string `protobuf:"bytes,20,rep,name=channel_checkpoints,json=channelCheckpoints,proto3" json:"channel_checkpoints,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` L0Segments []*SegmentBackupInfo `protobuf:"bytes,21,rep,name=l0_segments,json=l0Segments,proto3" json:"l0_segments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` } -func (m *CollectionBackupInfo) Reset() { *m = CollectionBackupInfo{} } -func (m *CollectionBackupInfo) String() string { return proto.CompactTextString(m) } -func (*CollectionBackupInfo) ProtoMessage() {} -func (*CollectionBackupInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{1} +func (x *CollectionBackupInfo) Reset() { + *x = CollectionBackupInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CollectionBackupInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CollectionBackupInfo.Unmarshal(m, b) -} -func (m *CollectionBackupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CollectionBackupInfo.Marshal(b, m, deterministic) +func (x *CollectionBackupInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CollectionBackupInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_CollectionBackupInfo.Merge(m, src) -} -func (m *CollectionBackupInfo) XXX_Size() int { - return xxx_messageInfo_CollectionBackupInfo.Size(m) -} -func (m *CollectionBackupInfo) XXX_DiscardUnknown() { - xxx_messageInfo_CollectionBackupInfo.DiscardUnknown(m) + +func (*CollectionBackupInfo) ProtoMessage() {} + +func (x *CollectionBackupInfo) ProtoReflect() protoreflect.Message { + mi := &file_backup_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) } -var xxx_messageInfo_CollectionBackupInfo proto.InternalMessageInfo +// Deprecated: Use CollectionBackupInfo.ProtoReflect.Descriptor instead. +func (*CollectionBackupInfo) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{1} +} -func (m *CollectionBackupInfo) GetId() string { - if m != nil { - return m.Id +func (x *CollectionBackupInfo) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *CollectionBackupInfo) GetStateCode() BackupTaskStateCode { - if m != nil { - return m.StateCode +func (x *CollectionBackupInfo) GetStateCode() BackupTaskStateCode { + if x != nil { + return x.StateCode } return BackupTaskStateCode_BACKUP_INITIAL } -func (m *CollectionBackupInfo) GetErrorMessage() string { - if m != nil { - return m.ErrorMessage +func (x *CollectionBackupInfo) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage } return "" } -func (m *CollectionBackupInfo) GetStartTime() int64 { - if m != nil { - return m.StartTime +func (x *CollectionBackupInfo) GetStartTime() int64 { + if x != nil { + return x.StartTime } return 0 } -func (m *CollectionBackupInfo) GetEndTime() int64 { - if m != nil { - return m.EndTime +func (x *CollectionBackupInfo) GetEndTime() int64 { + if x != nil { + return x.EndTime } return 0 } -func (m *CollectionBackupInfo) GetProgress() int32 { - if m != nil { - return m.Progress +func (x *CollectionBackupInfo) GetProgress() int32 { + if x != nil { + return x.Progress } return 0 } -func (m *CollectionBackupInfo) GetCollectionId() int64 { - if m != nil { - return m.CollectionId +func (x *CollectionBackupInfo) GetCollectionId() int64 { + if x != nil { + return x.CollectionId } return 0 } -func (m *CollectionBackupInfo) GetDbName() string { - if m != nil { - return m.DbName +func (x *CollectionBackupInfo) GetDbName() string { + if x != nil { + return x.DbName } return "" } -func (m *CollectionBackupInfo) GetCollectionName() string { - if m != nil { - return m.CollectionName +func (x *CollectionBackupInfo) GetCollectionName() string { + if x != nil { + return x.CollectionName } return "" } -func (m *CollectionBackupInfo) GetSchema() *CollectionSchema { - if m != nil { - return m.Schema +func (x *CollectionBackupInfo) GetSchema() *CollectionSchema { + if x != nil { + return x.Schema } return nil } -func (m *CollectionBackupInfo) GetShardsNum() int32 { - if m != nil { - return m.ShardsNum +func (x *CollectionBackupInfo) GetShardsNum() int32 { + if x != nil { + return x.ShardsNum } return 0 } -func (m *CollectionBackupInfo) GetConsistencyLevel() ConsistencyLevel { - if m != nil { - return m.ConsistencyLevel +func (x *CollectionBackupInfo) GetConsistencyLevel() ConsistencyLevel { + if x != nil { + return x.ConsistencyLevel } return ConsistencyLevel_Strong } -func (m *CollectionBackupInfo) GetPartitionBackups() []*PartitionBackupInfo { - if m != nil { - return m.PartitionBackups +func (x *CollectionBackupInfo) GetPartitionBackups() []*PartitionBackupInfo { + if x != nil { + return x.PartitionBackups } return nil } -func (m *CollectionBackupInfo) GetBackupTimestamp() uint64 { - if m != nil { - return m.BackupTimestamp +func (x *CollectionBackupInfo) GetBackupTimestamp() uint64 { + if x != nil { + return x.BackupTimestamp } return 0 } -func (m *CollectionBackupInfo) GetSize() int64 { - if m != nil { - return m.Size +func (x *CollectionBackupInfo) GetSize() int64 { + if x != nil { + return x.Size } return 0 } -func (m *CollectionBackupInfo) GetHasIndex() bool { - if m != nil { - return m.HasIndex +func (x *CollectionBackupInfo) GetHasIndex() bool { + if x != nil { + return x.HasIndex } return false } -func (m *CollectionBackupInfo) GetIndexInfos() []*IndexInfo { - if m != nil { - return m.IndexInfos +func (x *CollectionBackupInfo) GetIndexInfos() []*IndexInfo { + if x != nil { + return x.IndexInfos } return nil } -func (m *CollectionBackupInfo) GetLoadState() string { - if m != nil { - return m.LoadState +func (x *CollectionBackupInfo) GetLoadState() string { + if x != nil { + return x.LoadState } return "" } -func (m *CollectionBackupInfo) GetBackupPhysicalTimestamp() uint64 { - if m != nil { - return m.BackupPhysicalTimestamp +func (x *CollectionBackupInfo) GetBackupPhysicalTimestamp() uint64 { + if x != nil { + return x.BackupPhysicalTimestamp } return 0 } -func (m *CollectionBackupInfo) GetChannelCheckpoints() map[string]string { - if m != nil { - return m.ChannelCheckpoints +func (x *CollectionBackupInfo) GetChannelCheckpoints() map[string]string { + if x != nil { + return x.ChannelCheckpoints } return nil } -func (m *CollectionBackupInfo) GetL0Segments() []*SegmentBackupInfo { - if m != nil { - return m.L0Segments +func (x *CollectionBackupInfo) GetL0Segments() []*SegmentBackupInfo { + if x != nil { + return x.L0Segments } return nil } type PartitionBackupInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + PartitionId int64 `protobuf:"varint,1,opt,name=partition_id,json=partitionId,proto3" json:"partition_id,omitempty"` PartitionName string `protobuf:"bytes,2,opt,name=partition_name,json=partitionName,proto3" json:"partition_name,omitempty"` CollectionId int64 `protobuf:"varint,3,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"` // array of segment backup - SegmentBackups []*SegmentBackupInfo `protobuf:"bytes,4,rep,name=segment_backups,json=segmentBackups,proto3" json:"segment_backups,omitempty"` - Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size"` - LoadState string `protobuf:"bytes,6,opt,name=load_state,json=loadState,proto3" json:"load_state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + SegmentBackups []*SegmentBackupInfo `protobuf:"bytes,4,rep,name=segment_backups,json=segmentBackups,proto3" json:"segment_backups,omitempty"` + Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size"` + LoadState string `protobuf:"bytes,6,opt,name=load_state,json=loadState,proto3" json:"load_state,omitempty"` } -func (m *PartitionBackupInfo) Reset() { *m = PartitionBackupInfo{} } -func (m *PartitionBackupInfo) String() string { return proto.CompactTextString(m) } -func (*PartitionBackupInfo) ProtoMessage() {} -func (*PartitionBackupInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{2} +func (x *PartitionBackupInfo) Reset() { + *x = PartitionBackupInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *PartitionBackupInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PartitionBackupInfo.Unmarshal(m, b) -} -func (m *PartitionBackupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PartitionBackupInfo.Marshal(b, m, deterministic) +func (x *PartitionBackupInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *PartitionBackupInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_PartitionBackupInfo.Merge(m, src) -} -func (m *PartitionBackupInfo) XXX_Size() int { - return xxx_messageInfo_PartitionBackupInfo.Size(m) -} -func (m *PartitionBackupInfo) XXX_DiscardUnknown() { - xxx_messageInfo_PartitionBackupInfo.DiscardUnknown(m) + +func (*PartitionBackupInfo) ProtoMessage() {} + +func (x *PartitionBackupInfo) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[2] + 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) } -var xxx_messageInfo_PartitionBackupInfo proto.InternalMessageInfo +// Deprecated: Use PartitionBackupInfo.ProtoReflect.Descriptor instead. +func (*PartitionBackupInfo) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{2} +} -func (m *PartitionBackupInfo) GetPartitionId() int64 { - if m != nil { - return m.PartitionId +func (x *PartitionBackupInfo) GetPartitionId() int64 { + if x != nil { + return x.PartitionId } return 0 } -func (m *PartitionBackupInfo) GetPartitionName() string { - if m != nil { - return m.PartitionName +func (x *PartitionBackupInfo) GetPartitionName() string { + if x != nil { + return x.PartitionName } return "" } -func (m *PartitionBackupInfo) GetCollectionId() int64 { - if m != nil { - return m.CollectionId +func (x *PartitionBackupInfo) GetCollectionId() int64 { + if x != nil { + return x.CollectionId } return 0 } -func (m *PartitionBackupInfo) GetSegmentBackups() []*SegmentBackupInfo { - if m != nil { - return m.SegmentBackups +func (x *PartitionBackupInfo) GetSegmentBackups() []*SegmentBackupInfo { + if x != nil { + return x.SegmentBackups } return nil } -func (m *PartitionBackupInfo) GetSize() int64 { - if m != nil { - return m.Size +func (x *PartitionBackupInfo) GetSize() int64 { + if x != nil { + return x.Size } return 0 } -func (m *PartitionBackupInfo) GetLoadState() string { - if m != nil { - return m.LoadState +func (x *PartitionBackupInfo) GetLoadState() string { + if x != nil { + return x.LoadState } return "" } @@ -616,6 +816,10 @@ func (m *PartitionBackupInfo) GetLoadState() string { // * // lite version of datapb.SegmentInfo type SegmentBackupInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + SegmentId int64 `protobuf:"varint,1,opt,name=segment_id,json=segmentId,proto3" json:"segment_id,omitempty"` CollectionId int64 `protobuf:"varint,2,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"` PartitionId int64 `protobuf:"varint,3,opt,name=partition_id,json=partitionId,proto3" json:"partition_id,omitempty"` @@ -627,112 +831,116 @@ type SegmentBackupInfo struct { // separate segments into multi groups by size, // segments in one group will be copied into one directory during backup // and will bulkinsert in one call during restore - GroupId int64 `protobuf:"varint,9,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - Backuped bool `protobuf:"varint,10,opt,name=backuped,proto3" json:"backuped,omitempty"` - IsL0 bool `protobuf:"varint,11,opt,name=is_l0,json=isL0,proto3" json:"is_l0,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + GroupId int64 `protobuf:"varint,9,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + Backuped bool `protobuf:"varint,10,opt,name=backuped,proto3" json:"backuped,omitempty"` + IsL0 bool `protobuf:"varint,11,opt,name=is_l0,json=isL0,proto3" json:"is_l0,omitempty"` } -func (m *SegmentBackupInfo) Reset() { *m = SegmentBackupInfo{} } -func (m *SegmentBackupInfo) String() string { return proto.CompactTextString(m) } -func (*SegmentBackupInfo) ProtoMessage() {} -func (*SegmentBackupInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{3} +func (x *SegmentBackupInfo) Reset() { + *x = SegmentBackupInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *SegmentBackupInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SegmentBackupInfo.Unmarshal(m, b) +func (x *SegmentBackupInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SegmentBackupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SegmentBackupInfo.Marshal(b, m, deterministic) -} -func (m *SegmentBackupInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_SegmentBackupInfo.Merge(m, src) -} -func (m *SegmentBackupInfo) XXX_Size() int { - return xxx_messageInfo_SegmentBackupInfo.Size(m) -} -func (m *SegmentBackupInfo) XXX_DiscardUnknown() { - xxx_messageInfo_SegmentBackupInfo.DiscardUnknown(m) + +func (*SegmentBackupInfo) ProtoMessage() {} + +func (x *SegmentBackupInfo) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[3] + 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) } -var xxx_messageInfo_SegmentBackupInfo proto.InternalMessageInfo +// Deprecated: Use SegmentBackupInfo.ProtoReflect.Descriptor instead. +func (*SegmentBackupInfo) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{3} +} -func (m *SegmentBackupInfo) GetSegmentId() int64 { - if m != nil { - return m.SegmentId +func (x *SegmentBackupInfo) GetSegmentId() int64 { + if x != nil { + return x.SegmentId } return 0 } -func (m *SegmentBackupInfo) GetCollectionId() int64 { - if m != nil { - return m.CollectionId +func (x *SegmentBackupInfo) GetCollectionId() int64 { + if x != nil { + return x.CollectionId } return 0 } -func (m *SegmentBackupInfo) GetPartitionId() int64 { - if m != nil { - return m.PartitionId +func (x *SegmentBackupInfo) GetPartitionId() int64 { + if x != nil { + return x.PartitionId } return 0 } -func (m *SegmentBackupInfo) GetNumOfRows() int64 { - if m != nil { - return m.NumOfRows +func (x *SegmentBackupInfo) GetNumOfRows() int64 { + if x != nil { + return x.NumOfRows } return 0 } -func (m *SegmentBackupInfo) GetBinlogs() []*FieldBinlog { - if m != nil { - return m.Binlogs +func (x *SegmentBackupInfo) GetBinlogs() []*FieldBinlog { + if x != nil { + return x.Binlogs } return nil } -func (m *SegmentBackupInfo) GetStatslogs() []*FieldBinlog { - if m != nil { - return m.Statslogs +func (x *SegmentBackupInfo) GetStatslogs() []*FieldBinlog { + if x != nil { + return x.Statslogs } return nil } -func (m *SegmentBackupInfo) GetDeltalogs() []*FieldBinlog { - if m != nil { - return m.Deltalogs +func (x *SegmentBackupInfo) GetDeltalogs() []*FieldBinlog { + if x != nil { + return x.Deltalogs } return nil } -func (m *SegmentBackupInfo) GetSize() int64 { - if m != nil { - return m.Size +func (x *SegmentBackupInfo) GetSize() int64 { + if x != nil { + return x.Size } return 0 } -func (m *SegmentBackupInfo) GetGroupId() int64 { - if m != nil { - return m.GroupId +func (x *SegmentBackupInfo) GetGroupId() int64 { + if x != nil { + return x.GroupId } return 0 } -func (m *SegmentBackupInfo) GetBackuped() bool { - if m != nil { - return m.Backuped +func (x *SegmentBackupInfo) GetBackuped() bool { + if x != nil { + return x.Backuped } return false } -func (m *SegmentBackupInfo) GetIsL0() bool { - if m != nil { - return m.IsL0 +func (x *SegmentBackupInfo) GetIsL0() bool { + if x != nil { + return x.IsL0 } return false } @@ -740,6 +948,10 @@ func (m *SegmentBackupInfo) GetIsL0() bool { // * // root of backup type BackupInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` StateCode BackupTaskStateCode `protobuf:"varint,2,opt,name=state_code,json=stateCode,proto3,enum=milvus.proto.backup.BackupTaskStateCode" json:"state_code"` ErrorMessage string `protobuf:"bytes,3,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` @@ -750,120 +962,124 @@ type BackupInfo struct { // backup timestamp BackupTimestamp uint64 `protobuf:"varint,8,opt,name=backup_timestamp,json=backupTimestamp,proto3" json:"backup_timestamp,omitempty"` // array of collection backup - CollectionBackups []*CollectionBackupInfo `protobuf:"bytes,9,rep,name=collection_backups,json=collectionBackups,proto3" json:"collection_backups,omitempty"` - Size int64 `protobuf:"varint,10,opt,name=size,proto3" json:"size"` - MilvusVersion string `protobuf:"bytes,11,opt,name=milvus_version,json=milvusVersion,proto3" json:"milvus_version,omitempty"` - RbacMeta *RBACMeta `protobuf:"bytes,12,opt,name=rbac_meta,json=rbacMeta,proto3" json:"rbac_meta,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BackupInfo) Reset() { *m = BackupInfo{} } -func (m *BackupInfo) String() string { return proto.CompactTextString(m) } -func (*BackupInfo) ProtoMessage() {} -func (*BackupInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{4} + CollectionBackups []*CollectionBackupInfo `protobuf:"bytes,9,rep,name=collection_backups,json=collectionBackups,proto3" json:"collection_backups,omitempty"` + Size int64 `protobuf:"varint,10,opt,name=size,proto3" json:"size"` + MilvusVersion string `protobuf:"bytes,11,opt,name=milvus_version,json=milvusVersion,proto3" json:"milvus_version,omitempty"` + RbacMeta *RBACMeta `protobuf:"bytes,12,opt,name=rbac_meta,json=rbacMeta,proto3" json:"rbac_meta,omitempty"` } -func (m *BackupInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BackupInfo.Unmarshal(m, b) -} -func (m *BackupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BackupInfo.Marshal(b, m, deterministic) -} -func (m *BackupInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_BackupInfo.Merge(m, src) +func (x *BackupInfo) Reset() { + *x = BackupInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *BackupInfo) XXX_Size() int { - return xxx_messageInfo_BackupInfo.Size(m) + +func (x *BackupInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *BackupInfo) XXX_DiscardUnknown() { - xxx_messageInfo_BackupInfo.DiscardUnknown(m) + +func (*BackupInfo) ProtoMessage() {} + +func (x *BackupInfo) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[4] + 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) } -var xxx_messageInfo_BackupInfo proto.InternalMessageInfo +// Deprecated: Use BackupInfo.ProtoReflect.Descriptor instead. +func (*BackupInfo) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{4} +} -func (m *BackupInfo) GetId() string { - if m != nil { - return m.Id +func (x *BackupInfo) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *BackupInfo) GetStateCode() BackupTaskStateCode { - if m != nil { - return m.StateCode +func (x *BackupInfo) GetStateCode() BackupTaskStateCode { + if x != nil { + return x.StateCode } return BackupTaskStateCode_BACKUP_INITIAL } -func (m *BackupInfo) GetErrorMessage() string { - if m != nil { - return m.ErrorMessage +func (x *BackupInfo) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage } return "" } -func (m *BackupInfo) GetStartTime() int64 { - if m != nil { - return m.StartTime +func (x *BackupInfo) GetStartTime() int64 { + if x != nil { + return x.StartTime } return 0 } -func (m *BackupInfo) GetEndTime() int64 { - if m != nil { - return m.EndTime +func (x *BackupInfo) GetEndTime() int64 { + if x != nil { + return x.EndTime } return 0 } -func (m *BackupInfo) GetProgress() int32 { - if m != nil { - return m.Progress +func (x *BackupInfo) GetProgress() int32 { + if x != nil { + return x.Progress } return 0 } -func (m *BackupInfo) GetName() string { - if m != nil { - return m.Name +func (x *BackupInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *BackupInfo) GetBackupTimestamp() uint64 { - if m != nil { - return m.BackupTimestamp +func (x *BackupInfo) GetBackupTimestamp() uint64 { + if x != nil { + return x.BackupTimestamp } return 0 } -func (m *BackupInfo) GetCollectionBackups() []*CollectionBackupInfo { - if m != nil { - return m.CollectionBackups +func (x *BackupInfo) GetCollectionBackups() []*CollectionBackupInfo { + if x != nil { + return x.CollectionBackups } return nil } -func (m *BackupInfo) GetSize() int64 { - if m != nil { - return m.Size +func (x *BackupInfo) GetSize() int64 { + if x != nil { + return x.Size } return 0 } -func (m *BackupInfo) GetMilvusVersion() string { - if m != nil { - return m.MilvusVersion +func (x *BackupInfo) GetMilvusVersion() string { + if x != nil { + return x.MilvusVersion } return "" } -func (m *BackupInfo) GetRbacMeta() *RBACMeta { - if m != nil { - return m.RbacMeta +func (x *BackupInfo) GetRbacMeta() *RBACMeta { + if x != nil { + return x.RbacMeta } return nil } @@ -871,40 +1087,48 @@ func (m *BackupInfo) GetRbacMeta() *RBACMeta { // * // For level storage type CollectionLevelBackupInfo struct { - Infos []*CollectionBackupInfo `protobuf:"bytes,1,rep,name=infos,proto3" json:"infos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *CollectionLevelBackupInfo) Reset() { *m = CollectionLevelBackupInfo{} } -func (m *CollectionLevelBackupInfo) String() string { return proto.CompactTextString(m) } -func (*CollectionLevelBackupInfo) ProtoMessage() {} -func (*CollectionLevelBackupInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{5} + Infos []*CollectionBackupInfo `protobuf:"bytes,1,rep,name=infos,proto3" json:"infos,omitempty"` } -func (m *CollectionLevelBackupInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CollectionLevelBackupInfo.Unmarshal(m, b) -} -func (m *CollectionLevelBackupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CollectionLevelBackupInfo.Marshal(b, m, deterministic) -} -func (m *CollectionLevelBackupInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_CollectionLevelBackupInfo.Merge(m, src) +func (x *CollectionLevelBackupInfo) Reset() { + *x = CollectionLevelBackupInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CollectionLevelBackupInfo) XXX_Size() int { - return xxx_messageInfo_CollectionLevelBackupInfo.Size(m) + +func (x *CollectionLevelBackupInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CollectionLevelBackupInfo) XXX_DiscardUnknown() { - xxx_messageInfo_CollectionLevelBackupInfo.DiscardUnknown(m) + +func (*CollectionLevelBackupInfo) ProtoMessage() {} + +func (x *CollectionLevelBackupInfo) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[5] + 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) } -var xxx_messageInfo_CollectionLevelBackupInfo proto.InternalMessageInfo +// Deprecated: Use CollectionLevelBackupInfo.ProtoReflect.Descriptor instead. +func (*CollectionLevelBackupInfo) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{5} +} -func (m *CollectionLevelBackupInfo) GetInfos() []*CollectionBackupInfo { - if m != nil { - return m.Infos +func (x *CollectionLevelBackupInfo) GetInfos() []*CollectionBackupInfo { + if x != nil { + return x.Infos } return nil } @@ -912,40 +1136,48 @@ func (m *CollectionLevelBackupInfo) GetInfos() []*CollectionBackupInfo { // * // For level storage type PartitionLevelBackupInfo struct { - Infos []*PartitionBackupInfo `protobuf:"bytes,1,rep,name=infos,proto3" json:"infos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *PartitionLevelBackupInfo) Reset() { *m = PartitionLevelBackupInfo{} } -func (m *PartitionLevelBackupInfo) String() string { return proto.CompactTextString(m) } -func (*PartitionLevelBackupInfo) ProtoMessage() {} -func (*PartitionLevelBackupInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{6} + Infos []*PartitionBackupInfo `protobuf:"bytes,1,rep,name=infos,proto3" json:"infos,omitempty"` } -func (m *PartitionLevelBackupInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PartitionLevelBackupInfo.Unmarshal(m, b) -} -func (m *PartitionLevelBackupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PartitionLevelBackupInfo.Marshal(b, m, deterministic) -} -func (m *PartitionLevelBackupInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_PartitionLevelBackupInfo.Merge(m, src) +func (x *PartitionLevelBackupInfo) Reset() { + *x = PartitionLevelBackupInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *PartitionLevelBackupInfo) XXX_Size() int { - return xxx_messageInfo_PartitionLevelBackupInfo.Size(m) + +func (x *PartitionLevelBackupInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *PartitionLevelBackupInfo) XXX_DiscardUnknown() { - xxx_messageInfo_PartitionLevelBackupInfo.DiscardUnknown(m) + +func (*PartitionLevelBackupInfo) ProtoMessage() {} + +func (x *PartitionLevelBackupInfo) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[6] + 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) } -var xxx_messageInfo_PartitionLevelBackupInfo proto.InternalMessageInfo +// Deprecated: Use PartitionLevelBackupInfo.ProtoReflect.Descriptor instead. +func (*PartitionLevelBackupInfo) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{6} +} -func (m *PartitionLevelBackupInfo) GetInfos() []*PartitionBackupInfo { - if m != nil { - return m.Infos +func (x *PartitionLevelBackupInfo) GetInfos() []*PartitionBackupInfo { + if x != nil { + return x.Infos } return nil } @@ -953,40 +1185,48 @@ func (m *PartitionLevelBackupInfo) GetInfos() []*PartitionBackupInfo { // * // For level storage type SegmentLevelBackupInfo struct { - Infos []*SegmentBackupInfo `protobuf:"bytes,1,rep,name=infos,proto3" json:"infos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *SegmentLevelBackupInfo) Reset() { *m = SegmentLevelBackupInfo{} } -func (m *SegmentLevelBackupInfo) String() string { return proto.CompactTextString(m) } -func (*SegmentLevelBackupInfo) ProtoMessage() {} -func (*SegmentLevelBackupInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{7} + Infos []*SegmentBackupInfo `protobuf:"bytes,1,rep,name=infos,proto3" json:"infos,omitempty"` } -func (m *SegmentLevelBackupInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SegmentLevelBackupInfo.Unmarshal(m, b) -} -func (m *SegmentLevelBackupInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SegmentLevelBackupInfo.Marshal(b, m, deterministic) -} -func (m *SegmentLevelBackupInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_SegmentLevelBackupInfo.Merge(m, src) +func (x *SegmentLevelBackupInfo) Reset() { + *x = SegmentLevelBackupInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *SegmentLevelBackupInfo) XXX_Size() int { - return xxx_messageInfo_SegmentLevelBackupInfo.Size(m) + +func (x *SegmentLevelBackupInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SegmentLevelBackupInfo) XXX_DiscardUnknown() { - xxx_messageInfo_SegmentLevelBackupInfo.DiscardUnknown(m) + +func (*SegmentLevelBackupInfo) ProtoMessage() {} + +func (x *SegmentLevelBackupInfo) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[7] + 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) } -var xxx_messageInfo_SegmentLevelBackupInfo proto.InternalMessageInfo +// Deprecated: Use SegmentLevelBackupInfo.ProtoReflect.Descriptor instead. +func (*SegmentLevelBackupInfo) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{7} +} -func (m *SegmentLevelBackupInfo) GetInfos() []*SegmentBackupInfo { - if m != nil { - return m.Infos +func (x *SegmentLevelBackupInfo) GetInfos() []*SegmentBackupInfo { + if x != nil { + return x.Infos } return nil } @@ -994,6 +1234,10 @@ func (m *SegmentLevelBackupInfo) GetInfos() []*SegmentBackupInfo { // * // Create Backup in milvus type CreateBackupRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // uuid of request, will generate one if not set RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` // backup name, will generate one if not set @@ -1015,110 +1259,114 @@ type CreateBackupRequest struct { // gc pause API address GcPauseAddress string `protobuf:"bytes,10,opt,name=gc_pause_address,json=gcPauseAddress,proto3" json:"gc_pause_address,omitempty"` // whether backup RBAC - Rbac bool `protobuf:"varint,11,opt,name=rbac,proto3" json:"rbac,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Rbac bool `protobuf:"varint,11,opt,name=rbac,proto3" json:"rbac,omitempty"` } -func (m *CreateBackupRequest) Reset() { *m = CreateBackupRequest{} } -func (m *CreateBackupRequest) String() string { return proto.CompactTextString(m) } -func (*CreateBackupRequest) ProtoMessage() {} -func (*CreateBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{8} +func (x *CreateBackupRequest) Reset() { + *x = CreateBackupRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CreateBackupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateBackupRequest.Unmarshal(m, b) -} -func (m *CreateBackupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateBackupRequest.Marshal(b, m, deterministic) -} -func (m *CreateBackupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateBackupRequest.Merge(m, src) -} -func (m *CreateBackupRequest) XXX_Size() int { - return xxx_messageInfo_CreateBackupRequest.Size(m) +func (x *CreateBackupRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CreateBackupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateBackupRequest.DiscardUnknown(m) + +func (*CreateBackupRequest) ProtoMessage() {} + +func (x *CreateBackupRequest) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_CreateBackupRequest proto.InternalMessageInfo +// Deprecated: Use CreateBackupRequest.ProtoReflect.Descriptor instead. +func (*CreateBackupRequest) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{8} +} -func (m *CreateBackupRequest) GetRequestId() string { - if m != nil { - return m.RequestId +func (x *CreateBackupRequest) GetRequestId() string { + if x != nil { + return x.RequestId } return "" } -func (m *CreateBackupRequest) GetBackupName() string { - if m != nil { - return m.BackupName +func (x *CreateBackupRequest) GetBackupName() string { + if x != nil { + return x.BackupName } return "" } -func (m *CreateBackupRequest) GetCollectionNames() []string { - if m != nil { - return m.CollectionNames +func (x *CreateBackupRequest) GetCollectionNames() []string { + if x != nil { + return x.CollectionNames } return nil } -func (m *CreateBackupRequest) GetAsync() bool { - if m != nil { - return m.Async +func (x *CreateBackupRequest) GetAsync() bool { + if x != nil { + return x.Async } return false } -func (m *CreateBackupRequest) GetDbCollections() *_struct.Value { - if m != nil { - return m.DbCollections +func (x *CreateBackupRequest) GetDbCollections() *_struct.Value { + if x != nil { + return x.DbCollections } return nil } -func (m *CreateBackupRequest) GetForce() bool { - if m != nil { - return m.Force +func (x *CreateBackupRequest) GetForce() bool { + if x != nil { + return x.Force } return false } -func (m *CreateBackupRequest) GetMetaOnly() bool { - if m != nil { - return m.MetaOnly +func (x *CreateBackupRequest) GetMetaOnly() bool { + if x != nil { + return x.MetaOnly } return false } -func (m *CreateBackupRequest) GetGcPauseEnable() bool { - if m != nil { - return m.GcPauseEnable +func (x *CreateBackupRequest) GetGcPauseEnable() bool { + if x != nil { + return x.GcPauseEnable } return false } -func (m *CreateBackupRequest) GetGcPauseSeconds() int32 { - if m != nil { - return m.GcPauseSeconds +func (x *CreateBackupRequest) GetGcPauseSeconds() int32 { + if x != nil { + return x.GcPauseSeconds } return 0 } -func (m *CreateBackupRequest) GetGcPauseAddress() string { - if m != nil { - return m.GcPauseAddress +func (x *CreateBackupRequest) GetGcPauseAddress() string { + if x != nil { + return x.GcPauseAddress } return "" } -func (m *CreateBackupRequest) GetRbac() bool { - if m != nil { - return m.Rbac +func (x *CreateBackupRequest) GetRbac() bool { + if x != nil { + return x.Rbac } return false } @@ -1126,6 +1374,10 @@ func (m *CreateBackupRequest) GetRbac() bool { // * // BackupInfoResponse type BackupInfoResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // uuid of the request to response RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` // response code. 0 means success. others are fail @@ -1133,66 +1385,74 @@ type BackupInfoResponse struct { // error msg if fail Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"` // backup info entity - Data *BackupInfo `protobuf:"bytes,4,opt,name=data,proto3" json:"data"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Data *BackupInfo `protobuf:"bytes,4,opt,name=data,proto3" json:"data"` } -func (m *BackupInfoResponse) Reset() { *m = BackupInfoResponse{} } -func (m *BackupInfoResponse) String() string { return proto.CompactTextString(m) } -func (*BackupInfoResponse) ProtoMessage() {} -func (*BackupInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{9} +func (x *BackupInfoResponse) Reset() { + *x = BackupInfoResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *BackupInfoResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BackupInfoResponse.Unmarshal(m, b) -} -func (m *BackupInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BackupInfoResponse.Marshal(b, m, deterministic) -} -func (m *BackupInfoResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_BackupInfoResponse.Merge(m, src) -} -func (m *BackupInfoResponse) XXX_Size() int { - return xxx_messageInfo_BackupInfoResponse.Size(m) -} -func (m *BackupInfoResponse) XXX_DiscardUnknown() { - xxx_messageInfo_BackupInfoResponse.DiscardUnknown(m) +func (x *BackupInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_BackupInfoResponse proto.InternalMessageInfo +func (*BackupInfoResponse) ProtoMessage() {} -func (m *BackupInfoResponse) GetRequestId() string { - if m != nil { - return m.RequestId +func (x *BackupInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BackupInfoResponse.ProtoReflect.Descriptor instead. +func (*BackupInfoResponse) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{9} +} + +func (x *BackupInfoResponse) GetRequestId() string { + if x != nil { + return x.RequestId } return "" } -func (m *BackupInfoResponse) GetCode() ResponseCode { - if m != nil { - return m.Code +func (x *BackupInfoResponse) GetCode() ResponseCode { + if x != nil { + return x.Code } return ResponseCode_Success } -func (m *BackupInfoResponse) GetMsg() string { - if m != nil { - return m.Msg +func (x *BackupInfoResponse) GetMsg() string { + if x != nil { + return x.Msg } return "" } -func (m *BackupInfoResponse) GetData() *BackupInfo { - if m != nil { - return m.Data +func (x *BackupInfoResponse) GetData() *BackupInfo { + if x != nil { + return x.Data } return nil } type GetBackupRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // uuid of request, will generate one if not set RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` // backup name to query, backup_name or backup_id is needed @@ -1204,129 +1464,145 @@ type GetBackupRequest struct { // if bucket_name and path is set. will override bucket/path in config. Path string `protobuf:"bytes,5,opt,name=path,proto3" json:"path,omitempty"` // if true, return simple response without too much detail to display - WithoutDetail bool `protobuf:"varint,6,opt,name=without_detail,json=withoutDetail,proto3" json:"without_detail,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + WithoutDetail bool `protobuf:"varint,6,opt,name=without_detail,json=withoutDetail,proto3" json:"without_detail,omitempty"` } -func (m *GetBackupRequest) Reset() { *m = GetBackupRequest{} } -func (m *GetBackupRequest) String() string { return proto.CompactTextString(m) } -func (*GetBackupRequest) ProtoMessage() {} -func (*GetBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{10} +func (x *GetBackupRequest) Reset() { + *x = GetBackupRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetBackupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetBackupRequest.Unmarshal(m, b) -} -func (m *GetBackupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetBackupRequest.Marshal(b, m, deterministic) -} -func (m *GetBackupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetBackupRequest.Merge(m, src) -} -func (m *GetBackupRequest) XXX_Size() int { - return xxx_messageInfo_GetBackupRequest.Size(m) +func (x *GetBackupRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetBackupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetBackupRequest.DiscardUnknown(m) + +func (*GetBackupRequest) ProtoMessage() {} + +func (x *GetBackupRequest) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[10] + 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) } -var xxx_messageInfo_GetBackupRequest proto.InternalMessageInfo +// Deprecated: Use GetBackupRequest.ProtoReflect.Descriptor instead. +func (*GetBackupRequest) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{10} +} -func (m *GetBackupRequest) GetRequestId() string { - if m != nil { - return m.RequestId +func (x *GetBackupRequest) GetRequestId() string { + if x != nil { + return x.RequestId } return "" } -func (m *GetBackupRequest) GetBackupName() string { - if m != nil { - return m.BackupName +func (x *GetBackupRequest) GetBackupName() string { + if x != nil { + return x.BackupName } return "" } -func (m *GetBackupRequest) GetBackupId() string { - if m != nil { - return m.BackupId +func (x *GetBackupRequest) GetBackupId() string { + if x != nil { + return x.BackupId } return "" } -func (m *GetBackupRequest) GetBucketName() string { - if m != nil { - return m.BucketName +func (x *GetBackupRequest) GetBucketName() string { + if x != nil { + return x.BucketName } return "" } -func (m *GetBackupRequest) GetPath() string { - if m != nil { - return m.Path +func (x *GetBackupRequest) GetPath() string { + if x != nil { + return x.Path } return "" } -func (m *GetBackupRequest) GetWithoutDetail() bool { - if m != nil { - return m.WithoutDetail +func (x *GetBackupRequest) GetWithoutDetail() bool { + if x != nil { + return x.WithoutDetail } return false } type ListBackupsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // uuid of request, will generate one if not set RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` // if collection_name is set, will only return backups contains this collection - CollectionName string `protobuf:"bytes,2,opt,name=collection_name,json=collectionName,proto3" json:"collection_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + CollectionName string `protobuf:"bytes,2,opt,name=collection_name,json=collectionName,proto3" json:"collection_name,omitempty"` } -func (m *ListBackupsRequest) Reset() { *m = ListBackupsRequest{} } -func (m *ListBackupsRequest) String() string { return proto.CompactTextString(m) } -func (*ListBackupsRequest) ProtoMessage() {} -func (*ListBackupsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{11} +func (x *ListBackupsRequest) Reset() { + *x = ListBackupsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *ListBackupsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListBackupsRequest.Unmarshal(m, b) -} -func (m *ListBackupsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListBackupsRequest.Marshal(b, m, deterministic) -} -func (m *ListBackupsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListBackupsRequest.Merge(m, src) +func (x *ListBackupsRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ListBackupsRequest) XXX_Size() int { - return xxx_messageInfo_ListBackupsRequest.Size(m) -} -func (m *ListBackupsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListBackupsRequest.DiscardUnknown(m) + +func (*ListBackupsRequest) ProtoMessage() {} + +func (x *ListBackupsRequest) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[11] + 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) } -var xxx_messageInfo_ListBackupsRequest proto.InternalMessageInfo +// Deprecated: Use ListBackupsRequest.ProtoReflect.Descriptor instead. +func (*ListBackupsRequest) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{11} +} -func (m *ListBackupsRequest) GetRequestId() string { - if m != nil { - return m.RequestId +func (x *ListBackupsRequest) GetRequestId() string { + if x != nil { + return x.RequestId } return "" } -func (m *ListBackupsRequest) GetCollectionName() string { - if m != nil { - return m.CollectionName +func (x *ListBackupsRequest) GetCollectionName() string { + if x != nil { + return x.CollectionName } return "" } type ListBackupsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // uuid of the request to response RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` // response code. 0 means success. others are fail @@ -1334,173 +1610,268 @@ type ListBackupsResponse struct { // error msg if fail Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"` // backup info entities - Data []*BackupInfo `protobuf:"bytes,4,rep,name=data,proto3" json:"data"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Data []*BackupInfo `protobuf:"bytes,4,rep,name=data,proto3" json:"data"` } -func (m *ListBackupsResponse) Reset() { *m = ListBackupsResponse{} } -func (m *ListBackupsResponse) String() string { return proto.CompactTextString(m) } -func (*ListBackupsResponse) ProtoMessage() {} -func (*ListBackupsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{12} +func (x *ListBackupsResponse) Reset() { + *x = ListBackupsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *ListBackupsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListBackupsResponse.Unmarshal(m, b) -} -func (m *ListBackupsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListBackupsResponse.Marshal(b, m, deterministic) +func (x *ListBackupsResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ListBackupsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListBackupsResponse.Merge(m, src) -} -func (m *ListBackupsResponse) XXX_Size() int { - return xxx_messageInfo_ListBackupsResponse.Size(m) -} -func (m *ListBackupsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListBackupsResponse.DiscardUnknown(m) + +func (*ListBackupsResponse) ProtoMessage() {} + +func (x *ListBackupsResponse) ProtoReflect() protoreflect.Message { + mi := &file_backup_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) } -var xxx_messageInfo_ListBackupsResponse proto.InternalMessageInfo +// Deprecated: Use ListBackupsResponse.ProtoReflect.Descriptor instead. +func (*ListBackupsResponse) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{12} +} -func (m *ListBackupsResponse) GetRequestId() string { - if m != nil { - return m.RequestId +func (x *ListBackupsResponse) GetRequestId() string { + if x != nil { + return x.RequestId } return "" } -func (m *ListBackupsResponse) GetCode() ResponseCode { - if m != nil { - return m.Code +func (x *ListBackupsResponse) GetCode() ResponseCode { + if x != nil { + return x.Code } return ResponseCode_Success } -func (m *ListBackupsResponse) GetMsg() string { - if m != nil { - return m.Msg +func (x *ListBackupsResponse) GetMsg() string { + if x != nil { + return x.Msg } return "" } -func (m *ListBackupsResponse) GetData() []*BackupInfo { - if m != nil { - return m.Data +func (x *ListBackupsResponse) GetData() []*BackupInfo { + if x != nil { + return x.Data } return nil } type DeleteBackupRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // uuid of request, will generate one if not set RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` // backup name - BackupName string `protobuf:"bytes,2,opt,name=backup_name,json=backupName,proto3" json:"backup_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + BackupName string `protobuf:"bytes,2,opt,name=backup_name,json=backupName,proto3" json:"backup_name,omitempty"` } -func (m *DeleteBackupRequest) Reset() { *m = DeleteBackupRequest{} } -func (m *DeleteBackupRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteBackupRequest) ProtoMessage() {} -func (*DeleteBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{13} +func (x *DeleteBackupRequest) Reset() { + *x = DeleteBackupRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *DeleteBackupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteBackupRequest.Unmarshal(m, b) +func (x *DeleteBackupRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *DeleteBackupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteBackupRequest.Marshal(b, m, deterministic) -} -func (m *DeleteBackupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteBackupRequest.Merge(m, src) -} -func (m *DeleteBackupRequest) XXX_Size() int { - return xxx_messageInfo_DeleteBackupRequest.Size(m) -} -func (m *DeleteBackupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteBackupRequest.DiscardUnknown(m) + +func (*DeleteBackupRequest) ProtoMessage() {} + +func (x *DeleteBackupRequest) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[13] + 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) } -var xxx_messageInfo_DeleteBackupRequest proto.InternalMessageInfo +// Deprecated: Use DeleteBackupRequest.ProtoReflect.Descriptor instead. +func (*DeleteBackupRequest) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{13} +} -func (m *DeleteBackupRequest) GetRequestId() string { - if m != nil { - return m.RequestId +func (x *DeleteBackupRequest) GetRequestId() string { + if x != nil { + return x.RequestId } return "" } -func (m *DeleteBackupRequest) GetBackupName() string { - if m != nil { - return m.BackupName +func (x *DeleteBackupRequest) GetBackupName() string { + if x != nil { + return x.BackupName } return "" } type DeleteBackupResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // uuid of the request to response RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` // response code. 0 means success. others are fail Code ResponseCode `protobuf:"varint,2,opt,name=code,proto3,enum=milvus.proto.backup.ResponseCode" json:"code,omitempty"` // error msg if fail - Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"` +} + +func (x *DeleteBackupResponse) Reset() { + *x = DeleteBackupResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteBackupResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteBackupResponse) ProtoMessage() {} + +func (x *DeleteBackupResponse) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[14] + 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) } -func (m *DeleteBackupResponse) Reset() { *m = DeleteBackupResponse{} } -func (m *DeleteBackupResponse) String() string { return proto.CompactTextString(m) } -func (*DeleteBackupResponse) ProtoMessage() {} +// Deprecated: Use DeleteBackupResponse.ProtoReflect.Descriptor instead. func (*DeleteBackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{14} + return file_backup_proto_rawDescGZIP(), []int{14} +} + +func (x *DeleteBackupResponse) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" } -func (m *DeleteBackupResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteBackupResponse.Unmarshal(m, b) +func (x *DeleteBackupResponse) GetCode() ResponseCode { + if x != nil { + return x.Code + } + return ResponseCode_Success } -func (m *DeleteBackupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteBackupResponse.Marshal(b, m, deterministic) + +func (x *DeleteBackupResponse) GetMsg() string { + if x != nil { + return x.Msg + } + return "" } -func (m *DeleteBackupResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteBackupResponse.Merge(m, src) + +type SkipParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CollectionProperties []string `protobuf:"bytes,1,rep,name=collection_properties,json=collectionProperties,proto3" json:"collection_properties,omitempty"` + FiledIndexParams []string `protobuf:"bytes,2,rep,name=filed_index_params,json=filedIndexParams,proto3" json:"filed_index_params,omitempty"` + FiledTypeParams []string `protobuf:"bytes,3,rep,name=filed_type_params,json=filedTypeParams,proto3" json:"filed_type_params,omitempty"` + IndexParams []string `protobuf:"bytes,4,rep,name=index_params,json=indexParams,proto3" json:"index_params,omitempty"` } -func (m *DeleteBackupResponse) XXX_Size() int { - return xxx_messageInfo_DeleteBackupResponse.Size(m) + +func (x *SkipParams) Reset() { + *x = SkipParams{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *DeleteBackupResponse) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteBackupResponse.DiscardUnknown(m) + +func (x *SkipParams) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_DeleteBackupResponse proto.InternalMessageInfo +func (*SkipParams) ProtoMessage() {} -func (m *DeleteBackupResponse) GetRequestId() string { - if m != nil { - return m.RequestId +func (x *SkipParams) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *DeleteBackupResponse) GetCode() ResponseCode { - if m != nil { - return m.Code +// Deprecated: Use SkipParams.ProtoReflect.Descriptor instead. +func (*SkipParams) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{15} +} + +func (x *SkipParams) GetCollectionProperties() []string { + if x != nil { + return x.CollectionProperties } - return ResponseCode_Success + return nil } -func (m *DeleteBackupResponse) GetMsg() string { - if m != nil { - return m.Msg +func (x *SkipParams) GetFiledIndexParams() []string { + if x != nil { + return x.FiledIndexParams } - return "" + return nil +} + +func (x *SkipParams) GetFiledTypeParams() []string { + if x != nil { + return x.FiledTypeParams + } + return nil +} + +func (x *SkipParams) GetIndexParams() []string { + if x != nil { + return x.IndexParams + } + return nil } type RestoreBackupRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // uuid of request, will generate one if not set RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` // backup name to restore @@ -1539,258 +1910,283 @@ type RestoreBackupRequest struct { // whether restore RBAC Rbac bool `protobuf:"varint,18,opt,name=rbac,proto3" json:"rbac,omitempty"` // target max shard number - MaxShardNum int32 `protobuf:"varint,19,opt,name=maxShardNum,proto3" json:"maxShardNum,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + MaxShardNum int32 `protobuf:"varint,19,opt,name=maxShardNum,proto3" json:"maxShardNum,omitempty"` + // if key is set, will skip the params in restore process + SkipParams *SkipParams `protobuf:"bytes,20,opt,name=skip_params,json=skipParams,proto3" json:"skip_params,omitempty"` } -func (m *RestoreBackupRequest) Reset() { *m = RestoreBackupRequest{} } -func (m *RestoreBackupRequest) String() string { return proto.CompactTextString(m) } -func (*RestoreBackupRequest) ProtoMessage() {} -func (*RestoreBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{15} +func (x *RestoreBackupRequest) Reset() { + *x = RestoreBackupRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RestoreBackupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RestoreBackupRequest.Unmarshal(m, b) +func (x *RestoreBackupRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RestoreBackupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RestoreBackupRequest.Marshal(b, m, deterministic) -} -func (m *RestoreBackupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RestoreBackupRequest.Merge(m, src) -} -func (m *RestoreBackupRequest) XXX_Size() int { - return xxx_messageInfo_RestoreBackupRequest.Size(m) -} -func (m *RestoreBackupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RestoreBackupRequest.DiscardUnknown(m) + +func (*RestoreBackupRequest) ProtoMessage() {} + +func (x *RestoreBackupRequest) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[16] + 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) } -var xxx_messageInfo_RestoreBackupRequest proto.InternalMessageInfo +// Deprecated: Use RestoreBackupRequest.ProtoReflect.Descriptor instead. +func (*RestoreBackupRequest) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{16} +} -func (m *RestoreBackupRequest) GetRequestId() string { - if m != nil { - return m.RequestId +func (x *RestoreBackupRequest) GetRequestId() string { + if x != nil { + return x.RequestId } return "" } -func (m *RestoreBackupRequest) GetBackupName() string { - if m != nil { - return m.BackupName +func (x *RestoreBackupRequest) GetBackupName() string { + if x != nil { + return x.BackupName } return "" } -func (m *RestoreBackupRequest) GetCollectionNames() []string { - if m != nil { - return m.CollectionNames +func (x *RestoreBackupRequest) GetCollectionNames() []string { + if x != nil { + return x.CollectionNames } return nil } -func (m *RestoreBackupRequest) GetCollectionSuffix() string { - if m != nil { - return m.CollectionSuffix +func (x *RestoreBackupRequest) GetCollectionSuffix() string { + if x != nil { + return x.CollectionSuffix } return "" } -func (m *RestoreBackupRequest) GetCollectionRenames() map[string]string { - if m != nil { - return m.CollectionRenames +func (x *RestoreBackupRequest) GetCollectionRenames() map[string]string { + if x != nil { + return x.CollectionRenames } return nil } -func (m *RestoreBackupRequest) GetAsync() bool { - if m != nil { - return m.Async +func (x *RestoreBackupRequest) GetAsync() bool { + if x != nil { + return x.Async } return false } -func (m *RestoreBackupRequest) GetBucketName() string { - if m != nil { - return m.BucketName +func (x *RestoreBackupRequest) GetBucketName() string { + if x != nil { + return x.BucketName } return "" } -func (m *RestoreBackupRequest) GetPath() string { - if m != nil { - return m.Path +func (x *RestoreBackupRequest) GetPath() string { + if x != nil { + return x.Path } return "" } -func (m *RestoreBackupRequest) GetDbCollections() *_struct.Value { - if m != nil { - return m.DbCollections +func (x *RestoreBackupRequest) GetDbCollections() *_struct.Value { + if x != nil { + return x.DbCollections } return nil } -func (m *RestoreBackupRequest) GetMetaOnly() bool { - if m != nil { - return m.MetaOnly +func (x *RestoreBackupRequest) GetMetaOnly() bool { + if x != nil { + return x.MetaOnly } return false } -func (m *RestoreBackupRequest) GetRestoreIndex() bool { - if m != nil { - return m.RestoreIndex +func (x *RestoreBackupRequest) GetRestoreIndex() bool { + if x != nil { + return x.RestoreIndex } return false } -func (m *RestoreBackupRequest) GetUseAutoIndex() bool { - if m != nil { - return m.UseAutoIndex +func (x *RestoreBackupRequest) GetUseAutoIndex() bool { + if x != nil { + return x.UseAutoIndex } return false } -func (m *RestoreBackupRequest) GetDropExistCollection() bool { - if m != nil { - return m.DropExistCollection +func (x *RestoreBackupRequest) GetDropExistCollection() bool { + if x != nil { + return x.DropExistCollection } return false } -func (m *RestoreBackupRequest) GetDropExistIndex() bool { - if m != nil { - return m.DropExistIndex +func (x *RestoreBackupRequest) GetDropExistIndex() bool { + if x != nil { + return x.DropExistIndex } return false } -func (m *RestoreBackupRequest) GetSkipCreateCollection() bool { - if m != nil { - return m.SkipCreateCollection +func (x *RestoreBackupRequest) GetSkipCreateCollection() bool { + if x != nil { + return x.SkipCreateCollection } return false } -func (m *RestoreBackupRequest) GetId() string { - if m != nil { - return m.Id +func (x *RestoreBackupRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *RestoreBackupRequest) GetSkipImportDiskQuotaCheck() bool { - if m != nil { - return m.SkipImportDiskQuotaCheck +func (x *RestoreBackupRequest) GetSkipImportDiskQuotaCheck() bool { + if x != nil { + return x.SkipImportDiskQuotaCheck } return false } -func (m *RestoreBackupRequest) GetRbac() bool { - if m != nil { - return m.Rbac +func (x *RestoreBackupRequest) GetRbac() bool { + if x != nil { + return x.Rbac } return false } -func (m *RestoreBackupRequest) GetMaxShardNum() int32 { - if m != nil { - return m.MaxShardNum +func (x *RestoreBackupRequest) GetMaxShardNum() int32 { + if x != nil { + return x.MaxShardNum } return 0 } -type RestorePartitionTask struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - StateCode RestoreTaskStateCode `protobuf:"varint,2,opt,name=state_code,json=stateCode,proto3,enum=milvus.proto.backup.RestoreTaskStateCode" json:"state_code"` - ErrorMessage string `protobuf:"bytes,3,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` - StartTime int64 `protobuf:"varint,4,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - EndTime int64 `protobuf:"varint,5,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` - Progress int32 `protobuf:"varint,6,opt,name=progress,proto3" json:"progress"` - PartBackup *PartitionBackupInfo `protobuf:"bytes,7,opt,name=part_backup,json=partBackup,proto3" json:"part_backup,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RestorePartitionTask) Reset() { *m = RestorePartitionTask{} } -func (m *RestorePartitionTask) String() string { return proto.CompactTextString(m) } -func (*RestorePartitionTask) ProtoMessage() {} -func (*RestorePartitionTask) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{16} +func (x *RestoreBackupRequest) GetSkipParams() *SkipParams { + if x != nil { + return x.SkipParams + } + return nil } -func (m *RestorePartitionTask) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RestorePartitionTask.Unmarshal(m, b) -} -func (m *RestorePartitionTask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RestorePartitionTask.Marshal(b, m, deterministic) +type RestorePartitionTask struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + StateCode RestoreTaskStateCode `protobuf:"varint,2,opt,name=state_code,json=stateCode,proto3,enum=milvus.proto.backup.RestoreTaskStateCode" json:"state_code"` + ErrorMessage string `protobuf:"bytes,3,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` + StartTime int64 `protobuf:"varint,4,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime int64 `protobuf:"varint,5,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + Progress int32 `protobuf:"varint,6,opt,name=progress,proto3" json:"progress"` + PartBackup *PartitionBackupInfo `protobuf:"bytes,7,opt,name=part_backup,json=partBackup,proto3" json:"part_backup,omitempty"` } -func (m *RestorePartitionTask) XXX_Merge(src proto.Message) { - xxx_messageInfo_RestorePartitionTask.Merge(m, src) + +func (x *RestorePartitionTask) Reset() { + *x = RestorePartitionTask{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RestorePartitionTask) XXX_Size() int { - return xxx_messageInfo_RestorePartitionTask.Size(m) + +func (x *RestorePartitionTask) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RestorePartitionTask) XXX_DiscardUnknown() { - xxx_messageInfo_RestorePartitionTask.DiscardUnknown(m) + +func (*RestorePartitionTask) ProtoMessage() {} + +func (x *RestorePartitionTask) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_RestorePartitionTask proto.InternalMessageInfo +// Deprecated: Use RestorePartitionTask.ProtoReflect.Descriptor instead. +func (*RestorePartitionTask) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{17} +} -func (m *RestorePartitionTask) GetId() string { - if m != nil { - return m.Id +func (x *RestorePartitionTask) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *RestorePartitionTask) GetStateCode() RestoreTaskStateCode { - if m != nil { - return m.StateCode +func (x *RestorePartitionTask) GetStateCode() RestoreTaskStateCode { + if x != nil { + return x.StateCode } return RestoreTaskStateCode_INITIAL } -func (m *RestorePartitionTask) GetErrorMessage() string { - if m != nil { - return m.ErrorMessage +func (x *RestorePartitionTask) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage } return "" } -func (m *RestorePartitionTask) GetStartTime() int64 { - if m != nil { - return m.StartTime +func (x *RestorePartitionTask) GetStartTime() int64 { + if x != nil { + return x.StartTime } return 0 } -func (m *RestorePartitionTask) GetEndTime() int64 { - if m != nil { - return m.EndTime +func (x *RestorePartitionTask) GetEndTime() int64 { + if x != nil { + return x.EndTime } return 0 } -func (m *RestorePartitionTask) GetProgress() int32 { - if m != nil { - return m.Progress +func (x *RestorePartitionTask) GetProgress() int32 { + if x != nil { + return x.Progress } return 0 } -func (m *RestorePartitionTask) GetPartBackup() *PartitionBackupInfo { - if m != nil { - return m.PartBackup +func (x *RestorePartitionTask) GetPartBackup() *PartitionBackupInfo { + if x != nil { + return x.PartBackup } return nil } type RestoreCollectionTask struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` StateCode RestoreTaskStateCode `protobuf:"varint,2,opt,name=state_code,json=stateCode,proto3,enum=milvus.proto.backup.RestoreTaskStateCode" json:"state_code"` ErrorMessage string `protobuf:"bytes,3,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` @@ -1817,178 +2213,194 @@ type RestoreCollectionTask struct { SkipCreateCollection bool `protobuf:"varint,18,opt,name=skipCreateCollection,proto3" json:"skipCreateCollection,omitempty"` SkipDiskQuotaCheck bool `protobuf:"varint,19,opt,name=skipDiskQuotaCheck,proto3" json:"skipDiskQuotaCheck,omitempty"` // target max shard number - MaxShardNum int32 `protobuf:"varint,20,opt,name=maxShardNum,proto3" json:"maxShardNum,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + MaxShardNum int32 `protobuf:"varint,20,opt,name=maxShardNum,proto3" json:"maxShardNum,omitempty"` + SkipParams *SkipParams `protobuf:"bytes,21,opt,name=skip_params,json=skipParams,proto3" json:"skip_params,omitempty"` } -func (m *RestoreCollectionTask) Reset() { *m = RestoreCollectionTask{} } -func (m *RestoreCollectionTask) String() string { return proto.CompactTextString(m) } -func (*RestoreCollectionTask) ProtoMessage() {} -func (*RestoreCollectionTask) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{17} +func (x *RestoreCollectionTask) Reset() { + *x = RestoreCollectionTask{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RestoreCollectionTask) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RestoreCollectionTask.Unmarshal(m, b) +func (x *RestoreCollectionTask) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RestoreCollectionTask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RestoreCollectionTask.Marshal(b, m, deterministic) -} -func (m *RestoreCollectionTask) XXX_Merge(src proto.Message) { - xxx_messageInfo_RestoreCollectionTask.Merge(m, src) -} -func (m *RestoreCollectionTask) XXX_Size() int { - return xxx_messageInfo_RestoreCollectionTask.Size(m) -} -func (m *RestoreCollectionTask) XXX_DiscardUnknown() { - xxx_messageInfo_RestoreCollectionTask.DiscardUnknown(m) + +func (*RestoreCollectionTask) ProtoMessage() {} + +func (x *RestoreCollectionTask) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_RestoreCollectionTask proto.InternalMessageInfo +// Deprecated: Use RestoreCollectionTask.ProtoReflect.Descriptor instead. +func (*RestoreCollectionTask) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{18} +} -func (m *RestoreCollectionTask) GetId() string { - if m != nil { - return m.Id +func (x *RestoreCollectionTask) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *RestoreCollectionTask) GetStateCode() RestoreTaskStateCode { - if m != nil { - return m.StateCode +func (x *RestoreCollectionTask) GetStateCode() RestoreTaskStateCode { + if x != nil { + return x.StateCode } return RestoreTaskStateCode_INITIAL } -func (m *RestoreCollectionTask) GetErrorMessage() string { - if m != nil { - return m.ErrorMessage +func (x *RestoreCollectionTask) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage } return "" } -func (m *RestoreCollectionTask) GetStartTime() int64 { - if m != nil { - return m.StartTime +func (x *RestoreCollectionTask) GetStartTime() int64 { + if x != nil { + return x.StartTime } return 0 } -func (m *RestoreCollectionTask) GetEndTime() int64 { - if m != nil { - return m.EndTime +func (x *RestoreCollectionTask) GetEndTime() int64 { + if x != nil { + return x.EndTime } return 0 } -func (m *RestoreCollectionTask) GetCollBackup() *CollectionBackupInfo { - if m != nil { - return m.CollBackup +func (x *RestoreCollectionTask) GetCollBackup() *CollectionBackupInfo { + if x != nil { + return x.CollBackup } return nil } -func (m *RestoreCollectionTask) GetTargetCollectionName() string { - if m != nil { - return m.TargetCollectionName +func (x *RestoreCollectionTask) GetTargetCollectionName() string { + if x != nil { + return x.TargetCollectionName } return "" } -func (m *RestoreCollectionTask) GetPartitionRestoreTasks() []*RestorePartitionTask { - if m != nil { - return m.PartitionRestoreTasks +func (x *RestoreCollectionTask) GetPartitionRestoreTasks() []*RestorePartitionTask { + if x != nil { + return x.PartitionRestoreTasks } return nil } -func (m *RestoreCollectionTask) GetRestoredSize() int64 { - if m != nil { - return m.RestoredSize +func (x *RestoreCollectionTask) GetRestoredSize() int64 { + if x != nil { + return x.RestoredSize } return 0 } -func (m *RestoreCollectionTask) GetToRestoreSize() int64 { - if m != nil { - return m.ToRestoreSize +func (x *RestoreCollectionTask) GetToRestoreSize() int64 { + if x != nil { + return x.ToRestoreSize } return 0 } -func (m *RestoreCollectionTask) GetProgress() int32 { - if m != nil { - return m.Progress +func (x *RestoreCollectionTask) GetProgress() int32 { + if x != nil { + return x.Progress } return 0 } -func (m *RestoreCollectionTask) GetTargetDbName() string { - if m != nil { - return m.TargetDbName +func (x *RestoreCollectionTask) GetTargetDbName() string { + if x != nil { + return x.TargetDbName } return "" } -func (m *RestoreCollectionTask) GetMetaOnly() bool { - if m != nil { - return m.MetaOnly +func (x *RestoreCollectionTask) GetMetaOnly() bool { + if x != nil { + return x.MetaOnly } return false } -func (m *RestoreCollectionTask) GetRestoreIndex() bool { - if m != nil { - return m.RestoreIndex +func (x *RestoreCollectionTask) GetRestoreIndex() bool { + if x != nil { + return x.RestoreIndex } return false } -func (m *RestoreCollectionTask) GetUseAutoIndex() bool { - if m != nil { - return m.UseAutoIndex +func (x *RestoreCollectionTask) GetUseAutoIndex() bool { + if x != nil { + return x.UseAutoIndex } return false } -func (m *RestoreCollectionTask) GetDropExistCollection() bool { - if m != nil { - return m.DropExistCollection +func (x *RestoreCollectionTask) GetDropExistCollection() bool { + if x != nil { + return x.DropExistCollection } return false } -func (m *RestoreCollectionTask) GetDropExistIndex() bool { - if m != nil { - return m.DropExistIndex +func (x *RestoreCollectionTask) GetDropExistIndex() bool { + if x != nil { + return x.DropExistIndex } return false } -func (m *RestoreCollectionTask) GetSkipCreateCollection() bool { - if m != nil { - return m.SkipCreateCollection +func (x *RestoreCollectionTask) GetSkipCreateCollection() bool { + if x != nil { + return x.SkipCreateCollection } return false } -func (m *RestoreCollectionTask) GetSkipDiskQuotaCheck() bool { - if m != nil { - return m.SkipDiskQuotaCheck +func (x *RestoreCollectionTask) GetSkipDiskQuotaCheck() bool { + if x != nil { + return x.SkipDiskQuotaCheck } return false } -func (m *RestoreCollectionTask) GetMaxShardNum() int32 { - if m != nil { - return m.MaxShardNum +func (x *RestoreCollectionTask) GetMaxShardNum() int32 { + if x != nil { + return x.MaxShardNum } return 0 } +func (x *RestoreCollectionTask) GetSkipParams() *SkipParams { + if x != nil { + return x.SkipParams + } + return nil +} + type RestoreBackupTask struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` StateCode RestoreTaskStateCode `protobuf:"varint,2,opt,name=state_code,json=stateCode,proto3,enum=milvus.proto.backup.RestoreTaskStateCode" json:"state_code"` ErrorMessage string `protobuf:"bytes,3,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` @@ -1998,100 +2410,108 @@ type RestoreBackupTask struct { RestoredSize int64 `protobuf:"varint,7,opt,name=restored_size,json=restoredSize,proto3" json:"restored_size"` ToRestoreSize int64 `protobuf:"varint,8,opt,name=to_restore_size,json=toRestoreSize,proto3" json:"to_restore_size"` Progress int32 `protobuf:"varint,9,opt,name=progress,proto3" json:"progress"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` } -func (m *RestoreBackupTask) Reset() { *m = RestoreBackupTask{} } -func (m *RestoreBackupTask) String() string { return proto.CompactTextString(m) } -func (*RestoreBackupTask) ProtoMessage() {} -func (*RestoreBackupTask) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{18} +func (x *RestoreBackupTask) Reset() { + *x = RestoreBackupTask{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RestoreBackupTask) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RestoreBackupTask.Unmarshal(m, b) -} -func (m *RestoreBackupTask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RestoreBackupTask.Marshal(b, m, deterministic) +func (x *RestoreBackupTask) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RestoreBackupTask) XXX_Merge(src proto.Message) { - xxx_messageInfo_RestoreBackupTask.Merge(m, src) -} -func (m *RestoreBackupTask) XXX_Size() int { - return xxx_messageInfo_RestoreBackupTask.Size(m) -} -func (m *RestoreBackupTask) XXX_DiscardUnknown() { - xxx_messageInfo_RestoreBackupTask.DiscardUnknown(m) + +func (*RestoreBackupTask) ProtoMessage() {} + +func (x *RestoreBackupTask) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[19] + 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) } -var xxx_messageInfo_RestoreBackupTask proto.InternalMessageInfo +// Deprecated: Use RestoreBackupTask.ProtoReflect.Descriptor instead. +func (*RestoreBackupTask) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{19} +} -func (m *RestoreBackupTask) GetId() string { - if m != nil { - return m.Id +func (x *RestoreBackupTask) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *RestoreBackupTask) GetStateCode() RestoreTaskStateCode { - if m != nil { - return m.StateCode +func (x *RestoreBackupTask) GetStateCode() RestoreTaskStateCode { + if x != nil { + return x.StateCode } return RestoreTaskStateCode_INITIAL } -func (m *RestoreBackupTask) GetErrorMessage() string { - if m != nil { - return m.ErrorMessage +func (x *RestoreBackupTask) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage } return "" } -func (m *RestoreBackupTask) GetStartTime() int64 { - if m != nil { - return m.StartTime +func (x *RestoreBackupTask) GetStartTime() int64 { + if x != nil { + return x.StartTime } return 0 } -func (m *RestoreBackupTask) GetEndTime() int64 { - if m != nil { - return m.EndTime +func (x *RestoreBackupTask) GetEndTime() int64 { + if x != nil { + return x.EndTime } return 0 } -func (m *RestoreBackupTask) GetCollectionRestoreTasks() []*RestoreCollectionTask { - if m != nil { - return m.CollectionRestoreTasks +func (x *RestoreBackupTask) GetCollectionRestoreTasks() []*RestoreCollectionTask { + if x != nil { + return x.CollectionRestoreTasks } return nil } -func (m *RestoreBackupTask) GetRestoredSize() int64 { - if m != nil { - return m.RestoredSize +func (x *RestoreBackupTask) GetRestoredSize() int64 { + if x != nil { + return x.RestoredSize } return 0 } -func (m *RestoreBackupTask) GetToRestoreSize() int64 { - if m != nil { - return m.ToRestoreSize +func (x *RestoreBackupTask) GetToRestoreSize() int64 { + if x != nil { + return x.ToRestoreSize } return 0 } -func (m *RestoreBackupTask) GetProgress() int32 { - if m != nil { - return m.Progress +func (x *RestoreBackupTask) GetProgress() int32 { + if x != nil { + return x.Progress } return 0 } type RestoreBackupResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // uuid of the request to response RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` // response code. 0 means success. others are fail @@ -2099,283 +2519,323 @@ type RestoreBackupResponse struct { // error msg if fail Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"` // restore task info entity - Data *RestoreBackupTask `protobuf:"bytes,4,opt,name=data,proto3" json:"data"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Data *RestoreBackupTask `protobuf:"bytes,4,opt,name=data,proto3" json:"data"` } -func (m *RestoreBackupResponse) Reset() { *m = RestoreBackupResponse{} } -func (m *RestoreBackupResponse) String() string { return proto.CompactTextString(m) } -func (*RestoreBackupResponse) ProtoMessage() {} -func (*RestoreBackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{19} +func (x *RestoreBackupResponse) Reset() { + *x = RestoreBackupResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RestoreBackupResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RestoreBackupResponse.Unmarshal(m, b) -} -func (m *RestoreBackupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RestoreBackupResponse.Marshal(b, m, deterministic) +func (x *RestoreBackupResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RestoreBackupResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_RestoreBackupResponse.Merge(m, src) -} -func (m *RestoreBackupResponse) XXX_Size() int { - return xxx_messageInfo_RestoreBackupResponse.Size(m) -} -func (m *RestoreBackupResponse) XXX_DiscardUnknown() { - xxx_messageInfo_RestoreBackupResponse.DiscardUnknown(m) + +func (*RestoreBackupResponse) ProtoMessage() {} + +func (x *RestoreBackupResponse) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[20] + 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) } -var xxx_messageInfo_RestoreBackupResponse proto.InternalMessageInfo +// Deprecated: Use RestoreBackupResponse.ProtoReflect.Descriptor instead. +func (*RestoreBackupResponse) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{20} +} -func (m *RestoreBackupResponse) GetRequestId() string { - if m != nil { - return m.RequestId +func (x *RestoreBackupResponse) GetRequestId() string { + if x != nil { + return x.RequestId } return "" } -func (m *RestoreBackupResponse) GetCode() ResponseCode { - if m != nil { - return m.Code +func (x *RestoreBackupResponse) GetCode() ResponseCode { + if x != nil { + return x.Code } return ResponseCode_Success } -func (m *RestoreBackupResponse) GetMsg() string { - if m != nil { - return m.Msg +func (x *RestoreBackupResponse) GetMsg() string { + if x != nil { + return x.Msg } return "" } -func (m *RestoreBackupResponse) GetData() *RestoreBackupTask { - if m != nil { - return m.Data +func (x *RestoreBackupResponse) GetData() *RestoreBackupTask { + if x != nil { + return x.Data } return nil } type GetRestoreStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // uuid of request, will generate one if not set RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` // restore task id to query - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } -func (m *GetRestoreStateRequest) Reset() { *m = GetRestoreStateRequest{} } -func (m *GetRestoreStateRequest) String() string { return proto.CompactTextString(m) } -func (*GetRestoreStateRequest) ProtoMessage() {} -func (*GetRestoreStateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{20} +func (x *GetRestoreStateRequest) Reset() { + *x = GetRestoreStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetRestoreStateRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetRestoreStateRequest.Unmarshal(m, b) -} -func (m *GetRestoreStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetRestoreStateRequest.Marshal(b, m, deterministic) +func (x *GetRestoreStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetRestoreStateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRestoreStateRequest.Merge(m, src) -} -func (m *GetRestoreStateRequest) XXX_Size() int { - return xxx_messageInfo_GetRestoreStateRequest.Size(m) -} -func (m *GetRestoreStateRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetRestoreStateRequest.DiscardUnknown(m) + +func (*GetRestoreStateRequest) ProtoMessage() {} + +func (x *GetRestoreStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[21] + 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) } -var xxx_messageInfo_GetRestoreStateRequest proto.InternalMessageInfo +// Deprecated: Use GetRestoreStateRequest.ProtoReflect.Descriptor instead. +func (*GetRestoreStateRequest) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{21} +} -func (m *GetRestoreStateRequest) GetRequestId() string { - if m != nil { - return m.RequestId +func (x *GetRestoreStateRequest) GetRequestId() string { + if x != nil { + return x.RequestId } return "" } -func (m *GetRestoreStateRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetRestoreStateRequest) GetId() string { + if x != nil { + return x.Id } return "" } // copied from milvus data_coord.proto type FieldBinlog struct { - FieldID int64 `protobuf:"varint,1,opt,name=fieldID,proto3" json:"fieldID,omitempty"` - Binlogs []*Binlog `protobuf:"bytes,2,rep,name=binlogs,proto3" json:"binlogs,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *FieldBinlog) Reset() { *m = FieldBinlog{} } -func (m *FieldBinlog) String() string { return proto.CompactTextString(m) } -func (*FieldBinlog) ProtoMessage() {} -func (*FieldBinlog) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{21} + FieldID int64 `protobuf:"varint,1,opt,name=fieldID,proto3" json:"fieldID,omitempty"` + Binlogs []*Binlog `protobuf:"bytes,2,rep,name=binlogs,proto3" json:"binlogs,omitempty"` } -func (m *FieldBinlog) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FieldBinlog.Unmarshal(m, b) -} -func (m *FieldBinlog) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FieldBinlog.Marshal(b, m, deterministic) -} -func (m *FieldBinlog) XXX_Merge(src proto.Message) { - xxx_messageInfo_FieldBinlog.Merge(m, src) -} -func (m *FieldBinlog) XXX_Size() int { - return xxx_messageInfo_FieldBinlog.Size(m) +func (x *FieldBinlog) Reset() { + *x = FieldBinlog{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *FieldBinlog) XXX_DiscardUnknown() { - xxx_messageInfo_FieldBinlog.DiscardUnknown(m) + +func (x *FieldBinlog) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_FieldBinlog proto.InternalMessageInfo +func (*FieldBinlog) ProtoMessage() {} -func (m *FieldBinlog) GetFieldID() int64 { - if m != nil { - return m.FieldID +func (x *FieldBinlog) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[22] + 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 FieldBinlog.ProtoReflect.Descriptor instead. +func (*FieldBinlog) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{22} +} + +func (x *FieldBinlog) GetFieldID() int64 { + if x != nil { + return x.FieldID } return 0 } -func (m *FieldBinlog) GetBinlogs() []*Binlog { - if m != nil { - return m.Binlogs +func (x *FieldBinlog) GetBinlogs() []*Binlog { + if x != nil { + return x.Binlogs } return nil } type Binlog struct { - EntriesNum int64 `protobuf:"varint,1,opt,name=entries_num,json=entriesNum,proto3" json:"entries_num,omitempty"` - TimestampFrom uint64 `protobuf:"varint,2,opt,name=timestamp_from,json=timestampFrom,proto3" json:"timestamp_from,omitempty"` - TimestampTo uint64 `protobuf:"varint,3,opt,name=timestamp_to,json=timestampTo,proto3" json:"timestamp_to,omitempty"` - LogPath string `protobuf:"bytes,4,opt,name=log_path,json=logPath,proto3" json:"log_path,omitempty"` - LogSize int64 `protobuf:"varint,5,opt,name=log_size,json=logSize,proto3" json:"log_size"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Binlog) Reset() { *m = Binlog{} } -func (m *Binlog) String() string { return proto.CompactTextString(m) } -func (*Binlog) ProtoMessage() {} -func (*Binlog) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{22} -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Binlog) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Binlog.Unmarshal(m, b) -} -func (m *Binlog) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Binlog.Marshal(b, m, deterministic) + EntriesNum int64 `protobuf:"varint,1,opt,name=entries_num,json=entriesNum,proto3" json:"entries_num,omitempty"` + TimestampFrom uint64 `protobuf:"varint,2,opt,name=timestamp_from,json=timestampFrom,proto3" json:"timestamp_from,omitempty"` + TimestampTo uint64 `protobuf:"varint,3,opt,name=timestamp_to,json=timestampTo,proto3" json:"timestamp_to,omitempty"` + LogPath string `protobuf:"bytes,4,opt,name=log_path,json=logPath,proto3" json:"log_path,omitempty"` + LogSize int64 `protobuf:"varint,5,opt,name=log_size,json=logSize,proto3" json:"log_size"` } -func (m *Binlog) XXX_Merge(src proto.Message) { - xxx_messageInfo_Binlog.Merge(m, src) + +func (x *Binlog) Reset() { + *x = Binlog{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Binlog) XXX_Size() int { - return xxx_messageInfo_Binlog.Size(m) + +func (x *Binlog) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Binlog) XXX_DiscardUnknown() { - xxx_messageInfo_Binlog.DiscardUnknown(m) + +func (*Binlog) ProtoMessage() {} + +func (x *Binlog) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[23] + 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) } -var xxx_messageInfo_Binlog proto.InternalMessageInfo +// Deprecated: Use Binlog.ProtoReflect.Descriptor instead. +func (*Binlog) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{23} +} -func (m *Binlog) GetEntriesNum() int64 { - if m != nil { - return m.EntriesNum +func (x *Binlog) GetEntriesNum() int64 { + if x != nil { + return x.EntriesNum } return 0 } -func (m *Binlog) GetTimestampFrom() uint64 { - if m != nil { - return m.TimestampFrom +func (x *Binlog) GetTimestampFrom() uint64 { + if x != nil { + return x.TimestampFrom } return 0 } -func (m *Binlog) GetTimestampTo() uint64 { - if m != nil { - return m.TimestampTo +func (x *Binlog) GetTimestampTo() uint64 { + if x != nil { + return x.TimestampTo } return 0 } -func (m *Binlog) GetLogPath() string { - if m != nil { - return m.LogPath +func (x *Binlog) GetLogPath() string { + if x != nil { + return x.LogPath } return "" } -func (m *Binlog) GetLogSize() int64 { - if m != nil { - return m.LogSize +func (x *Binlog) GetLogSize() int64 { + if x != nil { + return x.LogSize } return 0 } // copied from milvus common.proto type KeyValuePair struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *KeyValuePair) Reset() { *m = KeyValuePair{} } -func (m *KeyValuePair) String() string { return proto.CompactTextString(m) } -func (*KeyValuePair) ProtoMessage() {} -func (*KeyValuePair) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{23} + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } -func (m *KeyValuePair) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_KeyValuePair.Unmarshal(m, b) -} -func (m *KeyValuePair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_KeyValuePair.Marshal(b, m, deterministic) -} -func (m *KeyValuePair) XXX_Merge(src proto.Message) { - xxx_messageInfo_KeyValuePair.Merge(m, src) +func (x *KeyValuePair) Reset() { + *x = KeyValuePair{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *KeyValuePair) XXX_Size() int { - return xxx_messageInfo_KeyValuePair.Size(m) + +func (x *KeyValuePair) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *KeyValuePair) XXX_DiscardUnknown() { - xxx_messageInfo_KeyValuePair.DiscardUnknown(m) + +func (*KeyValuePair) ProtoMessage() {} + +func (x *KeyValuePair) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[24] + 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) } -var xxx_messageInfo_KeyValuePair proto.InternalMessageInfo +// Deprecated: Use KeyValuePair.ProtoReflect.Descriptor instead. +func (*KeyValuePair) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{24} +} -func (m *KeyValuePair) GetKey() string { - if m != nil { - return m.Key +func (x *KeyValuePair) GetKey() string { + if x != nil { + return x.Key } return "" } -func (m *KeyValuePair) GetValue() string { - if m != nil { - return m.Value +func (x *KeyValuePair) GetValue() string { + if x != nil { + return x.Value } return "" } type ValueField struct { - // Types that are valid to be assigned to Data: + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Data: // // *ValueField_BoolData // *ValueField_IntData @@ -2384,36 +2844,96 @@ type ValueField struct { // *ValueField_DoubleData // *ValueField_StringData // *ValueField_BytesData - Data isValueField_Data `protobuf_oneof:"data"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Data isValueField_Data `protobuf_oneof:"data"` +} + +func (x *ValueField) Reset() { + *x = ValueField{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValueField) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValueField) ProtoMessage() {} + +func (x *ValueField) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[25] + 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) } -func (m *ValueField) Reset() { *m = ValueField{} } -func (m *ValueField) String() string { return proto.CompactTextString(m) } -func (*ValueField) ProtoMessage() {} +// Deprecated: Use ValueField.ProtoReflect.Descriptor instead. func (*ValueField) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{24} + return file_backup_proto_rawDescGZIP(), []int{25} +} + +func (m *ValueField) GetData() isValueField_Data { + if m != nil { + return m.Data + } + return nil } -func (m *ValueField) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ValueField.Unmarshal(m, b) +func (x *ValueField) GetBoolData() bool { + if x, ok := x.GetData().(*ValueField_BoolData); ok { + return x.BoolData + } + return false +} + +func (x *ValueField) GetIntData() int32 { + if x, ok := x.GetData().(*ValueField_IntData); ok { + return x.IntData + } + return 0 } -func (m *ValueField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ValueField.Marshal(b, m, deterministic) + +func (x *ValueField) GetLongData() int64 { + if x, ok := x.GetData().(*ValueField_LongData); ok { + return x.LongData + } + return 0 } -func (m *ValueField) XXX_Merge(src proto.Message) { - xxx_messageInfo_ValueField.Merge(m, src) + +func (x *ValueField) GetFloatData() float32 { + if x, ok := x.GetData().(*ValueField_FloatData); ok { + return x.FloatData + } + return 0 } -func (m *ValueField) XXX_Size() int { - return xxx_messageInfo_ValueField.Size(m) + +func (x *ValueField) GetDoubleData() float64 { + if x, ok := x.GetData().(*ValueField_DoubleData); ok { + return x.DoubleData + } + return 0 } -func (m *ValueField) XXX_DiscardUnknown() { - xxx_messageInfo_ValueField.DiscardUnknown(m) + +func (x *ValueField) GetStringData() string { + if x, ok := x.GetData().(*ValueField_StringData); ok { + return x.StringData + } + return "" } -var xxx_messageInfo_ValueField proto.InternalMessageInfo +func (x *ValueField) GetBytesData() []byte { + if x, ok := x.GetData().(*ValueField_BytesData); ok { + return x.BytesData + } + return nil +} type isValueField_Data interface { isValueField_Data() @@ -2461,734 +2981,897 @@ func (*ValueField_StringData) isValueField_Data() {} func (*ValueField_BytesData) isValueField_Data() {} -func (m *ValueField) GetData() isValueField_Data { - if m != nil { - return m.Data - } - return nil +type FieldSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FieldID int64 `protobuf:"varint,1,opt,name=fieldID,proto3" json:"fieldID,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + IsPrimaryKey bool `protobuf:"varint,3,opt,name=is_primary_key,json=isPrimaryKey,proto3" json:"is_primary_key,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + DataType DataType `protobuf:"varint,5,opt,name=data_type,json=dataType,proto3,enum=milvus.proto.backup.DataType" json:"data_type,omitempty"` + TypeParams []*KeyValuePair `protobuf:"bytes,6,rep,name=type_params,json=typeParams,proto3" json:"type_params,omitempty"` + IndexParams []*KeyValuePair `protobuf:"bytes,7,rep,name=index_params,json=indexParams,proto3" json:"index_params,omitempty"` + AutoID bool `protobuf:"varint,8,opt,name=autoID,proto3" json:"autoID,omitempty"` + State FieldState `protobuf:"varint,9,opt,name=state,proto3,enum=milvus.proto.backup.FieldState" json:"state,omitempty"` // To keep compatible with older version, the default state is `Created`. + ElementType DataType `protobuf:"varint,10,opt,name=element_type,json=elementType,proto3,enum=milvus.proto.backup.DataType" json:"element_type,omitempty"` // For array type, the element type is stored here + DefaultValue *ValueField `protobuf:"bytes,11,opt,name=default_value,json=defaultValue,proto3" json:"default_value,omitempty"` // default_value only support scalars except array and json for now + IsDynamic bool `protobuf:"varint,12,opt,name=is_dynamic,json=isDynamic,proto3" json:"is_dynamic,omitempty"` // mark whether this field is the dynamic field + IsPartitionKey bool `protobuf:"varint,13,opt,name=is_partition_key,json=isPartitionKey,proto3" json:"is_partition_key,omitempty"` // enable logic partitions + Nullable bool `protobuf:"varint,14,opt,name=nullable,proto3" json:"nullable,omitempty"` + DefaultValueProto string `protobuf:"bytes,15,opt,name=default_value_proto,json=defaultValueProto,proto3" json:"default_value_proto,omitempty"` // json not support marshall oneof, so use proto string + IsFunctionOutput bool `protobuf:"varint,16,opt,name=is_function_output,json=isFunctionOutput,proto3" json:"is_function_output,omitempty"` } -func (m *ValueField) GetBoolData() bool { - if x, ok := m.GetData().(*ValueField_BoolData); ok { - return x.BoolData +func (x *FieldSchema) Reset() { + *x = FieldSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return false } -func (m *ValueField) GetIntData() int32 { - if x, ok := m.GetData().(*ValueField_IntData); ok { - return x.IntData +func (x *FieldSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FieldSchema) ProtoMessage() {} + +func (x *FieldSchema) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (m *ValueField) GetLongData() int64 { - if x, ok := m.GetData().(*ValueField_LongData); ok { - return x.LongData +// Deprecated: Use FieldSchema.ProtoReflect.Descriptor instead. +func (*FieldSchema) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{26} +} + +func (x *FieldSchema) GetFieldID() int64 { + if x != nil { + return x.FieldID } return 0 } -func (m *ValueField) GetFloatData() float32 { - if x, ok := m.GetData().(*ValueField_FloatData); ok { - return x.FloatData +func (x *FieldSchema) GetName() string { + if x != nil { + return x.Name } - return 0 + return "" } -func (m *ValueField) GetDoubleData() float64 { - if x, ok := m.GetData().(*ValueField_DoubleData); ok { - return x.DoubleData +func (x *FieldSchema) GetIsPrimaryKey() bool { + if x != nil { + return x.IsPrimaryKey } - return 0 + return false } -func (m *ValueField) GetStringData() string { - if x, ok := m.GetData().(*ValueField_StringData); ok { - return x.StringData +func (x *FieldSchema) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (m *ValueField) GetBytesData() []byte { - if x, ok := m.GetData().(*ValueField_BytesData); ok { - return x.BytesData +func (x *FieldSchema) GetDataType() DataType { + if x != nil { + return x.DataType } - return nil + return DataType_None } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*ValueField) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*ValueField_BoolData)(nil), - (*ValueField_IntData)(nil), - (*ValueField_LongData)(nil), - (*ValueField_FloatData)(nil), - (*ValueField_DoubleData)(nil), - (*ValueField_StringData)(nil), - (*ValueField_BytesData)(nil), +func (x *FieldSchema) GetTypeParams() []*KeyValuePair { + if x != nil { + return x.TypeParams } + return nil } -// * -// @brief Field schema. The same as https://github.com/milvus-io/milvus-proto schema.proto -type FieldSchema struct { - FieldID int64 `protobuf:"varint,1,opt,name=fieldID,proto3" json:"fieldID,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - IsPrimaryKey bool `protobuf:"varint,3,opt,name=is_primary_key,json=isPrimaryKey,proto3" json:"is_primary_key,omitempty"` - Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - DataType DataType `protobuf:"varint,5,opt,name=data_type,json=dataType,proto3,enum=milvus.proto.backup.DataType" json:"data_type,omitempty"` - TypeParams []*KeyValuePair `protobuf:"bytes,6,rep,name=type_params,json=typeParams,proto3" json:"type_params,omitempty"` - IndexParams []*KeyValuePair `protobuf:"bytes,7,rep,name=index_params,json=indexParams,proto3" json:"index_params,omitempty"` - AutoID bool `protobuf:"varint,8,opt,name=autoID,proto3" json:"autoID,omitempty"` - State FieldState `protobuf:"varint,9,opt,name=state,proto3,enum=milvus.proto.backup.FieldState" json:"state,omitempty"` - ElementType DataType `protobuf:"varint,10,opt,name=element_type,json=elementType,proto3,enum=milvus.proto.backup.DataType" json:"element_type,omitempty"` - DefaultValue *ValueField `protobuf:"bytes,11,opt,name=default_value,json=defaultValue,proto3" json:"default_value,omitempty"` - IsDynamic bool `protobuf:"varint,12,opt,name=is_dynamic,json=isDynamic,proto3" json:"is_dynamic,omitempty"` - IsPartitionKey bool `protobuf:"varint,13,opt,name=is_partition_key,json=isPartitionKey,proto3" json:"is_partition_key,omitempty"` - Nullable bool `protobuf:"varint,14,opt,name=nullable,proto3" json:"nullable,omitempty"` - DefaultValueProto string `protobuf:"bytes,15,opt,name=default_value_proto,json=defaultValueProto,proto3" json:"default_value_proto,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FieldSchema) Reset() { *m = FieldSchema{} } -func (m *FieldSchema) String() string { return proto.CompactTextString(m) } -func (*FieldSchema) ProtoMessage() {} -func (*FieldSchema) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{25} +func (x *FieldSchema) GetIndexParams() []*KeyValuePair { + if x != nil { + return x.IndexParams + } + return nil } -func (m *FieldSchema) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FieldSchema.Unmarshal(m, b) +func (x *FieldSchema) GetAutoID() bool { + if x != nil { + return x.AutoID + } + return false } -func (m *FieldSchema) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FieldSchema.Marshal(b, m, deterministic) + +func (x *FieldSchema) GetState() FieldState { + if x != nil { + return x.State + } + return FieldState_FieldCreated } -func (m *FieldSchema) XXX_Merge(src proto.Message) { - xxx_messageInfo_FieldSchema.Merge(m, src) + +func (x *FieldSchema) GetElementType() DataType { + if x != nil { + return x.ElementType + } + return DataType_None } -func (m *FieldSchema) XXX_Size() int { - return xxx_messageInfo_FieldSchema.Size(m) + +func (x *FieldSchema) GetDefaultValue() *ValueField { + if x != nil { + return x.DefaultValue + } + return nil } -func (m *FieldSchema) XXX_DiscardUnknown() { - xxx_messageInfo_FieldSchema.DiscardUnknown(m) + +func (x *FieldSchema) GetIsDynamic() bool { + if x != nil { + return x.IsDynamic + } + return false } -var xxx_messageInfo_FieldSchema proto.InternalMessageInfo +func (x *FieldSchema) GetIsPartitionKey() bool { + if x != nil { + return x.IsPartitionKey + } + return false +} -func (m *FieldSchema) GetFieldID() int64 { - if m != nil { - return m.FieldID +func (x *FieldSchema) GetNullable() bool { + if x != nil { + return x.Nullable } - return 0 + return false } -func (m *FieldSchema) GetName() string { - if m != nil { - return m.Name +func (x *FieldSchema) GetDefaultValueProto() string { + if x != nil { + return x.DefaultValueProto } return "" } -func (m *FieldSchema) GetIsPrimaryKey() bool { - if m != nil { - return m.IsPrimaryKey +func (x *FieldSchema) GetIsFunctionOutput() bool { + if x != nil { + return x.IsFunctionOutput } return false } -func (m *FieldSchema) GetDescription() string { - if m != nil { - return m.Description - } - return "" +type FunctionSchema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Id int64 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Type FunctionType `protobuf:"varint,4,opt,name=type,proto3,enum=milvus.proto.backup.FunctionType" json:"type,omitempty"` + InputFieldNames []string `protobuf:"bytes,5,rep,name=input_field_names,json=inputFieldNames,proto3" json:"input_field_names,omitempty"` + InputFieldIds []int64 `protobuf:"varint,6,rep,packed,name=input_field_ids,json=inputFieldIds,proto3" json:"input_field_ids,omitempty"` + OutputFieldNames []string `protobuf:"bytes,7,rep,name=output_field_names,json=outputFieldNames,proto3" json:"output_field_names,omitempty"` + OutputFieldIds []int64 `protobuf:"varint,8,rep,packed,name=output_field_ids,json=outputFieldIds,proto3" json:"output_field_ids,omitempty"` + Params []*KeyValuePair `protobuf:"bytes,9,rep,name=params,proto3" json:"params,omitempty"` } -func (m *FieldSchema) GetDataType() DataType { - if m != nil { - return m.DataType +func (x *FunctionSchema) Reset() { + *x = FunctionSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return DataType_None } -func (m *FieldSchema) GetTypeParams() []*KeyValuePair { - if m != nil { - return m.TypeParams +func (x *FunctionSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FunctionSchema) ProtoMessage() {} + +func (x *FunctionSchema) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *FieldSchema) GetIndexParams() []*KeyValuePair { - if m != nil { - return m.IndexParams +// Deprecated: Use FunctionSchema.ProtoReflect.Descriptor instead. +func (*FunctionSchema) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{27} +} + +func (x *FunctionSchema) GetName() string { + if x != nil { + return x.Name } - return nil + return "" } -func (m *FieldSchema) GetAutoID() bool { - if m != nil { - return m.AutoID +func (x *FunctionSchema) GetId() int64 { + if x != nil { + return x.Id } - return false + return 0 } -func (m *FieldSchema) GetState() FieldState { - if m != nil { - return m.State +func (x *FunctionSchema) GetDescription() string { + if x != nil { + return x.Description } - return FieldState_FieldCreated + return "" } -func (m *FieldSchema) GetElementType() DataType { - if m != nil { - return m.ElementType +func (x *FunctionSchema) GetType() FunctionType { + if x != nil { + return x.Type } - return DataType_None + return FunctionType_Unknown } -func (m *FieldSchema) GetDefaultValue() *ValueField { - if m != nil { - return m.DefaultValue +func (x *FunctionSchema) GetInputFieldNames() []string { + if x != nil { + return x.InputFieldNames } return nil } -func (m *FieldSchema) GetIsDynamic() bool { - if m != nil { - return m.IsDynamic +func (x *FunctionSchema) GetInputFieldIds() []int64 { + if x != nil { + return x.InputFieldIds } - return false + return nil } -func (m *FieldSchema) GetIsPartitionKey() bool { - if m != nil { - return m.IsPartitionKey +func (x *FunctionSchema) GetOutputFieldNames() []string { + if x != nil { + return x.OutputFieldNames } - return false + return nil } -func (m *FieldSchema) GetNullable() bool { - if m != nil { - return m.Nullable +func (x *FunctionSchema) GetOutputFieldIds() []int64 { + if x != nil { + return x.OutputFieldIds } - return false + return nil } -func (m *FieldSchema) GetDefaultValueProto() string { - if m != nil { - return m.DefaultValueProto +func (x *FunctionSchema) GetParams() []*KeyValuePair { + if x != nil { + return x.Params } - return "" + return nil } // * // @brief Collection schema type CollectionSchema struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - AutoID bool `protobuf:"varint,3,opt,name=autoID,proto3" json:"autoID,omitempty"` - Fields []*FieldSchema `protobuf:"bytes,4,rep,name=fields,proto3" json:"fields,omitempty"` - EnableDynamicField bool `protobuf:"varint,5,opt,name=enable_dynamic_field,json=enableDynamicField,proto3" json:"enable_dynamic_field,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CollectionSchema) Reset() { *m = CollectionSchema{} } -func (m *CollectionSchema) String() string { return proto.CompactTextString(m) } -func (*CollectionSchema) ProtoMessage() {} -func (*CollectionSchema) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{26} -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *CollectionSchema) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CollectionSchema.Unmarshal(m, b) -} -func (m *CollectionSchema) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CollectionSchema.Marshal(b, m, deterministic) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + AutoID bool `protobuf:"varint,3,opt,name=autoID,proto3" json:"autoID,omitempty"` // deprecated later, keep compatible with c++ part now + Fields []*FieldSchema `protobuf:"bytes,4,rep,name=fields,proto3" json:"fields,omitempty"` + EnableDynamicField bool `protobuf:"varint,5,opt,name=enable_dynamic_field,json=enableDynamicField,proto3" json:"enable_dynamic_field,omitempty"` // mark whether this table has the dynamic field function enabled. + Properties []*KeyValuePair `protobuf:"bytes,6,rep,name=properties,proto3" json:"properties,omitempty"` + Functions []*FunctionSchema `protobuf:"bytes,7,rep,name=functions,proto3" json:"functions,omitempty"` } -func (m *CollectionSchema) XXX_Merge(src proto.Message) { - xxx_messageInfo_CollectionSchema.Merge(m, src) + +func (x *CollectionSchema) Reset() { + *x = CollectionSchema{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CollectionSchema) XXX_Size() int { - return xxx_messageInfo_CollectionSchema.Size(m) + +func (x *CollectionSchema) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CollectionSchema) XXX_DiscardUnknown() { - xxx_messageInfo_CollectionSchema.DiscardUnknown(m) + +func (*CollectionSchema) ProtoMessage() {} + +func (x *CollectionSchema) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[28] + 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) } -var xxx_messageInfo_CollectionSchema proto.InternalMessageInfo +// Deprecated: Use CollectionSchema.ProtoReflect.Descriptor instead. +func (*CollectionSchema) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{28} +} -func (m *CollectionSchema) GetName() string { - if m != nil { - return m.Name +func (x *CollectionSchema) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *CollectionSchema) GetDescription() string { - if m != nil { - return m.Description +func (x *CollectionSchema) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (m *CollectionSchema) GetAutoID() bool { - if m != nil { - return m.AutoID +func (x *CollectionSchema) GetAutoID() bool { + if x != nil { + return x.AutoID } return false } -func (m *CollectionSchema) GetFields() []*FieldSchema { - if m != nil { - return m.Fields +func (x *CollectionSchema) GetFields() []*FieldSchema { + if x != nil { + return x.Fields } return nil } -func (m *CollectionSchema) GetEnableDynamicField() bool { - if m != nil { - return m.EnableDynamicField +func (x *CollectionSchema) GetEnableDynamicField() bool { + if x != nil { + return x.EnableDynamicField } return false } -type CheckRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *CollectionSchema) GetProperties() []*KeyValuePair { + if x != nil { + return x.Properties + } + return nil } -func (m *CheckRequest) Reset() { *m = CheckRequest{} } -func (m *CheckRequest) String() string { return proto.CompactTextString(m) } -func (*CheckRequest) ProtoMessage() {} -func (*CheckRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{27} +func (x *CollectionSchema) GetFunctions() []*FunctionSchema { + if x != nil { + return x.Functions + } + return nil } -func (m *CheckRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CheckRequest.Unmarshal(m, b) -} -func (m *CheckRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CheckRequest.Marshal(b, m, deterministic) +type CheckRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *CheckRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CheckRequest.Merge(m, src) + +func (x *CheckRequest) Reset() { + *x = CheckRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CheckRequest) XXX_Size() int { - return xxx_messageInfo_CheckRequest.Size(m) + +func (x *CheckRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CheckRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CheckRequest.DiscardUnknown(m) + +func (*CheckRequest) ProtoMessage() {} + +func (x *CheckRequest) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[29] + 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) } -var xxx_messageInfo_CheckRequest proto.InternalMessageInfo +// Deprecated: Use CheckRequest.ProtoReflect.Descriptor instead. +func (*CheckRequest) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{29} +} type CheckResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // response code. 0 means success. others are fail Code ResponseCode `protobuf:"varint,1,opt,name=code,proto3,enum=milvus.proto.backup.ResponseCode" json:"code,omitempty"` // error msg if fail - Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` } -func (m *CheckResponse) Reset() { *m = CheckResponse{} } -func (m *CheckResponse) String() string { return proto.CompactTextString(m) } -func (*CheckResponse) ProtoMessage() {} -func (*CheckResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{28} +func (x *CheckResponse) Reset() { + *x = CheckResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CheckResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CheckResponse.Unmarshal(m, b) -} -func (m *CheckResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CheckResponse.Marshal(b, m, deterministic) -} -func (m *CheckResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_CheckResponse.Merge(m, src) +func (x *CheckResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CheckResponse) XXX_Size() int { - return xxx_messageInfo_CheckResponse.Size(m) -} -func (m *CheckResponse) XXX_DiscardUnknown() { - xxx_messageInfo_CheckResponse.DiscardUnknown(m) + +func (*CheckResponse) ProtoMessage() {} + +func (x *CheckResponse) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[30] + 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) } -var xxx_messageInfo_CheckResponse proto.InternalMessageInfo +// Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead. +func (*CheckResponse) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{30} +} -func (m *CheckResponse) GetCode() ResponseCode { - if m != nil { - return m.Code +func (x *CheckResponse) GetCode() ResponseCode { + if x != nil { + return x.Code } return ResponseCode_Success } -func (m *CheckResponse) GetMsg() string { - if m != nil { - return m.Msg +func (x *CheckResponse) GetMsg() string { + if x != nil { + return x.Msg } return "" } type MsgPosition struct { - ChannelName string `protobuf:"bytes,1,opt,name=channel_name,json=channelName,proto3" json:"channel_name,omitempty"` - MsgID []byte `protobuf:"bytes,2,opt,name=msgID,proto3" json:"msgID,omitempty"` - MsgGroup string `protobuf:"bytes,3,opt,name=msgGroup,proto3" json:"msgGroup,omitempty"` - Timestamp uint64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MsgPosition) Reset() { *m = MsgPosition{} } -func (m *MsgPosition) String() string { return proto.CompactTextString(m) } -func (*MsgPosition) ProtoMessage() {} -func (*MsgPosition) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{29} -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *MsgPosition) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MsgPosition.Unmarshal(m, b) -} -func (m *MsgPosition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MsgPosition.Marshal(b, m, deterministic) + ChannelName string `protobuf:"bytes,1,opt,name=channel_name,json=channelName,proto3" json:"channel_name,omitempty"` + MsgID []byte `protobuf:"bytes,2,opt,name=msgID,proto3" json:"msgID,omitempty"` + MsgGroup string `protobuf:"bytes,3,opt,name=msgGroup,proto3" json:"msgGroup,omitempty"` + Timestamp uint64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } -func (m *MsgPosition) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgPosition.Merge(m, src) + +func (x *MsgPosition) Reset() { + *x = MsgPosition{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *MsgPosition) XXX_Size() int { - return xxx_messageInfo_MsgPosition.Size(m) + +func (x *MsgPosition) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *MsgPosition) XXX_DiscardUnknown() { - xxx_messageInfo_MsgPosition.DiscardUnknown(m) + +func (*MsgPosition) ProtoMessage() {} + +func (x *MsgPosition) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[31] + 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) } -var xxx_messageInfo_MsgPosition proto.InternalMessageInfo +// Deprecated: Use MsgPosition.ProtoReflect.Descriptor instead. +func (*MsgPosition) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{31} +} -func (m *MsgPosition) GetChannelName() string { - if m != nil { - return m.ChannelName +func (x *MsgPosition) GetChannelName() string { + if x != nil { + return x.ChannelName } return "" } -func (m *MsgPosition) GetMsgID() []byte { - if m != nil { - return m.MsgID +func (x *MsgPosition) GetMsgID() []byte { + if x != nil { + return x.MsgID } return nil } -func (m *MsgPosition) GetMsgGroup() string { - if m != nil { - return m.MsgGroup +func (x *MsgPosition) GetMsgGroup() string { + if x != nil { + return x.MsgGroup } return "" } -func (m *MsgPosition) GetTimestamp() uint64 { - if m != nil { - return m.Timestamp +func (x *MsgPosition) GetTimestamp() uint64 { + if x != nil { + return x.Timestamp } return 0 } type ChannelPosition struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Position string `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *ChannelPosition) Reset() { *m = ChannelPosition{} } -func (m *ChannelPosition) String() string { return proto.CompactTextString(m) } -func (*ChannelPosition) ProtoMessage() {} -func (*ChannelPosition) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{30} + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Position string `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` } -func (m *ChannelPosition) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ChannelPosition.Unmarshal(m, b) -} -func (m *ChannelPosition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ChannelPosition.Marshal(b, m, deterministic) -} -func (m *ChannelPosition) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChannelPosition.Merge(m, src) +func (x *ChannelPosition) Reset() { + *x = ChannelPosition{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *ChannelPosition) XXX_Size() int { - return xxx_messageInfo_ChannelPosition.Size(m) + +func (x *ChannelPosition) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ChannelPosition) XXX_DiscardUnknown() { - xxx_messageInfo_ChannelPosition.DiscardUnknown(m) + +func (*ChannelPosition) ProtoMessage() {} + +func (x *ChannelPosition) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[32] + 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) } -var xxx_messageInfo_ChannelPosition proto.InternalMessageInfo +// Deprecated: Use ChannelPosition.ProtoReflect.Descriptor instead. +func (*ChannelPosition) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{32} +} -func (m *ChannelPosition) GetName() string { - if m != nil { - return m.Name +func (x *ChannelPosition) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *ChannelPosition) GetPosition() string { - if m != nil { - return m.Position +func (x *ChannelPosition) GetPosition() string { + if x != nil { + return x.Position } return "" } type RoleEntity struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *RoleEntity) Reset() { *m = RoleEntity{} } -func (m *RoleEntity) String() string { return proto.CompactTextString(m) } -func (*RoleEntity) ProtoMessage() {} -func (*RoleEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{31} + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (m *RoleEntity) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RoleEntity.Unmarshal(m, b) -} -func (m *RoleEntity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RoleEntity.Marshal(b, m, deterministic) -} -func (m *RoleEntity) XXX_Merge(src proto.Message) { - xxx_messageInfo_RoleEntity.Merge(m, src) +func (x *RoleEntity) Reset() { + *x = RoleEntity{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RoleEntity) XXX_Size() int { - return xxx_messageInfo_RoleEntity.Size(m) + +func (x *RoleEntity) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RoleEntity) XXX_DiscardUnknown() { - xxx_messageInfo_RoleEntity.DiscardUnknown(m) + +func (*RoleEntity) ProtoMessage() {} + +func (x *RoleEntity) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[33] + 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) } -var xxx_messageInfo_RoleEntity proto.InternalMessageInfo +// Deprecated: Use RoleEntity.ProtoReflect.Descriptor instead. +func (*RoleEntity) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{33} +} -func (m *RoleEntity) GetName() string { - if m != nil { - return m.Name +func (x *RoleEntity) GetName() string { + if x != nil { + return x.Name } return "" } type UserEntity struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *UserEntity) Reset() { *m = UserEntity{} } -func (m *UserEntity) String() string { return proto.CompactTextString(m) } -func (*UserEntity) ProtoMessage() {} -func (*UserEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{32} + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (m *UserEntity) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UserEntity.Unmarshal(m, b) -} -func (m *UserEntity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UserEntity.Marshal(b, m, deterministic) -} -func (m *UserEntity) XXX_Merge(src proto.Message) { - xxx_messageInfo_UserEntity.Merge(m, src) +func (x *UserEntity) Reset() { + *x = UserEntity{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *UserEntity) XXX_Size() int { - return xxx_messageInfo_UserEntity.Size(m) + +func (x *UserEntity) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *UserEntity) XXX_DiscardUnknown() { - xxx_messageInfo_UserEntity.DiscardUnknown(m) + +func (*UserEntity) ProtoMessage() {} + +func (x *UserEntity) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[34] + 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) } -var xxx_messageInfo_UserEntity proto.InternalMessageInfo +// Deprecated: Use UserEntity.ProtoReflect.Descriptor instead. +func (*UserEntity) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{34} +} -func (m *UserEntity) GetName() string { - if m != nil { - return m.Name +func (x *UserEntity) GetName() string { + if x != nil { + return x.Name } return "" } type ObjectEntity struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *ObjectEntity) Reset() { *m = ObjectEntity{} } -func (m *ObjectEntity) String() string { return proto.CompactTextString(m) } -func (*ObjectEntity) ProtoMessage() {} -func (*ObjectEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{33} + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (m *ObjectEntity) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ObjectEntity.Unmarshal(m, b) -} -func (m *ObjectEntity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ObjectEntity.Marshal(b, m, deterministic) -} -func (m *ObjectEntity) XXX_Merge(src proto.Message) { - xxx_messageInfo_ObjectEntity.Merge(m, src) +func (x *ObjectEntity) Reset() { + *x = ObjectEntity{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *ObjectEntity) XXX_Size() int { - return xxx_messageInfo_ObjectEntity.Size(m) + +func (x *ObjectEntity) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ObjectEntity) XXX_DiscardUnknown() { - xxx_messageInfo_ObjectEntity.DiscardUnknown(m) + +func (*ObjectEntity) ProtoMessage() {} + +func (x *ObjectEntity) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[35] + 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) } -var xxx_messageInfo_ObjectEntity proto.InternalMessageInfo +// Deprecated: Use ObjectEntity.ProtoReflect.Descriptor instead. +func (*ObjectEntity) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{35} +} -func (m *ObjectEntity) GetName() string { - if m != nil { - return m.Name +func (x *ObjectEntity) GetName() string { + if x != nil { + return x.Name } return "" } type PrivilegeEntity struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *PrivilegeEntity) Reset() { *m = PrivilegeEntity{} } -func (m *PrivilegeEntity) String() string { return proto.CompactTextString(m) } -func (*PrivilegeEntity) ProtoMessage() {} -func (*PrivilegeEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{34} + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (m *PrivilegeEntity) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PrivilegeEntity.Unmarshal(m, b) -} -func (m *PrivilegeEntity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PrivilegeEntity.Marshal(b, m, deterministic) -} -func (m *PrivilegeEntity) XXX_Merge(src proto.Message) { - xxx_messageInfo_PrivilegeEntity.Merge(m, src) +func (x *PrivilegeEntity) Reset() { + *x = PrivilegeEntity{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *PrivilegeEntity) XXX_Size() int { - return xxx_messageInfo_PrivilegeEntity.Size(m) + +func (x *PrivilegeEntity) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *PrivilegeEntity) XXX_DiscardUnknown() { - xxx_messageInfo_PrivilegeEntity.DiscardUnknown(m) + +func (*PrivilegeEntity) ProtoMessage() {} + +func (x *PrivilegeEntity) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[36] + 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) } -var xxx_messageInfo_PrivilegeEntity proto.InternalMessageInfo +// Deprecated: Use PrivilegeEntity.ProtoReflect.Descriptor instead. +func (*PrivilegeEntity) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{36} +} -func (m *PrivilegeEntity) GetName() string { - if m != nil { - return m.Name +func (x *PrivilegeEntity) GetName() string { + if x != nil { + return x.Name } return "" } type GrantorEntity struct { - User *UserEntity `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` - Privilege *PrivilegeEntity `protobuf:"bytes,2,opt,name=privilege,proto3" json:"privilege,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *GrantorEntity) Reset() { *m = GrantorEntity{} } -func (m *GrantorEntity) String() string { return proto.CompactTextString(m) } -func (*GrantorEntity) ProtoMessage() {} -func (*GrantorEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{35} + User *UserEntity `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Privilege *PrivilegeEntity `protobuf:"bytes,2,opt,name=privilege,proto3" json:"privilege,omitempty"` } -func (m *GrantorEntity) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GrantorEntity.Unmarshal(m, b) -} -func (m *GrantorEntity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GrantorEntity.Marshal(b, m, deterministic) -} -func (m *GrantorEntity) XXX_Merge(src proto.Message) { - xxx_messageInfo_GrantorEntity.Merge(m, src) +func (x *GrantorEntity) Reset() { + *x = GrantorEntity{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GrantorEntity) XXX_Size() int { - return xxx_messageInfo_GrantorEntity.Size(m) + +func (x *GrantorEntity) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GrantorEntity) XXX_DiscardUnknown() { - xxx_messageInfo_GrantorEntity.DiscardUnknown(m) + +func (*GrantorEntity) ProtoMessage() {} + +func (x *GrantorEntity) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[37] + 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) } -var xxx_messageInfo_GrantorEntity proto.InternalMessageInfo +// Deprecated: Use GrantorEntity.ProtoReflect.Descriptor instead. +func (*GrantorEntity) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{37} +} -func (m *GrantorEntity) GetUser() *UserEntity { - if m != nil { - return m.User +func (x *GrantorEntity) GetUser() *UserEntity { + if x != nil { + return x.User } return nil } -func (m *GrantorEntity) GetPrivilege() *PrivilegeEntity { - if m != nil { - return m.Privilege +func (x *GrantorEntity) GetPrivilege() *PrivilegeEntity { + if x != nil { + return x.Privilege } return nil } type GrantPrivilegeEntity struct { - Entities []*GrantorEntity `protobuf:"bytes,1,rep,name=entities,proto3" json:"entities,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *GrantPrivilegeEntity) Reset() { *m = GrantPrivilegeEntity{} } -func (m *GrantPrivilegeEntity) String() string { return proto.CompactTextString(m) } -func (*GrantPrivilegeEntity) ProtoMessage() {} -func (*GrantPrivilegeEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{36} + Entities []*GrantorEntity `protobuf:"bytes,1,rep,name=entities,proto3" json:"entities,omitempty"` } -func (m *GrantPrivilegeEntity) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GrantPrivilegeEntity.Unmarshal(m, b) -} -func (m *GrantPrivilegeEntity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GrantPrivilegeEntity.Marshal(b, m, deterministic) -} -func (m *GrantPrivilegeEntity) XXX_Merge(src proto.Message) { - xxx_messageInfo_GrantPrivilegeEntity.Merge(m, src) +func (x *GrantPrivilegeEntity) Reset() { + *x = GrantPrivilegeEntity{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GrantPrivilegeEntity) XXX_Size() int { - return xxx_messageInfo_GrantPrivilegeEntity.Size(m) + +func (x *GrantPrivilegeEntity) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GrantPrivilegeEntity) XXX_DiscardUnknown() { - xxx_messageInfo_GrantPrivilegeEntity.DiscardUnknown(m) + +func (*GrantPrivilegeEntity) ProtoMessage() {} + +func (x *GrantPrivilegeEntity) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[38] + 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) } -var xxx_messageInfo_GrantPrivilegeEntity proto.InternalMessageInfo +// Deprecated: Use GrantPrivilegeEntity.ProtoReflect.Descriptor instead. +func (*GrantPrivilegeEntity) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{38} +} -func (m *GrantPrivilegeEntity) GetEntities() []*GrantorEntity { - if m != nil { - return m.Entities +func (x *GrantPrivilegeEntity) GetEntities() []*GrantorEntity { + if x != nil { + return x.Entities } return nil } type GrantEntity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // role Role *RoleEntity `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` // object @@ -3198,464 +3881,1666 @@ type GrantEntity struct { // privilege Grantor *GrantorEntity `protobuf:"bytes,4,opt,name=grantor,proto3" json:"grantor,omitempty"` // db name - DbName string `protobuf:"bytes,5,opt,name=db_name,json=dbName,proto3" json:"db_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + DbName string `protobuf:"bytes,5,opt,name=db_name,json=dbName,proto3" json:"db_name,omitempty"` } -func (m *GrantEntity) Reset() { *m = GrantEntity{} } -func (m *GrantEntity) String() string { return proto.CompactTextString(m) } -func (*GrantEntity) ProtoMessage() {} -func (*GrantEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{37} +func (x *GrantEntity) Reset() { + *x = GrantEntity{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GrantEntity) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GrantEntity.Unmarshal(m, b) -} -func (m *GrantEntity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GrantEntity.Marshal(b, m, deterministic) -} -func (m *GrantEntity) XXX_Merge(src proto.Message) { - xxx_messageInfo_GrantEntity.Merge(m, src) +func (x *GrantEntity) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GrantEntity) XXX_Size() int { - return xxx_messageInfo_GrantEntity.Size(m) -} -func (m *GrantEntity) XXX_DiscardUnknown() { - xxx_messageInfo_GrantEntity.DiscardUnknown(m) + +func (*GrantEntity) ProtoMessage() {} + +func (x *GrantEntity) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[39] + 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) } -var xxx_messageInfo_GrantEntity proto.InternalMessageInfo +// Deprecated: Use GrantEntity.ProtoReflect.Descriptor instead. +func (*GrantEntity) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{39} +} -func (m *GrantEntity) GetRole() *RoleEntity { - if m != nil { - return m.Role +func (x *GrantEntity) GetRole() *RoleEntity { + if x != nil { + return x.Role } return nil } -func (m *GrantEntity) GetObject() *ObjectEntity { - if m != nil { - return m.Object +func (x *GrantEntity) GetObject() *ObjectEntity { + if x != nil { + return x.Object } return nil } -func (m *GrantEntity) GetObjectName() string { - if m != nil { - return m.ObjectName +func (x *GrantEntity) GetObjectName() string { + if x != nil { + return x.ObjectName } return "" } -func (m *GrantEntity) GetGrantor() *GrantorEntity { - if m != nil { - return m.Grantor +func (x *GrantEntity) GetGrantor() *GrantorEntity { + if x != nil { + return x.Grantor } return nil } -func (m *GrantEntity) GetDbName() string { - if m != nil { - return m.DbName +func (x *GrantEntity) GetDbName() string { + if x != nil { + return x.DbName } return "" } type UserInfo struct { - User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` - Roles []*RoleEntity `protobuf:"bytes,3,rep,name=roles,proto3" json:"roles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *UserInfo) Reset() { *m = UserInfo{} } -func (m *UserInfo) String() string { return proto.CompactTextString(m) } -func (*UserInfo) ProtoMessage() {} -func (*UserInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{38} + User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + Roles []*RoleEntity `protobuf:"bytes,3,rep,name=roles,proto3" json:"roles,omitempty"` } -func (m *UserInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UserInfo.Unmarshal(m, b) -} -func (m *UserInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UserInfo.Marshal(b, m, deterministic) -} -func (m *UserInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_UserInfo.Merge(m, src) +func (x *UserInfo) Reset() { + *x = UserInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *UserInfo) XXX_Size() int { - return xxx_messageInfo_UserInfo.Size(m) + +func (x *UserInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *UserInfo) XXX_DiscardUnknown() { - xxx_messageInfo_UserInfo.DiscardUnknown(m) + +func (*UserInfo) ProtoMessage() {} + +func (x *UserInfo) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[40] + 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) } -var xxx_messageInfo_UserInfo proto.InternalMessageInfo +// Deprecated: Use UserInfo.ProtoReflect.Descriptor instead. +func (*UserInfo) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{40} +} -func (m *UserInfo) GetUser() string { - if m != nil { - return m.User +func (x *UserInfo) GetUser() string { + if x != nil { + return x.User } return "" } -func (m *UserInfo) GetPassword() string { - if m != nil { - return m.Password +func (x *UserInfo) GetPassword() string { + if x != nil { + return x.Password } return "" } -func (m *UserInfo) GetRoles() []*RoleEntity { - if m != nil { - return m.Roles +func (x *UserInfo) GetRoles() []*RoleEntity { + if x != nil { + return x.Roles } return nil } type RBACMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // user Users []*UserInfo `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` // role Roles []*RoleEntity `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` // (role, object, previledge) - Grants []*GrantEntity `protobuf:"bytes,3,rep,name=grants,proto3" json:"grants,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Grants []*GrantEntity `protobuf:"bytes,3,rep,name=grants,proto3" json:"grants,omitempty"` } -func (m *RBACMeta) Reset() { *m = RBACMeta{} } -func (m *RBACMeta) String() string { return proto.CompactTextString(m) } -func (*RBACMeta) ProtoMessage() {} -func (*RBACMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{39} +func (x *RBACMeta) Reset() { + *x = RBACMeta{} + if protoimpl.UnsafeEnabled { + mi := &file_backup_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RBACMeta) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RBACMeta.Unmarshal(m, b) -} -func (m *RBACMeta) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RBACMeta.Marshal(b, m, deterministic) -} -func (m *RBACMeta) XXX_Merge(src proto.Message) { - xxx_messageInfo_RBACMeta.Merge(m, src) +func (x *RBACMeta) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RBACMeta) XXX_Size() int { - return xxx_messageInfo_RBACMeta.Size(m) -} -func (m *RBACMeta) XXX_DiscardUnknown() { - xxx_messageInfo_RBACMeta.DiscardUnknown(m) + +func (*RBACMeta) ProtoMessage() {} + +func (x *RBACMeta) ProtoReflect() protoreflect.Message { + mi := &file_backup_proto_msgTypes[41] + 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) } -var xxx_messageInfo_RBACMeta proto.InternalMessageInfo +// Deprecated: Use RBACMeta.ProtoReflect.Descriptor instead. +func (*RBACMeta) Descriptor() ([]byte, []int) { + return file_backup_proto_rawDescGZIP(), []int{41} +} -func (m *RBACMeta) GetUsers() []*UserInfo { - if m != nil { - return m.Users +func (x *RBACMeta) GetUsers() []*UserInfo { + if x != nil { + return x.Users } return nil } -func (m *RBACMeta) GetRoles() []*RoleEntity { - if m != nil { - return m.Roles +func (x *RBACMeta) GetRoles() []*RoleEntity { + if x != nil { + return x.Roles } return nil } -func (m *RBACMeta) GetGrants() []*GrantEntity { - if m != nil { - return m.Grants +func (x *RBACMeta) GetGrants() []*GrantEntity { + if x != nil { + return x.Grants } return nil } -func init() { - proto.RegisterEnum("milvus.proto.backup.ResponseCode", ResponseCode_name, ResponseCode_value) - proto.RegisterEnum("milvus.proto.backup.BackupTaskStateCode", BackupTaskStateCode_name, BackupTaskStateCode_value) - proto.RegisterEnum("milvus.proto.backup.RestoreTaskStateCode", RestoreTaskStateCode_name, RestoreTaskStateCode_value) - proto.RegisterEnum("milvus.proto.backup.ConsistencyLevel", ConsistencyLevel_name, ConsistencyLevel_value) - proto.RegisterEnum("milvus.proto.backup.DataType", DataType_name, DataType_value) - proto.RegisterEnum("milvus.proto.backup.FieldState", FieldState_name, FieldState_value) - proto.RegisterType((*IndexInfo)(nil), "milvus.proto.backup.IndexInfo") - proto.RegisterMapType((map[string]string)(nil), "milvus.proto.backup.IndexInfo.ParamsEntry") - proto.RegisterType((*CollectionBackupInfo)(nil), "milvus.proto.backup.CollectionBackupInfo") - proto.RegisterMapType((map[string]string)(nil), "milvus.proto.backup.CollectionBackupInfo.ChannelCheckpointsEntry") - proto.RegisterType((*PartitionBackupInfo)(nil), "milvus.proto.backup.PartitionBackupInfo") - proto.RegisterType((*SegmentBackupInfo)(nil), "milvus.proto.backup.SegmentBackupInfo") - proto.RegisterType((*BackupInfo)(nil), "milvus.proto.backup.BackupInfo") - proto.RegisterType((*CollectionLevelBackupInfo)(nil), "milvus.proto.backup.CollectionLevelBackupInfo") - proto.RegisterType((*PartitionLevelBackupInfo)(nil), "milvus.proto.backup.PartitionLevelBackupInfo") - proto.RegisterType((*SegmentLevelBackupInfo)(nil), "milvus.proto.backup.SegmentLevelBackupInfo") - proto.RegisterType((*CreateBackupRequest)(nil), "milvus.proto.backup.CreateBackupRequest") - proto.RegisterType((*BackupInfoResponse)(nil), "milvus.proto.backup.BackupInfoResponse") - proto.RegisterType((*GetBackupRequest)(nil), "milvus.proto.backup.GetBackupRequest") - proto.RegisterType((*ListBackupsRequest)(nil), "milvus.proto.backup.ListBackupsRequest") - proto.RegisterType((*ListBackupsResponse)(nil), "milvus.proto.backup.ListBackupsResponse") - proto.RegisterType((*DeleteBackupRequest)(nil), "milvus.proto.backup.DeleteBackupRequest") - proto.RegisterType((*DeleteBackupResponse)(nil), "milvus.proto.backup.DeleteBackupResponse") - proto.RegisterType((*RestoreBackupRequest)(nil), "milvus.proto.backup.RestoreBackupRequest") - proto.RegisterMapType((map[string]string)(nil), "milvus.proto.backup.RestoreBackupRequest.CollectionRenamesEntry") - proto.RegisterType((*RestorePartitionTask)(nil), "milvus.proto.backup.RestorePartitionTask") - proto.RegisterType((*RestoreCollectionTask)(nil), "milvus.proto.backup.RestoreCollectionTask") - proto.RegisterType((*RestoreBackupTask)(nil), "milvus.proto.backup.RestoreBackupTask") - proto.RegisterType((*RestoreBackupResponse)(nil), "milvus.proto.backup.RestoreBackupResponse") - proto.RegisterType((*GetRestoreStateRequest)(nil), "milvus.proto.backup.GetRestoreStateRequest") - proto.RegisterType((*FieldBinlog)(nil), "milvus.proto.backup.FieldBinlog") - proto.RegisterType((*Binlog)(nil), "milvus.proto.backup.Binlog") - proto.RegisterType((*KeyValuePair)(nil), "milvus.proto.backup.KeyValuePair") - proto.RegisterType((*ValueField)(nil), "milvus.proto.backup.ValueField") - proto.RegisterType((*FieldSchema)(nil), "milvus.proto.backup.FieldSchema") - proto.RegisterType((*CollectionSchema)(nil), "milvus.proto.backup.CollectionSchema") - proto.RegisterType((*CheckRequest)(nil), "milvus.proto.backup.CheckRequest") - proto.RegisterType((*CheckResponse)(nil), "milvus.proto.backup.CheckResponse") - proto.RegisterType((*MsgPosition)(nil), "milvus.proto.backup.MsgPosition") - proto.RegisterType((*ChannelPosition)(nil), "milvus.proto.backup.ChannelPosition") - proto.RegisterType((*RoleEntity)(nil), "milvus.proto.backup.RoleEntity") - proto.RegisterType((*UserEntity)(nil), "milvus.proto.backup.UserEntity") - proto.RegisterType((*ObjectEntity)(nil), "milvus.proto.backup.ObjectEntity") - proto.RegisterType((*PrivilegeEntity)(nil), "milvus.proto.backup.PrivilegeEntity") - proto.RegisterType((*GrantorEntity)(nil), "milvus.proto.backup.GrantorEntity") - proto.RegisterType((*GrantPrivilegeEntity)(nil), "milvus.proto.backup.GrantPrivilegeEntity") - proto.RegisterType((*GrantEntity)(nil), "milvus.proto.backup.GrantEntity") - proto.RegisterType((*UserInfo)(nil), "milvus.proto.backup.UserInfo") - proto.RegisterType((*RBACMeta)(nil), "milvus.proto.backup.RBACMeta") -} - -func init() { proto.RegisterFile("backup.proto", fileDescriptor_65240d19de191688) } - -var fileDescriptor_65240d19de191688 = []byte{ - // 3420 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, - 0x72, 0xc4, 0x37, 0xd0, 0x0b, 0x80, 0xcb, 0x21, 0x45, 0x41, 0xd4, 0xd3, 0x13, 0xb5, 0xb1, 0xf4, - 0x28, 0xbd, 0x0a, 0xa5, 0x47, 0x3d, 0x2b, 0xb6, 0xea, 0x3d, 0x3f, 0xf3, 0x4b, 0x12, 0x6c, 0x89, - 0x62, 0x96, 0x14, 0x4b, 0xe5, 0x7c, 0x6c, 0x2d, 0x76, 0x87, 0xe0, 0x86, 0x8b, 0x1d, 0x78, 0x67, - 0x21, 0x09, 0xaa, 0x4a, 0x2a, 0xb7, 0xf8, 0x98, 0x43, 0xaa, 0x52, 0x95, 0x7f, 0x90, 0x9b, 0x73, - 0x70, 0x0e, 0xf9, 0x07, 0x49, 0xe5, 0x9a, 0x3f, 0x90, 0x4b, 0x8e, 0x3e, 0xa5, 0x72, 0x4d, 0x4d, - 0xcf, 0xec, 0x07, 0xc0, 0x25, 0x05, 0xa6, 0x5c, 0x71, 0x9c, 0xdb, 0x4e, 0x4f, 0x77, 0x4f, 0x4f, - 0x7f, 0x4d, 0xcf, 0xf4, 0x42, 0xb3, 0x67, 0x3b, 0xa7, 0xa3, 0xe1, 0xfa, 0x30, 0x64, 0x11, 0x23, - 0x8b, 0x03, 0xcf, 0x7f, 0x33, 0xe2, 0x72, 0xb4, 0x2e, 0xa7, 0x56, 0x7e, 0xd6, 0x67, 0xac, 0xef, - 0xd3, 0xfb, 0x08, 0xec, 0x8d, 0x8e, 0xef, 0xf3, 0x28, 0x1c, 0x39, 0x91, 0x44, 0x32, 0xfe, 0xa3, - 0x00, 0x8d, 0x6e, 0xe0, 0xd2, 0x77, 0xdd, 0xe0, 0x98, 0x91, 0x1b, 0x00, 0xc7, 0x1e, 0xf5, 0x5d, - 0x2b, 0xb0, 0x07, 0xb4, 0x53, 0x58, 0x2d, 0xac, 0x35, 0xcc, 0x06, 0x42, 0xf6, 0xec, 0x01, 0x15, - 0xd3, 0x9e, 0xc0, 0x95, 0xd3, 0x45, 0x39, 0x8d, 0x90, 0xc9, 0xe9, 0x68, 0x3c, 0xa4, 0x9d, 0x52, - 0x66, 0xfa, 0x70, 0x3c, 0xa4, 0x64, 0x0b, 0xaa, 0x43, 0x3b, 0xb4, 0x07, 0xbc, 0x53, 0x5e, 0x2d, - 0xad, 0x69, 0x1b, 0xf7, 0xd6, 0x73, 0xc4, 0x5d, 0x4f, 0x84, 0x59, 0xdf, 0x47, 0xe4, 0xdd, 0x20, - 0x0a, 0xc7, 0xa6, 0xa2, 0x5c, 0xf9, 0x14, 0xb4, 0x0c, 0x98, 0xe8, 0x50, 0x3a, 0xa5, 0x63, 0x25, - 0xa8, 0xf8, 0x24, 0x4b, 0x50, 0x79, 0x63, 0xfb, 0xa3, 0x58, 0x3a, 0x39, 0x78, 0x5c, 0xfc, 0xa4, - 0x60, 0xfc, 0x5b, 0x1d, 0x96, 0xb6, 0x99, 0xef, 0x53, 0x27, 0xf2, 0x58, 0xb0, 0x85, 0xab, 0xe1, - 0xa6, 0xdb, 0x50, 0xf4, 0x5c, 0xc5, 0xa3, 0xe8, 0xb9, 0xe4, 0x29, 0x00, 0x8f, 0xec, 0x88, 0x5a, - 0x0e, 0x73, 0x25, 0x9f, 0xf6, 0xc6, 0x5a, 0xae, 0xac, 0x92, 0xc9, 0xa1, 0xcd, 0x4f, 0x0f, 0x04, - 0xc1, 0x36, 0x73, 0xa9, 0xd9, 0xe0, 0xf1, 0x27, 0x31, 0xa0, 0x49, 0xc3, 0x90, 0x85, 0x2f, 0x28, - 0xe7, 0x76, 0x3f, 0xd6, 0xc8, 0x04, 0x4c, 0xe8, 0x8c, 0x47, 0x76, 0x18, 0x59, 0x91, 0x37, 0xa0, - 0x9d, 0xf2, 0x6a, 0x61, 0xad, 0x84, 0x2c, 0xc2, 0xe8, 0xd0, 0x1b, 0x50, 0x72, 0x0d, 0xea, 0x34, - 0x70, 0xe5, 0x64, 0x05, 0x27, 0x6b, 0x34, 0x70, 0x71, 0x6a, 0x05, 0xea, 0xc3, 0x90, 0xf5, 0x43, - 0xca, 0x79, 0xa7, 0xba, 0x5a, 0x58, 0xab, 0x98, 0xc9, 0x98, 0xfc, 0x1e, 0xb4, 0x9c, 0x64, 0xab, - 0x96, 0xe7, 0x76, 0x6a, 0x48, 0xdb, 0x4c, 0x81, 0x5d, 0x97, 0x5c, 0x85, 0x9a, 0xdb, 0x93, 0xa6, - 0xac, 0xa3, 0x64, 0x55, 0xb7, 0x87, 0x76, 0xfc, 0x05, 0xcc, 0x67, 0xa8, 0x11, 0xa1, 0x81, 0x08, - 0xed, 0x14, 0x8c, 0x88, 0xbf, 0x85, 0x2a, 0x77, 0x4e, 0xe8, 0xc0, 0xee, 0xc0, 0x6a, 0x61, 0x4d, - 0xdb, 0xb8, 0x9d, 0xab, 0xa5, 0x54, 0xe9, 0x07, 0x88, 0x6c, 0x2a, 0x22, 0xdc, 0xfb, 0x89, 0x1d, - 0xba, 0xdc, 0x0a, 0x46, 0x83, 0x8e, 0x86, 0x7b, 0x68, 0x48, 0xc8, 0xde, 0x68, 0x40, 0x4c, 0x58, - 0x70, 0x58, 0xc0, 0x3d, 0x1e, 0xd1, 0xc0, 0x19, 0x5b, 0x3e, 0x7d, 0x43, 0xfd, 0x4e, 0x13, 0xcd, - 0x71, 0xde, 0x42, 0x09, 0xf6, 0x73, 0x81, 0x6c, 0xea, 0xce, 0x14, 0x84, 0xbc, 0x82, 0x85, 0xa1, - 0x1d, 0x46, 0x1e, 0xee, 0x4c, 0x92, 0xf1, 0x4e, 0x0b, 0xdd, 0x31, 0xdf, 0xc4, 0xfb, 0x31, 0x76, - 0xea, 0x30, 0xa6, 0x3e, 0x9c, 0x04, 0x72, 0x72, 0x17, 0x74, 0x89, 0x8f, 0x96, 0xe2, 0x91, 0x3d, - 0x18, 0x76, 0xda, 0xab, 0x85, 0xb5, 0xb2, 0x39, 0x2f, 0xe1, 0x87, 0x31, 0x98, 0x10, 0x28, 0x73, - 0xef, 0x3d, 0xed, 0xcc, 0xa3, 0x45, 0xf0, 0x9b, 0x5c, 0x87, 0xc6, 0x89, 0xcd, 0x2d, 0x0c, 0x95, - 0x8e, 0xbe, 0x5a, 0x58, 0xab, 0x9b, 0xf5, 0x13, 0x9b, 0x63, 0x28, 0x90, 0xdf, 0x81, 0x26, 0xa3, - 0xca, 0x0b, 0x8e, 0x19, 0xef, 0x2c, 0xa0, 0xb0, 0x3f, 0xbf, 0x38, 0x76, 0x4c, 0x19, 0x88, 0xe2, - 0x93, 0x0b, 0x35, 0xfb, 0xcc, 0x76, 0x2d, 0x74, 0xcc, 0x0e, 0x91, 0x61, 0x29, 0x20, 0xe8, 0xb4, - 0xe4, 0x31, 0x5c, 0x53, 0xb2, 0x0f, 0x4f, 0xc6, 0xdc, 0x73, 0x6c, 0x3f, 0xb3, 0x89, 0x45, 0xdc, - 0xc4, 0x55, 0x89, 0xb0, 0xaf, 0xe6, 0xd3, 0xcd, 0x84, 0xb0, 0xe8, 0x9c, 0xd8, 0x41, 0x40, 0x7d, - 0xcb, 0x39, 0xa1, 0xce, 0xe9, 0x90, 0x79, 0x41, 0xc4, 0x3b, 0x4b, 0x28, 0xe3, 0xe6, 0x07, 0xbc, - 0x21, 0xd5, 0xe8, 0xfa, 0xb6, 0x64, 0xb2, 0x9d, 0xf2, 0x90, 0x61, 0x4f, 0x9c, 0x33, 0x13, 0xe4, - 0x29, 0x68, 0xfe, 0x03, 0x8b, 0xd3, 0xfe, 0x80, 0x8a, 0xb5, 0xae, 0xe0, 0x5a, 0x77, 0x72, 0xd7, - 0x3a, 0x90, 0x48, 0x19, 0xd3, 0x81, 0xff, 0x40, 0x01, 0xf9, 0xca, 0x2e, 0x5c, 0x3d, 0x67, 0xdd, - 0x4b, 0xe5, 0x95, 0x6f, 0x8a, 0xb0, 0x98, 0xe3, 0x25, 0xe4, 0x16, 0x34, 0x53, 0x57, 0x53, 0x09, - 0xa6, 0x64, 0x6a, 0x09, 0xac, 0xeb, 0x92, 0xdb, 0xd0, 0x4e, 0x51, 0x32, 0x39, 0xb5, 0x95, 0x40, - 0x31, 0xcc, 0xce, 0x44, 0x73, 0x29, 0x27, 0x9a, 0x5f, 0xc2, 0xbc, 0xd2, 0x49, 0xe2, 0xd7, 0xe5, - 0x4b, 0xa9, 0xa6, 0xcd, 0xb3, 0x20, 0x9e, 0x38, 0x6a, 0x25, 0xe3, 0xa8, 0x93, 0xae, 0x54, 0x9d, - 0x72, 0x25, 0xe3, 0x1f, 0x4b, 0xb0, 0x70, 0x86, 0x31, 0x86, 0xb9, 0x92, 0x2c, 0x51, 0x43, 0x43, - 0x41, 0xba, 0xee, 0xd9, 0xdd, 0x15, 0x73, 0x76, 0x37, 0xad, 0xcc, 0xd2, 0x59, 0x65, 0xfe, 0x1c, - 0xb4, 0x60, 0x34, 0xb0, 0xd8, 0xb1, 0x15, 0xb2, 0xb7, 0x3c, 0x4e, 0xa5, 0xc1, 0x68, 0xf0, 0xf2, - 0xd8, 0x64, 0x6f, 0x39, 0x79, 0x0c, 0xb5, 0x9e, 0x17, 0xf8, 0xac, 0xcf, 0x3b, 0x15, 0x54, 0xcc, - 0x6a, 0xae, 0x62, 0x9e, 0x88, 0xd3, 0x6e, 0x0b, 0x11, 0xcd, 0x98, 0x80, 0x7c, 0x06, 0x98, 0xd6, - 0x39, 0x52, 0x57, 0x67, 0xa4, 0x4e, 0x49, 0x04, 0xbd, 0x4b, 0xfd, 0xc8, 0x46, 0xfa, 0xda, 0xac, - 0xf4, 0x09, 0x49, 0x62, 0x8b, 0x7a, 0xc6, 0x16, 0xd7, 0xa0, 0xde, 0x0f, 0xd9, 0x68, 0x28, 0xd4, - 0xd1, 0x90, 0x47, 0x03, 0x8e, 0xbb, 0xae, 0x38, 0x1a, 0x24, 0x3f, 0xea, 0x62, 0x66, 0xae, 0x9b, - 0xc9, 0x98, 0x2c, 0x42, 0xc5, 0xe3, 0x96, 0xff, 0x00, 0xf3, 0x6d, 0xdd, 0x2c, 0x7b, 0xfc, 0xf9, - 0x03, 0xe3, 0xfb, 0x12, 0xc0, 0xff, 0xef, 0x13, 0x91, 0x40, 0x19, 0x03, 0xac, 0x86, 0x2b, 0xe2, - 0x77, 0x6e, 0xd6, 0xae, 0xe7, 0x67, 0xed, 0xd7, 0x40, 0x32, 0x4e, 0x1a, 0x07, 0x58, 0x03, 0x2d, - 0x79, 0x77, 0xe6, 0x3c, 0x67, 0x2e, 0x38, 0x53, 0xd0, 0xd4, 0xb4, 0x90, 0x31, 0xed, 0x6d, 0x68, - 0x4b, 0x96, 0xd6, 0x1b, 0x1a, 0x72, 0x8f, 0x05, 0x68, 0xac, 0x86, 0xd9, 0x92, 0xd0, 0x23, 0x09, - 0x24, 0x8f, 0xa1, 0x11, 0xf6, 0x6c, 0xc7, 0x1a, 0xd0, 0xc8, 0xc6, 0x83, 0x51, 0xdb, 0xb8, 0x91, - 0x2b, 0x8b, 0xb9, 0xb5, 0xb9, 0xfd, 0x82, 0x46, 0xb6, 0x59, 0x17, 0xf8, 0xe2, 0xcb, 0xf8, 0x63, - 0xb8, 0x96, 0x4a, 0x88, 0x67, 0x63, 0xc6, 0xfe, 0xbf, 0x83, 0x8a, 0x3c, 0x6c, 0x0a, 0x97, 0xdd, - 0xa0, 0xa4, 0x33, 0xbe, 0x82, 0x4e, 0x92, 0x12, 0xa7, 0x99, 0x7f, 0x36, 0xc9, 0x7c, 0xf6, 0x63, - 0x57, 0xf1, 0x3e, 0x82, 0x65, 0x95, 0x63, 0xa6, 0x39, 0xff, 0x66, 0x92, 0xf3, 0xac, 0x89, 0x4f, - 0xf1, 0xfd, 0xdb, 0x12, 0x2c, 0x6e, 0x87, 0xd4, 0x8e, 0xa8, 0x9c, 0x33, 0xe9, 0xd7, 0x23, 0xca, - 0x23, 0xf2, 0x33, 0x68, 0x84, 0xf2, 0xb3, 0x1b, 0xc7, 0x44, 0x0a, 0x20, 0x37, 0x41, 0x53, 0x3e, - 0x94, 0xc9, 0xdf, 0x20, 0x41, 0x7b, 0xca, 0xc9, 0xa6, 0x8a, 0x29, 0xde, 0x29, 0xad, 0x96, 0xd6, - 0x1a, 0xe6, 0xfc, 0x64, 0x35, 0xc5, 0xc5, 0x19, 0x63, 0xf3, 0x71, 0xe0, 0xa0, 0xd3, 0xd7, 0x4d, - 0x39, 0x20, 0xbf, 0x85, 0xb6, 0xdb, 0xb3, 0x52, 0x5c, 0x8e, 0x6e, 0xaf, 0x6d, 0x2c, 0xaf, 0xcb, - 0xc2, 0x7e, 0x3d, 0x2e, 0xec, 0xd7, 0x8f, 0xc4, 0x99, 0x64, 0xb6, 0xdc, 0x5e, 0x6a, 0x1a, 0x64, - 0x7a, 0xcc, 0x42, 0x47, 0x66, 0xeb, 0xba, 0x29, 0x07, 0xa2, 0xe2, 0x10, 0x5e, 0x63, 0xb1, 0xc0, - 0x1f, 0x63, 0x4c, 0xd4, 0xcd, 0xba, 0x00, 0xbc, 0x0c, 0xfc, 0x31, 0xb9, 0x03, 0xf3, 0x7d, 0xc7, - 0x1a, 0xda, 0x23, 0x4e, 0x2d, 0x1a, 0xd8, 0x3d, 0x5f, 0x26, 0x9e, 0xba, 0xd9, 0xea, 0x3b, 0xfb, - 0x02, 0xba, 0x8b, 0x40, 0xb2, 0x06, 0x7a, 0x82, 0xc7, 0xa9, 0xc3, 0x02, 0x97, 0x63, 0x26, 0xaa, - 0x98, 0x6d, 0x85, 0x78, 0x20, 0xa1, 0x13, 0x98, 0xb6, 0xeb, 0x62, 0x84, 0x82, 0x2c, 0x29, 0x15, - 0xe6, 0xa6, 0x84, 0x8a, 0x70, 0x10, 0x3e, 0x1a, 0x67, 0x27, 0xf1, 0x6d, 0x7c, 0x5b, 0x00, 0x92, - 0xb1, 0x17, 0xe5, 0x43, 0x16, 0x70, 0xfa, 0x01, 0xc3, 0x7c, 0x0c, 0xe5, 0x4c, 0xb6, 0xba, 0x95, - 0x1f, 0x17, 0x8a, 0x15, 0xa6, 0x29, 0x44, 0x17, 0x27, 0xff, 0x80, 0xf7, 0x55, 0x62, 0x12, 0x9f, - 0xe4, 0x21, 0x94, 0x5d, 0x3b, 0xb2, 0xd1, 0x28, 0xda, 0xc6, 0xcd, 0x0b, 0xd2, 0x1e, 0x4a, 0x87, - 0xc8, 0xc6, 0xbf, 0x14, 0x40, 0x7f, 0x4a, 0xa3, 0x1f, 0xd4, 0x93, 0xae, 0x43, 0x43, 0x21, 0xa8, - 0x03, 0xb0, 0x11, 0xa7, 0x75, 0x45, 0x3d, 0x72, 0x4e, 0x69, 0x24, 0xa9, 0xcb, 0x8a, 0x1a, 0x41, - 0x48, 0x4d, 0xa0, 0x3c, 0xb4, 0xa3, 0x13, 0x74, 0x9e, 0x86, 0x89, 0xdf, 0x22, 0xcf, 0xbc, 0xf5, - 0xa2, 0x13, 0x36, 0x8a, 0x2c, 0x97, 0x46, 0xb6, 0xe7, 0x2b, 0x27, 0x69, 0x29, 0xe8, 0x0e, 0x02, - 0x8d, 0x3f, 0x02, 0xf2, 0xdc, 0xe3, 0x71, 0x61, 0x30, 0xdb, 0x6e, 0x72, 0xee, 0x10, 0xc5, 0xbc, - 0x3b, 0x84, 0xf1, 0x0f, 0x05, 0x58, 0x9c, 0xe0, 0xfe, 0x63, 0x59, 0xb7, 0x34, 0xbb, 0x75, 0x0f, - 0x61, 0x71, 0x87, 0xfa, 0xf4, 0x87, 0xcd, 0x14, 0xc6, 0x9f, 0xc3, 0xd2, 0x24, 0xd7, 0xff, 0x55, - 0x4d, 0x18, 0xff, 0x5e, 0x85, 0x25, 0x93, 0xf2, 0x88, 0x85, 0x3f, 0x5a, 0x02, 0xfc, 0x25, 0x64, - 0x0e, 0x48, 0x8b, 0x8f, 0x8e, 0x8f, 0xbd, 0x77, 0xca, 0x95, 0x33, 0x3c, 0x0e, 0x10, 0x4e, 0xd8, - 0xc4, 0x91, 0x1c, 0x52, 0xc9, 0x59, 0x96, 0x76, 0x9f, 0x9f, 0xa7, 0x86, 0x33, 0xbb, 0xcb, 0x1c, - 0x63, 0xa6, 0x64, 0x21, 0x6f, 0x1e, 0x19, 0x41, 0x14, 0x3c, 0x4d, 0xcf, 0xd5, 0x6c, 0x7a, 0x9e, - 0x0a, 0xbc, 0xda, 0xb9, 0x81, 0x57, 0xcf, 0x04, 0xde, 0xd9, 0x9c, 0xde, 0xb8, 0x4c, 0x4e, 0x5f, - 0x81, 0x24, 0x59, 0xc7, 0xf5, 0x5d, 0x92, 0xbc, 0x0d, 0x68, 0x86, 0x72, 0x9f, 0x78, 0x1b, 0x54, - 0x89, 0x74, 0x02, 0x26, 0x70, 0x44, 0xca, 0x1d, 0x45, 0x4c, 0xe2, 0x34, 0x25, 0x4e, 0x16, 0x46, - 0x1e, 0xc0, 0xa2, 0x1b, 0xb2, 0xe1, 0xee, 0x3b, 0x8f, 0x47, 0xe9, 0xda, 0x9d, 0x16, 0xa2, 0xe6, - 0x4d, 0x91, 0x3b, 0xd0, 0x4e, 0xc0, 0x92, 0x6f, 0x1b, 0x91, 0xa7, 0xa0, 0x64, 0x03, 0x96, 0xf8, - 0xa9, 0x37, 0x94, 0x67, 0x6d, 0x86, 0xf5, 0x3c, 0x62, 0xe7, 0xce, 0xa9, 0x8a, 0x54, 0x4f, 0x2a, - 0xd2, 0xc7, 0xd0, 0x11, 0x78, 0xdd, 0xc1, 0x90, 0x85, 0xd1, 0x8e, 0xc7, 0x4f, 0xff, 0x70, 0xc4, - 0x22, 0x1b, 0xef, 0x71, 0x9d, 0x05, 0xe4, 0x73, 0xee, 0x7c, 0x72, 0xc4, 0x90, 0xf4, 0x88, 0x21, - 0xab, 0xa0, 0x0d, 0xec, 0x77, 0x07, 0x27, 0x76, 0xe8, 0xee, 0x8d, 0x06, 0x78, 0xed, 0xad, 0x98, - 0x59, 0xd0, 0xca, 0x0e, 0x2c, 0xe7, 0xbb, 0xca, 0xa5, 0x2e, 0x8b, 0xdf, 0x15, 0x93, 0x20, 0x4b, - 0x4a, 0x1c, 0x51, 0x2d, 0x9f, 0x29, 0xb9, 0x9f, 0xe5, 0x94, 0xdc, 0x77, 0x2f, 0xf2, 0xea, 0xff, - 0x83, 0x35, 0x77, 0x17, 0xf0, 0x82, 0xa6, 0xca, 0x65, 0x0c, 0x8d, 0xcb, 0xd4, 0x7b, 0x20, 0x88, - 0xe5, 0xd8, 0xf8, 0xab, 0x1a, 0x5c, 0x51, 0x1b, 0x4d, 0xad, 0xf0, 0x93, 0x56, 0xdc, 0x17, 0xa0, - 0x89, 0xf8, 0x8f, 0x95, 0x53, 0x45, 0xe5, 0x5c, 0xa2, 0xd2, 0x06, 0x41, 0x2d, 0xc7, 0xe4, 0xd7, - 0xb0, 0x1c, 0xd9, 0x61, 0x9f, 0x46, 0xd6, 0xf4, 0x99, 0x2b, 0xd3, 0xd1, 0x92, 0x9c, 0xdd, 0x9e, - 0x7c, 0xbd, 0xb3, 0xe1, 0x6a, 0x7a, 0xa7, 0x56, 0xf9, 0xc1, 0x8a, 0x6c, 0x7e, 0xca, 0x3b, 0xf5, - 0x0b, 0xea, 0xfe, 0x3c, 0xf7, 0x35, 0xaf, 0x24, 0x9c, 0x32, 0x5a, 0xc5, 0x77, 0x48, 0xc5, 0xd8, - 0xb5, 0xf0, 0x96, 0x23, 0x2f, 0xaa, 0x71, 0x36, 0x72, 0x0f, 0xc4, 0x6d, 0xe7, 0x0e, 0xcc, 0x47, - 0x2c, 0x11, 0x20, 0x73, 0x19, 0x6a, 0x45, 0x4c, 0x71, 0x43, 0xbc, 0xac, 0xab, 0x69, 0x53, 0xae, - 0xf6, 0x11, 0xb4, 0x95, 0x06, 0xe2, 0x27, 0xcd, 0xa6, 0xb4, 0x96, 0x84, 0xee, 0xc8, 0x87, 0xcd, - 0x6c, 0xde, 0x6c, 0x7d, 0x20, 0x6f, 0xb6, 0x67, 0xc8, 0x9b, 0xf3, 0xb3, 0xe7, 0x4d, 0xfd, 0x32, - 0x79, 0x73, 0xe1, 0x52, 0x79, 0x93, 0x5c, 0x90, 0x37, 0xd7, 0x81, 0x08, 0xf8, 0x54, 0x86, 0x5c, - 0x44, 0x8a, 0x9c, 0x99, 0xe9, 0x3c, 0xb8, 0x74, 0x26, 0x0f, 0x1a, 0x7f, 0x57, 0x82, 0x85, 0x89, - 0x83, 0xf4, 0x27, 0x1d, 0x85, 0x2e, 0x74, 0x26, 0x8a, 0x88, 0x6c, 0x10, 0x54, 0x2f, 0xe8, 0x52, - 0xe4, 0xe6, 0x22, 0x73, 0x39, 0x5b, 0x34, 0x5c, 0x14, 0x06, 0xb5, 0xd9, 0xc2, 0xa0, 0xfe, 0xa1, - 0x30, 0x68, 0x4c, 0x86, 0x81, 0xf1, 0x4f, 0x85, 0x24, 0x4d, 0xfe, 0x28, 0x45, 0x24, 0x79, 0x3c, - 0x71, 0x59, 0xba, 0xf3, 0xe1, 0x32, 0x0c, 0xf5, 0x26, 0xab, 0xea, 0x27, 0xb0, 0xfc, 0x94, 0x46, - 0xf1, 0x56, 0x85, 0x03, 0xcc, 0x56, 0x81, 0x4a, 0xdf, 0x2b, 0xc6, 0xbe, 0x67, 0xfc, 0x29, 0x68, - 0x99, 0x67, 0x34, 0xd2, 0x81, 0x1a, 0x76, 0xb0, 0xba, 0x3b, 0xea, 0xed, 0x31, 0x1e, 0x92, 0x8f, - 0xd3, 0x17, 0xc1, 0x22, 0xda, 0xfa, 0x7a, 0x7e, 0xf9, 0x3f, 0xf9, 0x18, 0x68, 0xfc, 0x7d, 0x01, - 0xaa, 0x8a, 0xf7, 0x4d, 0xd0, 0x68, 0x10, 0x85, 0x1e, 0x95, 0x2d, 0x0c, 0xc9, 0x1f, 0x14, 0x68, - 0x6f, 0x34, 0x10, 0x37, 0xac, 0xe4, 0x6d, 0xc9, 0x3a, 0x0e, 0xd9, 0x00, 0xe5, 0x2c, 0x9b, 0xad, - 0x04, 0xfa, 0x24, 0x64, 0x03, 0x72, 0x0b, 0x9a, 0x29, 0x5a, 0xc4, 0x50, 0xa3, 0x65, 0x53, 0x4b, - 0x60, 0x87, 0x4c, 0x38, 0xb1, 0xcf, 0xfa, 0x16, 0x96, 0x92, 0xb2, 0x24, 0xae, 0xf9, 0xac, 0xbf, - 0x2f, 0xaa, 0x49, 0x35, 0x95, 0x79, 0xad, 0x15, 0x53, 0xc2, 0x59, 0x8c, 0x47, 0xd0, 0xfc, 0x92, - 0x8e, 0xb1, 0x88, 0xdc, 0xb7, 0xbd, 0x70, 0xd6, 0x5a, 0xc5, 0xf8, 0xaf, 0x02, 0x00, 0x52, 0xa1, - 0x26, 0xc9, 0x0d, 0x68, 0xf4, 0x18, 0xf3, 0x2d, 0xb4, 0xad, 0x20, 0xae, 0x3f, 0x9b, 0x33, 0xeb, - 0x02, 0xb4, 0x63, 0x47, 0x36, 0xb9, 0x0e, 0x75, 0x2f, 0x88, 0xe4, 0xac, 0x60, 0x53, 0x79, 0x36, - 0x67, 0xd6, 0xbc, 0x20, 0xc2, 0xc9, 0x1b, 0xd0, 0xf0, 0x59, 0xd0, 0x97, 0xb3, 0xf8, 0x6e, 0x2b, - 0x68, 0x05, 0x08, 0xa7, 0x6f, 0x02, 0x1c, 0xfb, 0xcc, 0x56, 0xd4, 0x62, 0x67, 0xc5, 0x67, 0x73, - 0x66, 0x03, 0x61, 0x88, 0x70, 0x0b, 0x34, 0x97, 0x8d, 0x7a, 0x3e, 0x95, 0x18, 0x62, 0x83, 0x85, - 0x67, 0x73, 0x26, 0x48, 0x60, 0x8c, 0xc2, 0xa3, 0xd0, 0x8b, 0x17, 0xc1, 0x77, 0x69, 0x81, 0x22, - 0x81, 0xf1, 0x32, 0xbd, 0x71, 0x44, 0xb9, 0xc4, 0x10, 0xf1, 0xd7, 0x14, 0xcb, 0x20, 0x4c, 0x20, - 0x6c, 0x55, 0xa5, 0xe7, 0x1a, 0xdf, 0x55, 0x94, 0xfb, 0xc8, 0x66, 0xd5, 0x05, 0xee, 0x13, 0x3f, - 0x29, 0x16, 0x33, 0x4f, 0x8a, 0x1f, 0x41, 0xdb, 0xe3, 0xd6, 0x30, 0xf4, 0x06, 0x76, 0x38, 0xb6, - 0x84, 0xaa, 0x4b, 0xf2, 0x8c, 0xf0, 0xf8, 0xbe, 0x04, 0x7e, 0x49, 0xc7, 0x22, 0xcb, 0xba, 0x94, - 0x3b, 0xa1, 0x37, 0xc4, 0x04, 0x2e, 0xcd, 0x99, 0x05, 0x91, 0xc7, 0xd0, 0x10, 0xd2, 0xc8, 0x4e, - 0x6a, 0x05, 0xa3, 0x32, 0xff, 0x69, 0x4f, 0xc8, 0x7e, 0x38, 0x1e, 0x52, 0xb3, 0xee, 0xaa, 0x2f, - 0xb2, 0x05, 0x9a, 0x20, 0xb3, 0x54, 0xb3, 0x55, 0xa6, 0xb1, 0xfc, 0x98, 0xce, 0xfa, 0x86, 0x09, - 0x82, 0x4a, 0x76, 0x57, 0xc9, 0x0e, 0x34, 0x65, 0xd3, 0x49, 0x31, 0xa9, 0xcd, 0xca, 0x44, 0xf6, - 0xaa, 0x14, 0x97, 0x65, 0xa8, 0xda, 0xe2, 0x60, 0xdc, 0x51, 0xef, 0x47, 0x6a, 0x44, 0x3e, 0x86, - 0x8a, 0xec, 0x20, 0x34, 0x70, 0x67, 0x37, 0xcf, 0x7f, 0x0a, 0x97, 0x69, 0x40, 0x62, 0x93, 0xcf, - 0xa1, 0x49, 0x7d, 0x8a, 0x8d, 0x04, 0xd4, 0x0b, 0xcc, 0xa2, 0x17, 0x4d, 0x91, 0xa0, 0x6a, 0x76, - 0xa0, 0xe5, 0xd2, 0x63, 0x7b, 0xe4, 0x47, 0x96, 0x74, 0x7a, 0xed, 0x82, 0x47, 0x9d, 0xd4, 0xff, - 0xcd, 0xa6, 0xa2, 0x42, 0x10, 0xf6, 0xb9, 0xb9, 0xe5, 0x8e, 0x03, 0x7b, 0xe0, 0x39, 0xea, 0xf2, - 0xd4, 0xf0, 0xf8, 0x8e, 0x04, 0x90, 0x35, 0xd0, 0x85, 0x0f, 0x24, 0xa5, 0x95, 0xf0, 0x02, 0x59, - 0x6d, 0xb4, 0x3d, 0x9e, 0x94, 0x4d, 0xc2, 0x0f, 0x56, 0xa0, 0x1e, 0x8c, 0x7c, 0x1f, 0x5f, 0xd8, - 0x64, 0xbd, 0x91, 0x8c, 0xc9, 0x3a, 0x2c, 0x4e, 0x88, 0x6a, 0xa1, 0x6c, 0x58, 0x72, 0x34, 0xcc, - 0x85, 0xac, 0x3c, 0xfb, 0xd8, 0xc8, 0xff, 0xd7, 0x02, 0xe8, 0xd3, 0x9d, 0xd6, 0xc4, 0x45, 0x0b, - 0x19, 0x17, 0x9d, 0x72, 0xbe, 0xe2, 0x59, 0xe7, 0x4b, 0xcd, 0x56, 0x9a, 0x30, 0xdb, 0x27, 0x50, - 0x45, 0xdf, 0x8f, 0x3b, 0x4b, 0x17, 0xb4, 0x30, 0xe2, 0x4e, 0xaf, 0xc4, 0x27, 0x0f, 0x60, 0x49, - 0x3e, 0x24, 0xc6, 0x5a, 0xb3, 0x70, 0x02, 0x3d, 0xbb, 0x6e, 0x12, 0x39, 0xa7, 0xf4, 0x87, 0xf4, - 0x46, 0x1b, 0x9a, 0x58, 0x91, 0xa8, 0x23, 0xc0, 0x78, 0x0d, 0x2d, 0x35, 0x56, 0x07, 0x5a, 0x7c, - 0x64, 0x15, 0xfe, 0x47, 0x47, 0x56, 0x31, 0x7d, 0xf7, 0xf8, 0xcb, 0x02, 0x68, 0x2f, 0x78, 0x7f, - 0x9f, 0x71, 0xb4, 0x8b, 0xc8, 0xc5, 0x71, 0x4f, 0x33, 0xa3, 0x3b, 0x4d, 0xc1, 0xb0, 0x8e, 0x5c, - 0x82, 0xca, 0x80, 0xf7, 0xbb, 0x3b, 0xc8, 0xa6, 0x69, 0xca, 0x01, 0x56, 0x97, 0xbc, 0xff, 0x34, - 0x64, 0xa3, 0x61, 0xfc, 0x3c, 0x17, 0x8f, 0xc5, 0x09, 0x96, 0xf6, 0x18, 0xca, 0x98, 0xdd, 0x53, - 0x80, 0xb1, 0x09, 0xf3, 0xaa, 0x13, 0x99, 0x48, 0x91, 0x67, 0x39, 0x71, 0xf2, 0xab, 0x79, 0xb5, - 0x81, 0x64, 0x6c, 0xac, 0x02, 0x98, 0xcc, 0xa7, 0xbb, 0x41, 0xe4, 0x45, 0xe3, 0x3c, 0x6a, 0x81, - 0xf1, 0x8a, 0xd3, 0xf0, 0x02, 0x0c, 0x03, 0x9a, 0x2f, 0x7b, 0x7f, 0x46, 0x9d, 0xe8, 0x02, 0x9c, - 0xdb, 0x30, 0xbf, 0x1f, 0x7a, 0x6f, 0x3c, 0x9f, 0xf6, 0x2f, 0x5a, 0xec, 0x9b, 0x02, 0xb4, 0x9e, - 0x86, 0x76, 0x10, 0xb1, 0x78, 0xc1, 0x87, 0x50, 0x1e, 0x71, 0x1a, 0x22, 0xd6, 0x79, 0x11, 0x97, - 0xca, 0x67, 0x22, 0x32, 0xd9, 0x82, 0xc6, 0x30, 0x5e, 0x0d, 0xb7, 0xac, 0x6d, 0x7c, 0x94, 0x7f, - 0x7f, 0x9c, 0x94, 0xc9, 0x4c, 0xc9, 0x8c, 0x23, 0x58, 0x42, 0x49, 0xa6, 0xc5, 0xfe, 0x4c, 0x54, - 0x85, 0x22, 0x16, 0x69, 0xdc, 0x30, 0x30, 0x72, 0x59, 0x4f, 0x6c, 0xc3, 0x4c, 0x68, 0x8c, 0xff, - 0x2c, 0x80, 0x86, 0x73, 0xe9, 0x06, 0x43, 0xe6, 0xd3, 0x0b, 0x37, 0x98, 0x9a, 0xc8, 0x44, 0x64, - 0xf2, 0x29, 0x54, 0x19, 0xaa, 0x5c, 0xed, 0x2e, 0xdf, 0x8f, 0xb3, 0x56, 0x31, 0x15, 0x81, 0xa8, - 0x3d, 0xe4, 0x97, 0x74, 0x53, 0xe9, 0x71, 0x20, 0x41, 0xe8, 0xa5, 0xbf, 0x81, 0x5a, 0x5f, 0xca, - 0xae, 0xca, 0xb1, 0x59, 0xf6, 0x17, 0x93, 0x64, 0xff, 0x0e, 0xa9, 0x64, 0xff, 0x0e, 0x31, 0xbe, - 0x86, 0xba, 0xb0, 0x13, 0x76, 0x5c, 0x48, 0xc6, 0xa8, 0x0d, 0x65, 0x33, 0xe1, 0xa5, 0x36, 0xe7, - 0x6f, 0x59, 0xe8, 0x26, 0x5e, 0xaa, 0xc6, 0x22, 0xf1, 0x8b, 0x6d, 0xcb, 0x07, 0xc0, 0x19, 0x94, - 0x24, 0xb1, 0x8d, 0x6f, 0x0b, 0x50, 0x8f, 0x7b, 0x58, 0xe4, 0x21, 0x54, 0xc4, 0x3a, 0xb1, 0xd1, - 0x6e, 0x9c, 0xeb, 0x49, 0xb2, 0xb9, 0x83, 0xb8, 0xe9, 0xc2, 0xc5, 0xcb, 0x2c, 0x2c, 0x32, 0x1e, - 0xea, 0x23, 0x16, 0x78, 0xf5, 0x7c, 0x0d, 0xc6, 0xd6, 0x91, 0xf8, 0xf7, 0xfe, 0x02, 0x9a, 0xd9, - 0xec, 0x43, 0x34, 0xa8, 0x1d, 0x8c, 0x1c, 0x87, 0x72, 0xae, 0xcf, 0x91, 0x79, 0xd0, 0xf6, 0x58, - 0x64, 0x1d, 0x8c, 0x86, 0x43, 0x16, 0x46, 0x7a, 0x81, 0x2c, 0x40, 0x6b, 0x8f, 0x59, 0xfb, 0x34, - 0x1c, 0x78, 0x9c, 0x7b, 0x2c, 0xd0, 0x8b, 0xa4, 0x0e, 0xe5, 0x27, 0xb6, 0xe7, 0xeb, 0x25, 0xb2, - 0x04, 0xf3, 0x78, 0x9e, 0xd2, 0x88, 0x86, 0xd6, 0xae, 0xb8, 0xf7, 0xe8, 0x7f, 0x5d, 0x22, 0x37, - 0xa0, 0xa3, 0x72, 0xa3, 0x25, 0xdd, 0xc3, 0x12, 0x2c, 0x9f, 0xb0, 0x51, 0xe0, 0xea, 0x7f, 0x53, - 0xba, 0xf7, 0x0e, 0x16, 0x73, 0x7a, 0xb1, 0x84, 0x40, 0x7b, 0x6b, 0x73, 0xfb, 0xcb, 0x57, 0xfb, - 0x56, 0x77, 0xaf, 0x7b, 0xd8, 0xdd, 0x7c, 0xae, 0xcf, 0x91, 0x25, 0xd0, 0x15, 0x6c, 0xf7, 0xf5, - 0xee, 0xf6, 0xab, 0xc3, 0xee, 0xde, 0x53, 0xbd, 0x90, 0xc1, 0x3c, 0x78, 0xb5, 0xbd, 0xbd, 0x7b, - 0x70, 0xa0, 0x17, 0x85, 0xdc, 0x0a, 0xf6, 0x64, 0xb3, 0xfb, 0x5c, 0x2f, 0x65, 0x90, 0x0e, 0xbb, - 0x2f, 0x76, 0x5f, 0xbe, 0x3a, 0xd4, 0xcb, 0xf7, 0x8e, 0x92, 0x17, 0xae, 0xc9, 0xa5, 0x35, 0xa8, - 0xa5, 0x6b, 0xb6, 0xa0, 0x91, 0x5d, 0x4c, 0x68, 0x27, 0x59, 0x45, 0xec, 0x5c, 0xb2, 0xd7, 0xa0, - 0x96, 0xf2, 0x7d, 0x2d, 0xce, 0xb7, 0xa9, 0xdf, 0x79, 0x00, 0xaa, 0x07, 0x51, 0xc8, 0x82, 0xbe, - 0x3e, 0x87, 0x3c, 0xa8, 0xd4, 0x1e, 0x32, 0xdc, 0x12, 0xaa, 0xa0, 0xae, 0x5e, 0x24, 0x6d, 0x80, - 0xdd, 0x37, 0x34, 0x88, 0x46, 0xb6, 0xef, 0x8f, 0xf5, 0x92, 0x18, 0x6f, 0x8f, 0x78, 0xc4, 0x06, - 0xde, 0x7b, 0xea, 0xea, 0xe5, 0x7b, 0xdf, 0x17, 0xa0, 0x1e, 0xd7, 0x0b, 0x62, 0xf5, 0x3d, 0x16, - 0x50, 0x7d, 0x4e, 0x7c, 0x6d, 0x31, 0xe6, 0xeb, 0x05, 0xf1, 0xd5, 0x0d, 0xa2, 0x4f, 0xf4, 0x22, - 0x69, 0x40, 0xa5, 0x1b, 0x44, 0xbf, 0x7a, 0xa4, 0x97, 0xd4, 0xe7, 0xc3, 0x0d, 0xbd, 0xac, 0x3e, - 0x1f, 0xfd, 0x5a, 0xaf, 0x88, 0xcf, 0x27, 0xa2, 0x74, 0xd5, 0x41, 0x08, 0xb7, 0x83, 0x35, 0xaa, - 0xae, 0x29, 0x41, 0xbd, 0xa0, 0xaf, 0x2f, 0x09, 0xd9, 0x8e, 0xec, 0x70, 0xfb, 0xc4, 0x0e, 0xf5, - 0x2b, 0x02, 0x7f, 0x33, 0x0c, 0xed, 0xb1, 0xbe, 0x2c, 0x56, 0xf9, 0x82, 0xb3, 0x40, 0xbf, 0x4a, - 0x74, 0x68, 0x6e, 0x79, 0x81, 0x1d, 0x8e, 0x8f, 0xa8, 0x13, 0xb1, 0x50, 0x77, 0x85, 0xe6, 0x91, - 0xad, 0x02, 0x50, 0xe1, 0x31, 0x08, 0xf8, 0xd5, 0x23, 0x05, 0x3a, 0x46, 0x63, 0x4c, 0xc2, 0xfa, - 0xe4, 0x0a, 0x2c, 0x1c, 0x0c, 0xed, 0x90, 0xd3, 0x2c, 0xf5, 0xc9, 0xbd, 0x23, 0x80, 0xb4, 0xbc, - 0x12, 0xcb, 0xe1, 0x48, 0xbe, 0x1e, 0xb8, 0xfa, 0x1c, 0x72, 0x4f, 0x20, 0x42, 0xea, 0x42, 0x02, - 0xda, 0x09, 0xd9, 0x70, 0x28, 0x40, 0xc5, 0x84, 0x0e, 0x41, 0xd4, 0xd5, 0x4b, 0x1b, 0xff, 0x5c, - 0x81, 0xc5, 0x17, 0x18, 0x21, 0xd2, 0xf9, 0x0e, 0x68, 0xf8, 0xc6, 0x73, 0x28, 0x71, 0xa0, 0x99, - 0x6d, 0xad, 0x92, 0xfc, 0x47, 0xc0, 0x9c, 0xee, 0xeb, 0xca, 0x2f, 0x3e, 0xd4, 0x91, 0x51, 0x41, - 0x66, 0xcc, 0x91, 0x3f, 0x81, 0x46, 0xd2, 0x72, 0x23, 0xf9, 0x7f, 0x88, 0x4d, 0xb7, 0xe4, 0x2e, - 0xc3, 0xbe, 0x07, 0x5a, 0xa6, 0x4f, 0x45, 0xf2, 0x29, 0xcf, 0xf6, 0xc9, 0x56, 0xd6, 0x3e, 0x8c, - 0x98, 0xac, 0x41, 0xa1, 0x99, 0x6d, 0x01, 0x9d, 0xa3, 0xa7, 0x9c, 0xde, 0xd3, 0xca, 0xdd, 0x19, - 0x30, 0x93, 0x65, 0x4e, 0xa0, 0x35, 0x71, 0x09, 0x27, 0x77, 0x67, 0xee, 0x97, 0xac, 0xdc, 0x9b, - 0x05, 0x35, 0x59, 0xa9, 0x0f, 0x90, 0xde, 0xe9, 0xc9, 0x2f, 0xcf, 0x33, 0x4a, 0xce, 0xa5, 0xff, - 0x92, 0x0b, 0xed, 0x43, 0x45, 0xbe, 0x60, 0xe5, 0x9f, 0xa0, 0xd9, 0x5a, 0x72, 0xc5, 0xb8, 0x08, - 0x25, 0xe6, 0xb8, 0xf5, 0xe9, 0x57, 0x7f, 0xd0, 0xf7, 0xa2, 0x93, 0x51, 0x6f, 0xdd, 0x61, 0x83, - 0xfb, 0xef, 0x3d, 0xdf, 0xf7, 0xde, 0x47, 0xd4, 0x39, 0xb9, 0x2f, 0x89, 0x7f, 0x5f, 0x92, 0xdd, - 0x77, 0x58, 0xa8, 0xfe, 0xad, 0xbd, 0x2f, 0x21, 0xc3, 0x5e, 0xaf, 0x8a, 0xe3, 0x87, 0xff, 0x1d, - 0x00, 0x00, 0xff, 0xff, 0xfb, 0x9e, 0x25, 0x80, 0x9e, 0x2b, 0x00, 0x00, +var File_backup_proto protoreflect.FileDescriptor + +var file_backup_proto_rawDesc = []byte{ + 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, + 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xe7, 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x42, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, + 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x1a, 0x39, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd5, 0x08, 0x0a, 0x14, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x64, 0x65, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, + 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, + 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, + 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4e, 0x75, 0x6d, 0x12, 0x52, 0x0a, 0x11, + 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x43, 0x6f, + 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x10, + 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x55, 0x0a, 0x11, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x69, + 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x61, 0x73, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x68, 0x61, 0x73, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x3f, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, + 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x70, 0x68, + 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x50, 0x68, + 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x72, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x6d, + 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x12, 0x47, 0x0a, 0x0b, 0x6c, 0x30, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0a, 0x6c, 0x30, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x45, 0x0a, 0x17, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x88, 0x02, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x25, + 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x4f, 0x0a, 0x0f, 0x73, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x73, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xb6, + 0x03, 0x0a, 0x11, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, + 0x75, 0x6d, 0x5f, 0x6f, 0x66, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x4f, 0x66, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x3a, 0x0a, 0x07, 0x62, + 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, + 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x07, + 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x73, + 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x69, 0x6c, + 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, + 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x69, 0x6c, + 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x09, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x65, 0x64, 0x12, 0x13, 0x0a, 0x05, 0x69, 0x73, 0x5f, 0x6c, 0x30, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x69, 0x73, 0x4c, 0x30, 0x22, 0xef, 0x03, 0x0a, 0x0a, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x6d, 0x69, 0x6c, + 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, + 0x10, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x58, 0x0a, 0x12, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x09, 0x72, 0x62, 0x61, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x42, 0x41, 0x43, 0x4d, 0x65, 0x74, 0x61, 0x52, + 0x08, 0x72, 0x62, 0x61, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x5c, 0x0a, 0x19, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x5a, 0x0a, 0x18, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x69, 0x6e, + 0x66, 0x6f, 0x73, 0x22, 0x56, 0x0a, 0x16, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x0a, + 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, + 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x97, 0x03, 0x0a, 0x13, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, + 0x79, 0x6e, 0x63, 0x12, 0x3d, 0x0a, 0x0e, 0x64, 0x62, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x64, 0x62, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x67, 0x63, 0x5f, 0x70, 0x61, 0x75, 0x73, + 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x67, 0x63, 0x50, 0x61, 0x75, 0x73, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x28, 0x0a, + 0x10, 0x67, 0x63, 0x5f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x67, 0x63, 0x50, 0x61, 0x75, 0x73, 0x65, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x63, 0x5f, 0x70, 0x61, + 0x75, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x67, 0x63, 0x50, 0x61, 0x75, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x62, 0x61, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x04, 0x72, 0x62, 0x61, 0x63, 0x22, 0xb0, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6d, 0x73, 0x67, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xca, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x25, + 0x0a, 0x0e, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x5b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0xb1, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, + 0x67, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x54, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x7d, 0x0a, 0x14, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x49, 0x64, 0x12, 0x35, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, + 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0xbe, 0x01, 0x0a, 0x0a, + 0x53, 0x6b, 0x69, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x33, 0x0a, 0x15, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x2c, 0x0a, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x66, 0x69, 0x6c, + 0x65, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2a, 0x0a, + 0x11, 0x66, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x65, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xa4, 0x07, 0x0a, + 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x75, + 0x66, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x6f, 0x0a, 0x12, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, + 0x79, 0x6e, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x3d, 0x0a, 0x0e, 0x64, 0x62, 0x5f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x64, 0x62, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x4f, + 0x6e, 0x6c, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x4f, + 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x41, 0x75, + 0x74, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, + 0x73, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x30, 0x0a, 0x13, 0x64, + 0x72, 0x6f, 0x70, 0x45, 0x78, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x72, 0x6f, 0x70, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, + 0x0e, 0x64, 0x72, 0x6f, 0x70, 0x45, 0x78, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x72, 0x6f, 0x70, 0x45, 0x78, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x18, 0x73, 0x6b, 0x69, + 0x70, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x51, 0x75, 0x6f, 0x74, 0x61, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x73, 0x6b, 0x69, + 0x70, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x51, 0x75, 0x6f, 0x74, 0x61, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x62, 0x61, 0x63, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x04, 0x72, 0x62, 0x61, 0x63, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x6d, 0x61, 0x78, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x12, 0x40, 0x0a, 0x0b, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x53, 0x6b, 0x69, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x44, 0x0a, + 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xb5, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x48, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x49, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0xc9, 0x07, 0x0a, 0x15, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x48, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x6c, 0x76, + 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4a, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x61, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x15, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x5f, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0d, 0x74, 0x6f, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x62, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, + 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x41, 0x75, 0x74, 0x6f, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x72, 0x6f, 0x70, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x13, 0x64, 0x72, 0x6f, 0x70, 0x45, 0x78, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x72, 0x6f, 0x70, 0x45, + 0x78, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x64, 0x72, 0x6f, 0x70, 0x45, 0x78, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x32, 0x0a, 0x14, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x73, + 0x6b, 0x69, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x44, 0x69, 0x73, 0x6b, 0x51, + 0x75, 0x6f, 0x74, 0x61, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x12, 0x73, 0x6b, 0x69, 0x70, 0x44, 0x69, 0x73, 0x6b, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4e, + 0x75, 0x6d, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x4e, 0x75, 0x6d, 0x12, 0x40, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6c, + 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x53, 0x6b, 0x69, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x0a, 0x73, 0x6b, 0x69, + 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x9a, 0x03, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x48, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, + 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x64, 0x0a, 0x18, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x6f, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, + 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x3a, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x46, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5e, 0x0a, 0x0b, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x49, 0x44, 0x12, 0x35, 0x0a, 0x07, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, + 0x52, 0x07, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x06, 0x42, 0x69, + 0x6e, 0x6c, 0x6f, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, + 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x4e, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x21, 0x0a, 0x0c, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x54, 0x6f, 0x12, + 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, + 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6c, 0x6f, + 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x36, 0x0a, 0x0c, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xf7, 0x01, + 0x0a, 0x0a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x09, + 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x00, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x08, 0x69, + 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, + 0x07, 0x69, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x6c, + 0x6f, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x48, 0x00, 0x52, 0x09, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0b, 0x64, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, + 0x0a, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0b, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1f, + 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x48, 0x00, 0x52, 0x09, 0x62, 0x79, 0x74, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x42, + 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x05, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, + 0x44, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, + 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1d, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, + 0x72, 0x52, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x44, 0x0a, + 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x6f, 0x49, 0x44, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x75, 0x74, 0x6f, 0x49, 0x44, 0x12, 0x35, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6c, + 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0c, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x69, + 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0c, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, + 0x5f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x69, 0x73, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x73, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x2e, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xf4, 0x02, + 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, + 0x11, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x03, 0x52, 0x0d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x64, + 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x28, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, + 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, + 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x22, 0xd2, 0x02, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x6f, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x61, 0x75, 0x74, 0x6f, 0x49, 0x44, 0x12, 0x38, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x12, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x12, 0x41, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x4b, 0x65, + 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x69, 0x6c, 0x76, + 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x09, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x0e, 0x0a, 0x0c, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x58, 0x0a, 0x0d, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6d, 0x73, 0x67, 0x22, 0x80, 0x01, 0x0a, 0x0b, 0x4d, 0x73, 0x67, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, + 0x6d, 0x73, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6d, 0x73, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x41, 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x0a, 0x52, 0x6f, 0x6c, + 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x0a, 0x0a, 0x55, + 0x73, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x22, 0x0a, + 0x0c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x42, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, + 0x67, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x09, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, + 0x65, 0x67, 0x65, 0x22, 0x56, 0x0a, 0x14, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, + 0x69, 0x6c, 0x65, 0x67, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x08, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xf5, 0x01, 0x0a, 0x0b, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6c, 0x76, + 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x07, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x6f, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x35, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x08, 0x52, 0x42, 0x41, 0x43, 0x4d, + 0x65, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x35, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x38, 0x0a, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2a, 0x7e, 0x0a, 0x0c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x6f, 0x74, 0x5f, 0x53, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x5f, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x61, + 0x69, 0x6c, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x90, 0x03, 0x12, 0x1d, 0x0a, 0x18, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x4e, 0x6f, 0x74, + 0x5f, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x10, 0x94, 0x03, 0x2a, 0x78, 0x0a, 0x13, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x49, + 0x41, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x45, + 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x41, + 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x0f, + 0x0a, 0x0b, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x03, 0x12, + 0x12, 0x0a, 0x0e, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, + 0x54, 0x10, 0x04, 0x2a, 0x56, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, + 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x58, 0x45, 0x43, + 0x55, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, + 0x53, 0x53, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x03, 0x12, 0x0b, + 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x04, 0x2a, 0x58, 0x0a, 0x10, 0x43, + 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, + 0x0a, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x65, 0x64, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x61, + 0x6c, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, + 0x7a, 0x65, 0x64, 0x10, 0x04, 0x2a, 0x38, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4d, 0x32, 0x35, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, + 0x54, 0x65, 0x78, 0x74, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x2a, + 0xef, 0x01, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x6f, 0x6f, 0x6c, 0x10, 0x01, + 0x12, 0x08, 0x0a, 0x04, 0x49, 0x6e, 0x74, 0x38, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x6e, + 0x74, 0x31, 0x36, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x10, 0x04, + 0x12, 0x09, 0x0a, 0x05, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x10, 0x05, 0x12, 0x09, 0x0a, 0x05, 0x46, + 0x6c, 0x6f, 0x61, 0x74, 0x10, 0x0a, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, + 0x10, 0x0b, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x14, 0x12, 0x0b, + 0x0a, 0x07, 0x56, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x10, 0x15, 0x12, 0x09, 0x0a, 0x05, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x10, 0x16, 0x12, 0x08, 0x0a, 0x04, 0x4a, 0x73, 0x6f, 0x6e, 0x10, 0x17, + 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x10, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x10, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x31, 0x36, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x10, 0x66, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x46, 0x6c, 0x6f, 0x61, 0x74, + 0x31, 0x36, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x10, 0x67, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x10, + 0x68, 0x2a, 0x56, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x10, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x10, + 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x72, 0x6f, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x10, 0x03, 0x32, 0xc9, 0x05, 0x0a, 0x13, 0x4d, 0x69, + 0x6c, 0x76, 0x75, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x63, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x12, 0x28, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x69, + 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x12, 0x25, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x69, 0x6c, + 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x28, 0x2e, 0x6d, 0x69, 0x6c, 0x76, + 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x68, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x12, 0x29, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, + 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0a, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x2b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x2e, 0x6d, + 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x39, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x7a, 0x69, 0x6c, 0x6c, 0x69, 0x7a, 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6d, + 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2d, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_backup_proto_rawDescOnce sync.Once + file_backup_proto_rawDescData = file_backup_proto_rawDesc +) + +func file_backup_proto_rawDescGZIP() []byte { + file_backup_proto_rawDescOnce.Do(func() { + file_backup_proto_rawDescData = protoimpl.X.CompressGZIP(file_backup_proto_rawDescData) + }) + return file_backup_proto_rawDescData +} + +var file_backup_proto_enumTypes = make([]protoimpl.EnumInfo, 7) +var file_backup_proto_msgTypes = make([]protoimpl.MessageInfo, 45) +var file_backup_proto_goTypes = []interface{}{ + (ResponseCode)(0), // 0: milvus.proto.backup.ResponseCode + (BackupTaskStateCode)(0), // 1: milvus.proto.backup.BackupTaskStateCode + (RestoreTaskStateCode)(0), // 2: milvus.proto.backup.RestoreTaskStateCode + (ConsistencyLevel)(0), // 3: milvus.proto.backup.ConsistencyLevel + (FunctionType)(0), // 4: milvus.proto.backup.FunctionType + (DataType)(0), // 5: milvus.proto.backup.DataType + (FieldState)(0), // 6: milvus.proto.backup.FieldState + (*IndexInfo)(nil), // 7: milvus.proto.backup.IndexInfo + (*CollectionBackupInfo)(nil), // 8: milvus.proto.backup.CollectionBackupInfo + (*PartitionBackupInfo)(nil), // 9: milvus.proto.backup.PartitionBackupInfo + (*SegmentBackupInfo)(nil), // 10: milvus.proto.backup.SegmentBackupInfo + (*BackupInfo)(nil), // 11: milvus.proto.backup.BackupInfo + (*CollectionLevelBackupInfo)(nil), // 12: milvus.proto.backup.CollectionLevelBackupInfo + (*PartitionLevelBackupInfo)(nil), // 13: milvus.proto.backup.PartitionLevelBackupInfo + (*SegmentLevelBackupInfo)(nil), // 14: milvus.proto.backup.SegmentLevelBackupInfo + (*CreateBackupRequest)(nil), // 15: milvus.proto.backup.CreateBackupRequest + (*BackupInfoResponse)(nil), // 16: milvus.proto.backup.BackupInfoResponse + (*GetBackupRequest)(nil), // 17: milvus.proto.backup.GetBackupRequest + (*ListBackupsRequest)(nil), // 18: milvus.proto.backup.ListBackupsRequest + (*ListBackupsResponse)(nil), // 19: milvus.proto.backup.ListBackupsResponse + (*DeleteBackupRequest)(nil), // 20: milvus.proto.backup.DeleteBackupRequest + (*DeleteBackupResponse)(nil), // 21: milvus.proto.backup.DeleteBackupResponse + (*SkipParams)(nil), // 22: milvus.proto.backup.SkipParams + (*RestoreBackupRequest)(nil), // 23: milvus.proto.backup.RestoreBackupRequest + (*RestorePartitionTask)(nil), // 24: milvus.proto.backup.RestorePartitionTask + (*RestoreCollectionTask)(nil), // 25: milvus.proto.backup.RestoreCollectionTask + (*RestoreBackupTask)(nil), // 26: milvus.proto.backup.RestoreBackupTask + (*RestoreBackupResponse)(nil), // 27: milvus.proto.backup.RestoreBackupResponse + (*GetRestoreStateRequest)(nil), // 28: milvus.proto.backup.GetRestoreStateRequest + (*FieldBinlog)(nil), // 29: milvus.proto.backup.FieldBinlog + (*Binlog)(nil), // 30: milvus.proto.backup.Binlog + (*KeyValuePair)(nil), // 31: milvus.proto.backup.KeyValuePair + (*ValueField)(nil), // 32: milvus.proto.backup.ValueField + (*FieldSchema)(nil), // 33: milvus.proto.backup.FieldSchema + (*FunctionSchema)(nil), // 34: milvus.proto.backup.FunctionSchema + (*CollectionSchema)(nil), // 35: milvus.proto.backup.CollectionSchema + (*CheckRequest)(nil), // 36: milvus.proto.backup.CheckRequest + (*CheckResponse)(nil), // 37: milvus.proto.backup.CheckResponse + (*MsgPosition)(nil), // 38: milvus.proto.backup.MsgPosition + (*ChannelPosition)(nil), // 39: milvus.proto.backup.ChannelPosition + (*RoleEntity)(nil), // 40: milvus.proto.backup.RoleEntity + (*UserEntity)(nil), // 41: milvus.proto.backup.UserEntity + (*ObjectEntity)(nil), // 42: milvus.proto.backup.ObjectEntity + (*PrivilegeEntity)(nil), // 43: milvus.proto.backup.PrivilegeEntity + (*GrantorEntity)(nil), // 44: milvus.proto.backup.GrantorEntity + (*GrantPrivilegeEntity)(nil), // 45: milvus.proto.backup.GrantPrivilegeEntity + (*GrantEntity)(nil), // 46: milvus.proto.backup.GrantEntity + (*UserInfo)(nil), // 47: milvus.proto.backup.UserInfo + (*RBACMeta)(nil), // 48: milvus.proto.backup.RBACMeta + nil, // 49: milvus.proto.backup.IndexInfo.ParamsEntry + nil, // 50: milvus.proto.backup.CollectionBackupInfo.ChannelCheckpointsEntry + nil, // 51: milvus.proto.backup.RestoreBackupRequest.CollectionRenamesEntry + (*_struct.Value)(nil), // 52: google.protobuf.Value +} +var file_backup_proto_depIdxs = []int32{ + 49, // 0: milvus.proto.backup.IndexInfo.params:type_name -> milvus.proto.backup.IndexInfo.ParamsEntry + 1, // 1: milvus.proto.backup.CollectionBackupInfo.state_code:type_name -> milvus.proto.backup.BackupTaskStateCode + 35, // 2: milvus.proto.backup.CollectionBackupInfo.schema:type_name -> milvus.proto.backup.CollectionSchema + 3, // 3: milvus.proto.backup.CollectionBackupInfo.consistency_level:type_name -> milvus.proto.backup.ConsistencyLevel + 9, // 4: milvus.proto.backup.CollectionBackupInfo.partition_backups:type_name -> milvus.proto.backup.PartitionBackupInfo + 7, // 5: milvus.proto.backup.CollectionBackupInfo.index_infos:type_name -> milvus.proto.backup.IndexInfo + 50, // 6: milvus.proto.backup.CollectionBackupInfo.channel_checkpoints:type_name -> milvus.proto.backup.CollectionBackupInfo.ChannelCheckpointsEntry + 10, // 7: milvus.proto.backup.CollectionBackupInfo.l0_segments:type_name -> milvus.proto.backup.SegmentBackupInfo + 10, // 8: milvus.proto.backup.PartitionBackupInfo.segment_backups:type_name -> milvus.proto.backup.SegmentBackupInfo + 29, // 9: milvus.proto.backup.SegmentBackupInfo.binlogs:type_name -> milvus.proto.backup.FieldBinlog + 29, // 10: milvus.proto.backup.SegmentBackupInfo.statslogs:type_name -> milvus.proto.backup.FieldBinlog + 29, // 11: milvus.proto.backup.SegmentBackupInfo.deltalogs:type_name -> milvus.proto.backup.FieldBinlog + 1, // 12: milvus.proto.backup.BackupInfo.state_code:type_name -> milvus.proto.backup.BackupTaskStateCode + 8, // 13: milvus.proto.backup.BackupInfo.collection_backups:type_name -> milvus.proto.backup.CollectionBackupInfo + 48, // 14: milvus.proto.backup.BackupInfo.rbac_meta:type_name -> milvus.proto.backup.RBACMeta + 8, // 15: milvus.proto.backup.CollectionLevelBackupInfo.infos:type_name -> milvus.proto.backup.CollectionBackupInfo + 9, // 16: milvus.proto.backup.PartitionLevelBackupInfo.infos:type_name -> milvus.proto.backup.PartitionBackupInfo + 10, // 17: milvus.proto.backup.SegmentLevelBackupInfo.infos:type_name -> milvus.proto.backup.SegmentBackupInfo + 52, // 18: milvus.proto.backup.CreateBackupRequest.db_collections:type_name -> google.protobuf.Value + 0, // 19: milvus.proto.backup.BackupInfoResponse.code:type_name -> milvus.proto.backup.ResponseCode + 11, // 20: milvus.proto.backup.BackupInfoResponse.data:type_name -> milvus.proto.backup.BackupInfo + 0, // 21: milvus.proto.backup.ListBackupsResponse.code:type_name -> milvus.proto.backup.ResponseCode + 11, // 22: milvus.proto.backup.ListBackupsResponse.data:type_name -> milvus.proto.backup.BackupInfo + 0, // 23: milvus.proto.backup.DeleteBackupResponse.code:type_name -> milvus.proto.backup.ResponseCode + 51, // 24: milvus.proto.backup.RestoreBackupRequest.collection_renames:type_name -> milvus.proto.backup.RestoreBackupRequest.CollectionRenamesEntry + 52, // 25: milvus.proto.backup.RestoreBackupRequest.db_collections:type_name -> google.protobuf.Value + 22, // 26: milvus.proto.backup.RestoreBackupRequest.skip_params:type_name -> milvus.proto.backup.SkipParams + 2, // 27: milvus.proto.backup.RestorePartitionTask.state_code:type_name -> milvus.proto.backup.RestoreTaskStateCode + 9, // 28: milvus.proto.backup.RestorePartitionTask.part_backup:type_name -> milvus.proto.backup.PartitionBackupInfo + 2, // 29: milvus.proto.backup.RestoreCollectionTask.state_code:type_name -> milvus.proto.backup.RestoreTaskStateCode + 8, // 30: milvus.proto.backup.RestoreCollectionTask.coll_backup:type_name -> milvus.proto.backup.CollectionBackupInfo + 24, // 31: milvus.proto.backup.RestoreCollectionTask.partition_restore_tasks:type_name -> milvus.proto.backup.RestorePartitionTask + 22, // 32: milvus.proto.backup.RestoreCollectionTask.skip_params:type_name -> milvus.proto.backup.SkipParams + 2, // 33: milvus.proto.backup.RestoreBackupTask.state_code:type_name -> milvus.proto.backup.RestoreTaskStateCode + 25, // 34: milvus.proto.backup.RestoreBackupTask.collection_restore_tasks:type_name -> milvus.proto.backup.RestoreCollectionTask + 0, // 35: milvus.proto.backup.RestoreBackupResponse.code:type_name -> milvus.proto.backup.ResponseCode + 26, // 36: milvus.proto.backup.RestoreBackupResponse.data:type_name -> milvus.proto.backup.RestoreBackupTask + 30, // 37: milvus.proto.backup.FieldBinlog.binlogs:type_name -> milvus.proto.backup.Binlog + 5, // 38: milvus.proto.backup.FieldSchema.data_type:type_name -> milvus.proto.backup.DataType + 31, // 39: milvus.proto.backup.FieldSchema.type_params:type_name -> milvus.proto.backup.KeyValuePair + 31, // 40: milvus.proto.backup.FieldSchema.index_params:type_name -> milvus.proto.backup.KeyValuePair + 6, // 41: milvus.proto.backup.FieldSchema.state:type_name -> milvus.proto.backup.FieldState + 5, // 42: milvus.proto.backup.FieldSchema.element_type:type_name -> milvus.proto.backup.DataType + 32, // 43: milvus.proto.backup.FieldSchema.default_value:type_name -> milvus.proto.backup.ValueField + 4, // 44: milvus.proto.backup.FunctionSchema.type:type_name -> milvus.proto.backup.FunctionType + 31, // 45: milvus.proto.backup.FunctionSchema.params:type_name -> milvus.proto.backup.KeyValuePair + 33, // 46: milvus.proto.backup.CollectionSchema.fields:type_name -> milvus.proto.backup.FieldSchema + 31, // 47: milvus.proto.backup.CollectionSchema.properties:type_name -> milvus.proto.backup.KeyValuePair + 34, // 48: milvus.proto.backup.CollectionSchema.functions:type_name -> milvus.proto.backup.FunctionSchema + 0, // 49: milvus.proto.backup.CheckResponse.code:type_name -> milvus.proto.backup.ResponseCode + 41, // 50: milvus.proto.backup.GrantorEntity.user:type_name -> milvus.proto.backup.UserEntity + 43, // 51: milvus.proto.backup.GrantorEntity.privilege:type_name -> milvus.proto.backup.PrivilegeEntity + 44, // 52: milvus.proto.backup.GrantPrivilegeEntity.entities:type_name -> milvus.proto.backup.GrantorEntity + 40, // 53: milvus.proto.backup.GrantEntity.role:type_name -> milvus.proto.backup.RoleEntity + 42, // 54: milvus.proto.backup.GrantEntity.object:type_name -> milvus.proto.backup.ObjectEntity + 44, // 55: milvus.proto.backup.GrantEntity.grantor:type_name -> milvus.proto.backup.GrantorEntity + 40, // 56: milvus.proto.backup.UserInfo.roles:type_name -> milvus.proto.backup.RoleEntity + 47, // 57: milvus.proto.backup.RBACMeta.users:type_name -> milvus.proto.backup.UserInfo + 40, // 58: milvus.proto.backup.RBACMeta.roles:type_name -> milvus.proto.backup.RoleEntity + 46, // 59: milvus.proto.backup.RBACMeta.grants:type_name -> milvus.proto.backup.GrantEntity + 15, // 60: milvus.proto.backup.MilvusBackupService.CreateBackup:input_type -> milvus.proto.backup.CreateBackupRequest + 17, // 61: milvus.proto.backup.MilvusBackupService.GetBackup:input_type -> milvus.proto.backup.GetBackupRequest + 18, // 62: milvus.proto.backup.MilvusBackupService.ListBackups:input_type -> milvus.proto.backup.ListBackupsRequest + 20, // 63: milvus.proto.backup.MilvusBackupService.DeleteBackup:input_type -> milvus.proto.backup.DeleteBackupRequest + 23, // 64: milvus.proto.backup.MilvusBackupService.RestoreBackup:input_type -> milvus.proto.backup.RestoreBackupRequest + 28, // 65: milvus.proto.backup.MilvusBackupService.GetRestore:input_type -> milvus.proto.backup.GetRestoreStateRequest + 36, // 66: milvus.proto.backup.MilvusBackupService.Check:input_type -> milvus.proto.backup.CheckRequest + 16, // 67: milvus.proto.backup.MilvusBackupService.CreateBackup:output_type -> milvus.proto.backup.BackupInfoResponse + 16, // 68: milvus.proto.backup.MilvusBackupService.GetBackup:output_type -> milvus.proto.backup.BackupInfoResponse + 19, // 69: milvus.proto.backup.MilvusBackupService.ListBackups:output_type -> milvus.proto.backup.ListBackupsResponse + 21, // 70: milvus.proto.backup.MilvusBackupService.DeleteBackup:output_type -> milvus.proto.backup.DeleteBackupResponse + 27, // 71: milvus.proto.backup.MilvusBackupService.RestoreBackup:output_type -> milvus.proto.backup.RestoreBackupResponse + 27, // 72: milvus.proto.backup.MilvusBackupService.GetRestore:output_type -> milvus.proto.backup.RestoreBackupResponse + 37, // 73: milvus.proto.backup.MilvusBackupService.Check:output_type -> milvus.proto.backup.CheckResponse + 67, // [67:74] is the sub-list for method output_type + 60, // [60:67] is the sub-list for method input_type + 60, // [60:60] is the sub-list for extension type_name + 60, // [60:60] is the sub-list for extension extendee + 0, // [0:60] is the sub-list for field type_name +} + +func init() { file_backup_proto_init() } +func file_backup_proto_init() { + if File_backup_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_backup_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IndexInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionBackupInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartitionBackupInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SegmentBackupInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BackupInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionLevelBackupInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartitionLevelBackupInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SegmentLevelBackupInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateBackupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BackupInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBackupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListBackupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListBackupsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteBackupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteBackupResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SkipParams); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestoreBackupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestorePartitionTask); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestoreCollectionTask); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestoreBackupTask); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestoreBackupResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRestoreStateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FieldBinlog); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Binlog); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KeyValuePair); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValueField); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FieldSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FunctionSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionSchema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CheckRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CheckResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgPosition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelPosition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoleEntity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserEntity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ObjectEntity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PrivilegeEntity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrantorEntity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrantPrivilegeEntity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrantEntity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_backup_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RBACMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_backup_proto_msgTypes[25].OneofWrappers = []interface{}{ + (*ValueField_BoolData)(nil), + (*ValueField_IntData)(nil), + (*ValueField_LongData)(nil), + (*ValueField_FloatData)(nil), + (*ValueField_DoubleData)(nil), + (*ValueField_StringData)(nil), + (*ValueField_BytesData)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_backup_proto_rawDesc, + NumEnums: 7, + NumMessages: 45, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_backup_proto_goTypes, + DependencyIndexes: file_backup_proto_depIdxs, + EnumInfos: file_backup_proto_enumTypes, + MessageInfos: file_backup_proto_msgTypes, + }.Build() + File_backup_proto = out.File + file_backup_proto_rawDesc = nil + file_backup_proto_goTypes = nil + file_backup_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context -var _ grpc.ClientConn +var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 +const _ = grpc.SupportPackageIsVersion6 // MilvusBackupServiceClient is the client API for MilvusBackupService service. // @@ -3678,10 +5563,10 @@ type MilvusBackupServiceClient interface { } type milvusBackupServiceClient struct { - cc *grpc.ClientConn + cc grpc.ClientConnInterface } -func NewMilvusBackupServiceClient(cc *grpc.ClientConn) MilvusBackupServiceClient { +func NewMilvusBackupServiceClient(cc grpc.ClientConnInterface) MilvusBackupServiceClient { return &milvusBackupServiceClient{cc} } @@ -3770,25 +5655,25 @@ type MilvusBackupServiceServer interface { type UnimplementedMilvusBackupServiceServer struct { } -func (*UnimplementedMilvusBackupServiceServer) CreateBackup(ctx context.Context, req *CreateBackupRequest) (*BackupInfoResponse, error) { +func (*UnimplementedMilvusBackupServiceServer) CreateBackup(context.Context, *CreateBackupRequest) (*BackupInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateBackup not implemented") } -func (*UnimplementedMilvusBackupServiceServer) GetBackup(ctx context.Context, req *GetBackupRequest) (*BackupInfoResponse, error) { +func (*UnimplementedMilvusBackupServiceServer) GetBackup(context.Context, *GetBackupRequest) (*BackupInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetBackup not implemented") } -func (*UnimplementedMilvusBackupServiceServer) ListBackups(ctx context.Context, req *ListBackupsRequest) (*ListBackupsResponse, error) { +func (*UnimplementedMilvusBackupServiceServer) ListBackups(context.Context, *ListBackupsRequest) (*ListBackupsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListBackups not implemented") } -func (*UnimplementedMilvusBackupServiceServer) DeleteBackup(ctx context.Context, req *DeleteBackupRequest) (*DeleteBackupResponse, error) { +func (*UnimplementedMilvusBackupServiceServer) DeleteBackup(context.Context, *DeleteBackupRequest) (*DeleteBackupResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteBackup not implemented") } -func (*UnimplementedMilvusBackupServiceServer) RestoreBackup(ctx context.Context, req *RestoreBackupRequest) (*RestoreBackupResponse, error) { +func (*UnimplementedMilvusBackupServiceServer) RestoreBackup(context.Context, *RestoreBackupRequest) (*RestoreBackupResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RestoreBackup not implemented") } -func (*UnimplementedMilvusBackupServiceServer) GetRestore(ctx context.Context, req *GetRestoreStateRequest) (*RestoreBackupResponse, error) { +func (*UnimplementedMilvusBackupServiceServer) GetRestore(context.Context, *GetRestoreStateRequest) (*RestoreBackupResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetRestore not implemented") } -func (*UnimplementedMilvusBackupServiceServer) Check(ctx context.Context, req *CheckRequest) (*CheckResponse, error) { +func (*UnimplementedMilvusBackupServiceServer) Check(context.Context, *CheckRequest) (*CheckResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Check not implemented") } diff --git a/core/restore/collection.go b/core/restore/collection.go new file mode 100644 index 0000000..dd46919 --- /dev/null +++ b/core/restore/collection.go @@ -0,0 +1,695 @@ +package restore + +import ( + "context" + "errors" + "fmt" + "path" + "slices" + "strconv" + "strings" + "time" + + "github.com/milvus-io/milvus-proto/go-api/v2/commonpb" + "github.com/milvus-io/milvus-proto/go-api/v2/schemapb" + "github.com/samber/lo" + "go.uber.org/atomic" + "go.uber.org/zap" + "golang.org/x/exp/maps" + "google.golang.org/protobuf/proto" + + "github.com/zilliztech/milvus-backup/core/client" + "github.com/zilliztech/milvus-backup/core/meta" + "github.com/zilliztech/milvus-backup/core/paramtable" + "github.com/zilliztech/milvus-backup/core/pbconv" + "github.com/zilliztech/milvus-backup/core/proto/backuppb" + "github.com/zilliztech/milvus-backup/core/storage" + "github.com/zilliztech/milvus-backup/core/storage/mpath" + "github.com/zilliztech/milvus-backup/internal/common" + "github.com/zilliztech/milvus-backup/internal/log" +) + +const ( + _bulkInsertTimeout = 60 * time.Minute + _bulkInsertCheckInterval = 3 * time.Second +) + +type tearDownFn func(ctx context.Context) error + +type CollectionTask struct { + task *backuppb.RestoreCollectionTask + + parentTaskID string + + meta *meta.MetaManager + + copyParallelism int + restoreParallelism int + + backupBucketName string + backupPath string + backupRootPath string + backupStorage storage.ChunkManager + + milvusBucketName string + milvusStorage storage.ChunkManager + + restoredSize atomic.Int64 + + grpcCli client.Grpc + restfulCli client.Restful + + tearDownFns []tearDownFn + + logger *zap.Logger +} + +func NewCollectionTask(task *backuppb.RestoreCollectionTask, + meta *meta.MetaManager, + params *paramtable.BackupParams, + parentTaskID, + backupBucketName, + backupPath string, + backupStorage storage.ChunkManager, + milvusStorage storage.ChunkManager, + grpcCli client.Grpc, + restfulCli client.Restful, +) *CollectionTask { + logger := log.With( + zap.String("backup_db_name", task.GetCollBackup().GetDbName()), + zap.String("backup_collection_name", task.GetCollBackup().GetDbName()), + zap.String("target_db_name", task.GetTargetDbName()), + zap.String("target_collection_name", task.GetTargetCollectionName())) + + return &CollectionTask{ + task: task, + + parentTaskID: parentTaskID, + + meta: meta, + + copyParallelism: params.BackupCfg.BackupCopyDataParallelism, + restoreParallelism: params.BackupCfg.RestoreParallelism, + + backupBucketName: backupBucketName, + backupPath: backupPath, + backupRootPath: params.MinioCfg.BackupRootPath, + backupStorage: backupStorage, + + milvusBucketName: params.MinioCfg.BucketName, + milvusStorage: milvusStorage, + + grpcCli: grpcCli, + restfulCli: restfulCli, + + logger: logger, + } +} + +func (ct *CollectionTask) Execute(ctx context.Context) error { + ct.task.StateCode = backuppb.RestoreTaskStateCode_EXECUTING + + // tear down restore task + defer func() { + if err := ct.tearDown(ctx); err != nil { + ct.task.StateCode = backuppb.RestoreTaskStateCode_FAIL + ct.task.ErrorMessage = err.Error() + ct.logger.Error("restore collection tear down failed", zap.Error(err)) + } + }() + + err := ct.privateExecute(ctx) + if err != nil { + ct.task.StateCode = backuppb.RestoreTaskStateCode_FAIL + ct.task.ErrorMessage = err.Error() + ct.logger.Error("restore collection failed", zap.Error(err)) + return err + } + + ct.task.StateCode = backuppb.RestoreTaskStateCode_SUCCESS + ct.logger.Info("restore collection success") + return nil +} + +func (ct *CollectionTask) privateExecute(ctx context.Context) error { + ct.logger.Info("start restore collection", zap.String("backup_bucket_name", ct.backupBucketName), + zap.String("backup_path", ct.backupPath)) + + // restore collection schema + if err := ct.dropExistedColl(ctx); err != nil { + return fmt.Errorf("restore_collection: drop exist collection: %w", err) + } + if err := ct.createColl(ctx); err != nil { + return fmt.Errorf("restore_collection: create collection: %w", err) + } + + // restore collection index + if err := ct.dropExistedIndex(ctx); err != nil { + return fmt.Errorf("restore_collection: drop exist index: %w", err) + } + if err := ct.createIndex(ctx); err != nil { + return fmt.Errorf("restore_collection: create index: %w", err) + } + + // restore collection data + if err := ct.restoreData(ctx); err != nil { + return fmt.Errorf("restore_collection: restore data: %w", err) + } + + return nil +} + +func (ct *CollectionTask) restoreData(ctx context.Context) error { + // restore partition segment + ct.logger.Info("start restore partition segment", zap.Int("partition_num", len(ct.task.GetCollBackup().GetPartitionBackups()))) + for _, part := range ct.task.GetCollBackup().GetPartitionBackups() { + if err := ct.restorePartitionV1(ctx, part); err != nil { + return fmt.Errorf("restore_collection: restore partition data v1: %w", err) + } + } + + // restore global l0 segment + ct.logger.Info("start restore global L0 segment", zap.Int("l0_segments", len(ct.task.GetCollBackup().GetL0Segments()))) + if err := ct.restoreL0Seg(ctx, -1, "", ct.task.GetCollBackup().GetL0Segments()); err != nil { + return fmt.Errorf("restore_collection: restore global L0 segment: %w", err) + } + + return nil +} + +func (ct *CollectionTask) tearDown(ctx context.Context) error { + ct.logger.Info("restore task tear down") + + slices.Reverse(ct.tearDownFns) + + if ct.tearDownFns != nil { + for _, fn := range ct.tearDownFns { + if err := fn(ctx); err != nil { + ct.logger.Error("tear down restore task failed", zap.Error(err)) + return err + } + } + } + + return nil +} + +func (ct *CollectionTask) dropExistedColl(ctx context.Context) error { + if !ct.task.GetDropExistCollection() { + ct.logger.Info("skip drop existed collection") + return nil + } + + exist, err := ct.grpcCli.HasCollection(ctx, ct.task.GetTargetDbName(), ct.task.GetTargetCollectionName()) + if err != nil { + return fmt.Errorf("restore_collection: failed to check collection exist: %w", err) + } + if !exist { + ct.logger.Info("collection not exist, skip drop collection") + return nil + } + + if err := ct.grpcCli.DropCollection(ctx, ct.task.GetTargetDbName(), ct.task.TargetCollectionName); err != nil { + return fmt.Errorf("restore_collection: failed to drop collection: %w", err) + } + + return nil +} + +func (ct *CollectionTask) createColl(ctx context.Context) error { + if ct.task.GetSkipCreateCollection() { + ct.logger.Info("skip create collection") + return nil + } + + fields, err := ct.fields() + if err != nil { + return fmt.Errorf("restore_collection: failed to get fields: %w", err) + } + ct.logger.Info("restore collection fields", zap.Any("fields", fields)) + + functions := ct.functions() + ct.logger.Info("restore collection functions", zap.Any("functions", functions)) + schema := &schemapb.CollectionSchema{ + Name: ct.task.GetTargetCollectionName(), + Description: ct.task.GetCollBackup().GetSchema().GetDescription(), + AutoID: ct.task.GetCollBackup().GetSchema().GetAutoID(), + Functions: functions, + Fields: fields, + EnableDynamicField: ct.task.GetCollBackup().GetSchema().GetEnableDynamicField(), + } + + // overwrite shardNum by request parameter + shardNum := ct.task.GetCollBackup().GetShardsNum() + if shardNum > ct.task.GetMaxShardNum() && ct.task.GetMaxShardNum() != 0 { + shardNum = ct.task.GetMaxShardNum() + ct.logger.Info("overwrite shardNum by request parameter", + zap.Int32("oldShardNum", ct.task.GetCollBackup().GetShardsNum()), + zap.Int32("newShardNum", shardNum)) + } + + opt := client.CreateCollectionInput{ + DB: ct.task.GetTargetDbName(), + Schema: schema, + ConsLevel: commonpb.ConsistencyLevel(ct.task.GetCollBackup().GetConsistencyLevel()), + ShardNum: shardNum, + } + + if err := ct.grpcCli.CreateCollection(ctx, opt); err != nil { + return fmt.Errorf("restore_collection: failed to create collection: %w", err) + } + + return nil +} + +func (ct *CollectionTask) fields() ([]*schemapb.FieldSchema, error) { + bakFields := ct.task.GetCollBackup().GetSchema().GetFields() + fields := make([]*schemapb.FieldSchema, 0, len(bakFields)) + + for _, bakField := range bakFields { + fieldRestore := &schemapb.FieldSchema{ + FieldID: bakField.GetFieldID(), + Name: bakField.GetName(), + IsPrimaryKey: bakField.GetIsPrimaryKey(), + AutoID: bakField.GetAutoID(), + Description: bakField.GetDescription(), + DataType: schemapb.DataType(bakField.GetDataType()), + TypeParams: pbconv.BakKVToMilvusKV(bakField.GetTypeParams(), ct.task.SkipParams.GetFiledTypeParams()...), + IndexParams: pbconv.BakKVToMilvusKV(bakField.GetIndexParams(), ct.task.SkipParams.GetFiledIndexParams()...), + IsDynamic: bakField.GetIsDynamic(), + IsPartitionKey: bakField.GetIsPartitionKey(), + Nullable: bakField.GetNullable(), + ElementType: schemapb.DataType(bakField.GetElementType()), + IsFunctionOutput: bakField.IsFunctionOutput, + } + if bakField.DefaultValueProto != "" { + var defaultValue schemapb.ValueField + err := proto.Unmarshal([]byte(bakField.DefaultValueProto), &defaultValue) + if err != nil { + return nil, fmt.Errorf("restore_collection: failed to unmarshal default value: %w", err) + } + fieldRestore.DefaultValue = &defaultValue + } + + fields = append(fields, fieldRestore) + } + + return fields, nil +} + +func (ct *CollectionTask) functions() []*schemapb.FunctionSchema { + bakFuncs := ct.task.GetCollBackup().GetSchema().GetFunctions() + functions := make([]*schemapb.FunctionSchema, 0, len(bakFuncs)) + for _, bakFunc := range bakFuncs { + fun := &schemapb.FunctionSchema{ + Name: bakFunc.Name, + Id: bakFunc.Id, + Description: bakFunc.Description, + Type: schemapb.FunctionType(bakFunc.Type), + InputFieldNames: bakFunc.InputFieldNames, + InputFieldIds: bakFunc.InputFieldIds, + OutputFieldNames: bakFunc.OutputFieldNames, + OutputFieldIds: bakFunc.OutputFieldIds, + Params: pbconv.BakKVToMilvusKV(bakFunc.Params), + } + functions = append(functions, fun) + } + + return functions +} + +func (ct *CollectionTask) dropExistedIndex(ctx context.Context) error { + if !ct.task.GetDropExistIndex() { + ct.logger.Info("skip drop existed index") + return nil + } + + indexes, err := ct.grpcCli.ListIndex(ctx, ct.task.GetTargetDbName(), ct.task.GetTargetCollectionName()) + if err != nil { + log.Error("fail in DescribeIndex", zap.Error(err)) + return nil + } + + for _, index := range indexes { + err = ct.grpcCli.DropIndex(ctx, ct.task.GetTargetDbName(), ct.task.TargetCollectionName, index.IndexName) + if err != nil { + return fmt.Errorf("restore_collection: failed to drop index %s: %w", index.IndexName, err) + } + ct.logger.Info("drop index", zap.String("field_name", index.FieldName), + zap.String("index_name", index.IndexName)) + } + + return nil +} + +func (ct *CollectionTask) createIndex(ctx context.Context) error { + if !ct.task.GetRestoreIndex() { + ct.logger.Info("skip restore index") + return nil + } + + vectorFields := make(map[string]struct{}) + for _, field := range ct.task.GetCollBackup().GetSchema().GetFields() { + typStr, ok := schemapb.DataType_name[int32(field.DataType)] + if ok { + return fmt.Errorf("restore_collection: failed to get field type: %s", typStr) + } + + if strings.HasSuffix(strings.ToLower(typStr), "vector") { + vectorFields[field.Name] = struct{}{} + } + } + + indexes := ct.task.GetCollBackup().GetIndexInfos() + for _, index := range indexes { + log.Info("source index", zap.String("index_name", index.GetIndexName()), + zap.Any("params", index.GetParams())) + + params := make(map[string]string) + if _, ok := vectorFields[index.GetFieldName()]; ok && ct.task.GetUseAutoIndex() { + log.Info("use auto index") + params = map[string]string{"index_type": "AUTOINDEX", "metric_type": index.GetParams()["metric_type"]} + } else { + log.Info("use source index") + params = index.GetParams() + if params["index_type"] == "marisa-trie" { + params["index_type"] = "Trie" + } + } + + opt := client.CreateIndexInput{ + DB: ct.task.GetTargetDbName(), + CollectionName: ct.task.GetTargetCollectionName(), + FieldName: index.GetFieldName(), + IndexName: index.GetIndexName(), + Params: params, + } + if err := ct.grpcCli.CreateIndex(ctx, opt); err != nil { + return fmt.Errorf("restore_collection: failed to create index %s: %w", index.GetIndexName(), err) + } + } + + return nil +} + +func (ct *CollectionTask) cleanTempFiles(dir string) tearDownFn { + return func(ctx context.Context) error { + if len(dir) == 0 { + return errors.New("restore_collection: empty temporary file dir") + } + + ct.logger.Info("delete temporary file", zap.String("dir", dir)) + err := ct.milvusStorage.RemoveWithPrefix(ctx, ct.milvusBucketName, dir) + if err != nil { + return fmt.Errorf("restore_collection: failed to delete temporary file: %w", err) + } + + return nil + } +} + +func (ct *CollectionTask) createPartition(ctx context.Context, partitionName string) error { + // pre-check whether partition exist, if not create it + ct.logger.Debug("check partition exist", zap.String("partition_name", partitionName)) + exist, err := ct.grpcCli.HasPartition(ctx, ct.task.GetTargetDbName(), ct.task.GetTargetCollectionName(), partitionName) + if err != nil { + return fmt.Errorf("restore_collection: failed to check partition exist: %w", err) + } + if exist { + ct.logger.Info("partition exist, skip create partition") + return nil + } + + err = ct.grpcCli.CreatePartition(ctx, ct.task.GetTargetDbName(), ct.task.GetTargetCollectionName(), partitionName) + if err != nil { + ct.logger.Debug("create partition failed", zap.String("partition_name", partitionName), zap.Error(err)) + return fmt.Errorf("restore_collection: failed to create partition: %w", err) + } + ct.logger.Debug("create partition success", zap.String("partition_name", partitionName)) + return nil +} + +func (ct *CollectionTask) copyFiles(ctx context.Context, paths []string) ([]string, error) { + isSameBucket := ct.milvusBucketName == ct.backupBucketName + isSameStorage := ct.backupStorage.Config().StorageType == ct.milvusStorage.Config().StorageType + // if milvus bucket and backup bucket are not the same, should copy the data first + if isSameBucket && isSameStorage { + ct.logger.Info("milvus and backup store in the same bucket, no need to copy the data") + return paths, nil + } + + tempPaths := make([]string, 0, len(paths)) + tempDir := fmt.Sprintf("restore-temp-%s-%s-%s/", ct.parentTaskID, ct.task.GetTargetDbName(), ct.task.GetTargetCollectionName()) + ct.logger.Info("milvus and backup store in different bucket, copy the data first", + zap.Strings("paths", paths), zap.String("copy_data_path", tempDir)) + for _, p := range paths { + // empty delta path, no need to copy + if len(p) == 0 { + tempPaths = append(tempPaths, p) + continue + } + + tempPath := path.Join(tempDir, strings.Replace(p, ct.backupRootPath, "", 1)) + "/" + ct.logger.Info("copy temporary restore file", zap.String("from", p), zap.String("to", tempPath)) + + opt := storage.CopyOption{ + WorkerNum: ct.copyParallelism, + RPS: 1000, + CopyByServer: true, + } + copier := storage.NewCopier(ct.backupStorage, ct.milvusStorage, opt) + if err := copier.Copy(ctx, p, tempPath, ct.backupBucketName, ct.milvusBucketName); err != nil { + ct.logger.Error("fail to copy backup date from backup bucket to restore target milvus bucket after retry", zap.Error(err)) + return nil, fmt.Errorf("restore_collection: failed to copy backup data: %w", err) + } + tempPaths = append(tempPaths, tempPath) + } + + ct.tearDownFns = append(ct.tearDownFns, ct.cleanTempFiles(tempDir)) + return tempPaths, nil +} + +type restoreGroup struct { + insertLogDir string + deltaLogDir string + + size int64 +} + +func (ct *CollectionTask) restoreNotL0SegV1(ctx context.Context, part *backuppb.PartitionBackupInfo) error { + ct.logger.Info("start restore not L0 segment") + notL0Groups, err := ct.notL0Groups(ctx, part) + if err != nil { + return fmt.Errorf("restore_collection: get not L0 groups: %w", err) + } + + wp, err := common.NewWorkerPool(ctx, ct.restoreParallelism, 0) + if err != nil { + return fmt.Errorf("restore_collection: restore data v1 create worker pool: %w", err) + } + wp.Start() + + for _, g := range notL0Groups { + job := func(ctx context.Context) error { + paths, err := ct.copyFiles(ctx, []string{g.insertLogDir, g.deltaLogDir}) + if err != nil { + return fmt.Errorf("restore_collection: restore data v1 copy files: %w", err) + } + + if err := ct.bulkInsertViaGrpc(ctx, part.GetPartitionName(), paths, false); err != nil { + return fmt.Errorf("restore_collection: restore data v1 bulk insert via grpc: %w", err) + } + + opt := meta.AddCollectionRestoredSize(ct.task.GetCollBackup().GetCollectionId(), g.size) + ct.meta.UpdateRestoreTask(ct.parentTaskID, opt) + ct.restoredSize.Add(g.size) + ct.task.RestoredSize = ct.restoredSize.Load() + return nil + } + wp.Submit(job) + } + wp.Done() + if err := wp.Wait(); err != nil { + return fmt.Errorf("restore_collection: wait worker pool: %w", err) + } + + return nil +} + +func (ct *CollectionTask) restoreL0Seg(ctx context.Context, partitionID int64, partitionName string, l0Segs []*backuppb.SegmentBackupInfo) error { + for _, seg := range l0Segs { + opts := []mpath.PathOption{ + mpath.CollectionID(ct.task.GetCollBackup().CollectionId), + mpath.PartitionID(partitionID), + mpath.SegmentID(seg.SegmentId)} + + deltaLogDir := mpath.DeltaLogDir(ct.backupPath, opts...) + paths, err := ct.copyFiles(ctx, []string{deltaLogDir}) + if err != nil { + return fmt.Errorf("restore_collection: restore L0 segment copy files: %w", err) + } + + if err := ct.bulkInsertViaGrpc(ctx, partitionName, paths, true); err != nil { + return fmt.Errorf("restore_collection: restore L0 segment bulk insert via grpc: %w", err) + } + } + + return nil +} + +func (ct *CollectionTask) restorePartitionV1(ctx context.Context, part *backuppb.PartitionBackupInfo) error { + log.Info("start restore partition", zap.String("partition", part.GetPartitionName())) + + if err := ct.createPartition(ctx, part.GetPartitionName()); err != nil { + return fmt.Errorf("restore_collection: restore partition: %w", err) + } + + ct.logger.Info("start restore not L0 segment", zap.String("partition_name", part.GetPartitionName())) + // restore not L0 data groups + if err := ct.restoreNotL0SegV1(ctx, part); err != nil { + return fmt.Errorf("restore_collection: restore not L0 groups: %w", err) + } + + ct.logger.Info("start restore L0 segment", zap.String("partition_name", part.GetPartitionName())) + // restore partition L0 segment + l0Segs := lo.Filter(part.GetSegmentBackups(), func(seg *backuppb.SegmentBackupInfo, _ int) bool { + return seg.IsL0 + }) + if err := ct.restoreL0Seg(ctx, part.GetPartitionId(), part.GetPartitionName(), l0Segs); err != nil { + return fmt.Errorf("restore_collection: restore L0 segment: %w", err) + } + + return nil +} + +func (ct *CollectionTask) notL0Groups(ctx context.Context, part *backuppb.PartitionBackupInfo) ([]restoreGroup, error) { + gm := make(map[int64]struct{}) + for _, seg := range part.GetSegmentBackups() { + if seg.IsL0 { + continue + } + + gm[seg.GetGroupId()] = struct{}{} + } + groupIDs := maps.Keys(gm) + + groups := make([]restoreGroup, 0, len(groupIDs)) + if len(groupIDs) == 1 && groupIDs[0] == 0 { + // backward compatible old backup without group id + insertLogDir, deltaLogDir, size, err := ct.getBackupPartitionPaths(ctx, part) + if err != nil { + return nil, fmt.Errorf("restore_collection: get partition backup binlog files: %w", err) + } + return []restoreGroup{{insertLogDir: insertLogDir, deltaLogDir: deltaLogDir, size: size}}, nil + } + + for _, gID := range groupIDs { + insertLogDir, deltaLogDir, size, err := ct.getBackupPartitionPaths(ctx, part) + if err != nil { + return nil, fmt.Errorf("restore_collection: get partition backup binlog files with group: %w", err) + } + insertLogDir = path.Join(insertLogDir, strconv.FormatInt(gID, 10)) + mpath.Separator + if len(deltaLogDir) > 0 { + deltaLogDir = path.Join(deltaLogDir, strconv.FormatInt(gID, 10)) + mpath.Separator + } + groups = append(groups, restoreGroup{insertLogDir: insertLogDir, deltaLogDir: deltaLogDir, size: size}) + } + + return groups, nil +} + +func (ct *CollectionTask) bulkInsertViaGrpc(ctx context.Context, partition string, paths []string, isL0 bool) error { + ct.logger.Info("start bulk insert via grpc", zap.Strings("paths", paths), zap.String("partition", partition)) + in := client.BulkInsertInput{ + DB: ct.task.GetTargetDbName(), + CollectionName: ct.task.GetTargetCollectionName(), + PartitionName: partition, + Paths: paths, + EndTime: ct.task.GetCollBackup().EndTime, + IsL0: isL0, + SkipDiskQuotaCheck: ct.task.GetSkipDiskQuotaCheck(), + } + jobID, err := ct.grpcCli.BulkInsert(ctx, in) + if err != nil { + return fmt.Errorf("restore_collection: failed to bulk insert via grpc: %w", err) + } + ct.logger.Info("create bulk insert via grpc success", zap.Int64("job_id", jobID)) + + // wait for bulk insert job done + var lastProgress int + lastUpdateTime := time.Now() + for range time.Tick(_bulkInsertCheckInterval) { + state, err := ct.grpcCli.GetBulkInsertState(ctx, jobID) + if err != nil { + return fmt.Errorf("restore_collection: failed to get bulk insert state: %w", err) + } + + ct.logger.Info("bulk insert task state", zap.Int64("jobID", jobID), zap.Any("state", state.State), + zap.Any("info", state.Infos)) + switch state.State { + case commonpb.ImportState_ImportFailed: + return fmt.Errorf("restore_collection: bulk insert failed: %s", getFailedReason(state.Infos)) + case commonpb.ImportState_ImportCompleted: + ct.logger.Info("bulk insert task success", zap.Int64("job_id", jobID)) + return nil + default: + currentProgress := getProcess(state.Infos) + if currentProgress > lastProgress { + lastUpdateTime = time.Now() + } else if time.Now().Sub(lastUpdateTime) >= _bulkInsertTimeout { + ct.logger.Warn("bulk insert task timeout", zap.Int64("job_id", jobID), + zap.Duration("timeout", _bulkInsertTimeout)) + return errors.New("restore_collection: bulk insert timeout") + } + continue + } + } + + return errors.New("restore_collection: walk into unreachable code") +} + +func getProcess(infos []*commonpb.KeyValuePair) int { + m := lo.SliceToMap(infos, func(info *commonpb.KeyValuePair) (string, string) { + return info.Key, info.Value + }) + if val, ok := m["progress_percent"]; ok { + progress, err := strconv.Atoi(val) + if err != nil { + return 0 + } + return progress + } + return 0 +} + +func getFailedReason(infos []*commonpb.KeyValuePair) string { + m := lo.SliceToMap(infos, func(info *commonpb.KeyValuePair) (string, string) { + return info.Key, info.Value + }) + + if val, ok := m["failed_reason"]; ok { + return val + } + return "" +} + +func (ct *CollectionTask) getBackupPartitionPaths(ctx context.Context, part *backuppb.PartitionBackupInfo) (string, string, int64, error) { + insertLogDir := mpath.InsertLogDir(ct.backupPath, mpath.CollectionID(part.CollectionId), mpath.PartitionID(part.PartitionId)) + deltaLogDir := mpath.DeltaLogDir(ct.backupPath, mpath.CollectionID(part.CollectionId), mpath.PartitionID(part.PartitionId)) + + exist, err := ct.backupStorage.Exist(ctx, ct.backupBucketName, deltaLogDir) + if err != nil { + return "", "", 0, fmt.Errorf("restore_collection: check delta log exist: %w", err) + } + log.Debug("partition log path", + zap.Int64("partition_id", part.PartitionId), + zap.String("partition_name", part.PartitionName), + zap.String("delta_log_dir", deltaLogDir), + zap.String("insert_log_dir", insertLogDir)) + + if exist { + return insertLogDir, deltaLogDir, part.GetSize(), nil + } else { + return insertLogDir, "", part.GetSize(), nil + } +} diff --git a/core/restore/collection_test.go b/core/restore/collection_test.go new file mode 100644 index 0000000..9b70a15 --- /dev/null +++ b/core/restore/collection_test.go @@ -0,0 +1 @@ +package restore diff --git a/core/storage/chunk_manager.go b/core/storage/chunk_manager.go index 947435b..4408b47 100644 --- a/core/storage/chunk_manager.go +++ b/core/storage/chunk_manager.go @@ -35,7 +35,7 @@ type ChunkManager interface { UploadObject(ctx context.Context, i UploadObjectInput) error } -func NewChunkManager(ctx context.Context, params paramtable.BackupParams, config *StorageConfig) (ChunkManager, error) { +func NewChunkManager(ctx context.Context, params *paramtable.BackupParams, config *StorageConfig) (ChunkManager, error) { switch config.StorageType { case paramtable.Local: return NewLocalChunkManager(ctx, config) @@ -47,7 +47,7 @@ func NewChunkManager(ctx context.Context, params paramtable.BackupParams, config } } -func newAzureChunkManagerWithParams(ctx context.Context, params paramtable.BackupParams, config *StorageConfig) (*AzureChunkManager, error) { +func newAzureChunkManagerWithParams(ctx context.Context, params *paramtable.BackupParams, config *StorageConfig) (*AzureChunkManager, error) { c := newDefaultConfig() c.Address = params.MinioCfg.Address + ":" + params.MinioCfg.Port c.AccessKeyID = params.MinioCfg.AccessKeyID diff --git a/core/storage/local_chunk_manager.go b/core/storage/local_chunk_manager.go index 47de78d..4046d33 100644 --- a/core/storage/local_chunk_manager.go +++ b/core/storage/local_chunk_manager.go @@ -26,8 +26,9 @@ import ( "path/filepath" "strings" - "github.com/cockroachdb/errors" "github.com/zilliztech/milvus-backup/internal/log" + + "github.com/cockroachdb/errors" ) func WrapErrFileNotFound(key string) error { diff --git a/core/storage/mpath/path.go b/core/storage/mpath/path.go new file mode 100644 index 0000000..e305286 --- /dev/null +++ b/core/storage/mpath/path.go @@ -0,0 +1,104 @@ +package mpath + +import ( + "path" + "strconv" +) + +const ( + _binlogPrefix = "binlogs" + _insertLogPrefix = "insert_log" + _deltaLogPrefix = "delta_log" +) + +const Separator = "/" + +// milvus bin log path +// insert log +// ${root}/insert_log/${collection_id}/${partition_id}/${segment_id}/${field_id}/${log_idx} +// delta log +// ${root}/delta_log/${collection_id}/${partition_id}/${segment_id}/${field_id}/${log_idx} + +// backup bin log path +// insert log +// ${root}/binglogs/insert_log/${collection_id}/${partition_id}/${groupId}(optional)/${segment_id}/${field_id}/${log_idx} +// delta log +// ${root}/binglogs/delta_log/${collection_id}/${partition_id}/${groupId}(optional)/${segment_id}/${field_id}/${log_idx} + +func LogDir(base, typePrefix string, opts ...PathOption) string { + elem := []string{base, _binlogPrefix, typePrefix} + + opt := &PathOpt{} + for _, o := range opts { + o(opt) + } + + if opt.setCollectionID { + elem = append(elem, strconv.FormatInt(opt.collectionID, 10)) + } + if opt.setPartitionID { + elem = append(elem, strconv.FormatInt(opt.partitionID, 10)) + } + if opt.setGroupID { + elem = append(elem, strconv.FormatInt(opt.groupID, 10)) + } + if opt.setSegmentID { + elem = append(elem, strconv.FormatInt(opt.segmentID, 10)) + } + + return path.Join(elem...) + Separator +} + +// InsertLogDir returns the directory for insert logs. +func InsertLogDir(base string, opts ...PathOption) string { + return LogDir(base, _insertLogPrefix, opts...) +} + +// DeltaLogDir returns the directory for insert logs. +func DeltaLogDir(base string, opts ...PathOption) string { + return LogDir(base, _deltaLogPrefix, opts...) +} + +type PathOpt struct { + collectionID int64 + setCollectionID bool + + partitionID int64 + setPartitionID bool + + groupID int64 + setGroupID bool + + segmentID int64 + setSegmentID bool +} + +type PathOption func(*PathOpt) + +func CollectionID(collectionID int64) PathOption { + return func(opt *PathOpt) { + opt.collectionID = collectionID + opt.setCollectionID = true + } +} + +func PartitionID(partitionID int64) PathOption { + return func(opt *PathOpt) { + opt.partitionID = partitionID + opt.setPartitionID = true + } +} + +func GroupID(groupID int64) PathOption { + return func(opt *PathOpt) { + opt.groupID = groupID + opt.setGroupID = true + } +} + +func SegmentID(segmentID int64) PathOption { + return func(opt *PathOpt) { + opt.segmentID = segmentID + opt.setSegmentID = true + } +} diff --git a/core/storage/mpath/path_test.go b/core/storage/mpath/path_test.go new file mode 100644 index 0000000..205f3a1 --- /dev/null +++ b/core/storage/mpath/path_test.go @@ -0,0 +1,85 @@ +package mpath + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +type testCase struct { + base string + expected string +} + +func TestInsertLogDir(t *testing.T) { + collectionID := int64(1) + partitionID := int64(2) + + // Without group id + cases := []testCase{ + {base: "base", expected: "base/binlogs/insert_log/1/2/"}, + {base: "base/", expected: "base/binlogs/insert_log/1/2/"}, + {base: "base/subdir", expected: "base/subdir/binlogs/insert_log/1/2/"}, + {base: "base/subdir/", expected: "base/subdir/binlogs/insert_log/1/2/"}, + } + for _, test := range cases { + r := InsertLogDir(test.base, CollectionID(collectionID), PartitionID(partitionID)) + assert.Equal(t, test.expected, r) + } + + // With group id + groupID := int64(3) + cases = []testCase{ + {base: "base", expected: "base/binlogs/insert_log/1/2/3/"}, + {base: "base/", expected: "base/binlogs/insert_log/1/2/3/"}, + {base: "base/subdir", expected: "base/subdir/binlogs/insert_log/1/2/3/"}, + {base: "base/subdir/", expected: "base/subdir/binlogs/insert_log/1/2/3/"}, + } + for _, test := range cases { + r := InsertLogDir(test.base, CollectionID(collectionID), PartitionID(partitionID), GroupID(groupID)) + assert.Equal(t, test.expected, r) + } +} + +func TestPartitionDeltaLogDir(t *testing.T) { + collectionID := int64(1) + partitionID := int64(2) + + // Without group id + cases := []testCase{ + {base: "base", expected: "base/binlogs/delta_log/1/2/"}, + {base: "base/", expected: "base/binlogs/delta_log/1/2/"}, + {base: "base/subdir", expected: "base/subdir/binlogs/delta_log/1/2/"}, + {base: "base/subdir/", expected: "base/subdir/binlogs/delta_log/1/2/"}, + } + for _, test := range cases { + r := DeltaLogDir(test.base, CollectionID(collectionID), PartitionID(partitionID)) + assert.Equal(t, test.expected, r) + } + + // With group id + groupID := int64(3) + cases = []testCase{ + {base: "base", expected: "base/binlogs/delta_log/1/2/3/"}, + {base: "base/", expected: "base/binlogs/delta_log/1/2/3/"}, + {base: "base/subdir", expected: "base/subdir/binlogs/delta_log/1/2/3/"}, + {base: "base/subdir/", expected: "base/subdir/binlogs/delta_log/1/2/3/"}, + } + for _, test := range cases { + r := DeltaLogDir(test.base, CollectionID(collectionID), PartitionID(partitionID), GroupID(groupID)) + assert.Equal(t, test.expected, r) + } + + // with segment id + segmentID := int64(4) + cases = []testCase{ + {base: "base", expected: "base/binlogs/delta_log/1/2/4/"}, + {base: "base/", expected: "base/binlogs/delta_log/1/2/4/"}, + {base: "base/subdir", expected: "base/subdir/binlogs/delta_log/1/2/4/"}, + {base: "base/subdir/", expected: "base/subdir/binlogs/delta_log/1/2/4/"}, + } + for _, test := range cases { + r := DeltaLogDir(test.base, CollectionID(collectionID), PartitionID(partitionID), SegmentID(segmentID)) + assert.Equal(t, test.expected, r) + } +} diff --git a/core/utils/backup_request_util.go b/core/utils/backup_request_util.go index 160fed8..0f05a3e 100644 --- a/core/utils/backup_request_util.go +++ b/core/utils/backup_request_util.go @@ -3,6 +3,7 @@ package utils import ( "github.com/golang/protobuf/jsonpb" structpb "github.com/golang/protobuf/ptypes/struct" + "github.com/zilliztech/milvus-backup/core/proto/backuppb" ) diff --git a/core/utils/convert_util.go b/core/utils/convert_util.go index 9f0b705..84f2117 100644 --- a/core/utils/convert_util.go +++ b/core/utils/convert_util.go @@ -9,6 +9,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/milvus-io/milvus-proto/go-api/v2/msgpb" + "github.com/zilliztech/milvus-backup/core/proto/backuppb" ) diff --git a/core/utils/version_util.go b/core/utils/version_util.go index ee45635..792e8ab 100644 --- a/core/utils/version_util.go +++ b/core/utils/version_util.go @@ -1,8 +1,9 @@ package utils import ( - "github.com/blang/semver/v4" "strings" + + "github.com/blang/semver/v4" ) const ( diff --git a/docs/docs.go b/docs/docs.go index 7bc1fc5..7898525 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -1,5 +1,4 @@ -// Package docs GENERATED BY SWAG; DO NOT EDIT -// This file was generated by swaggo/swag +// Package docs Code generated by swaggo/swag. DO NOT EDIT package docs import "github.com/swaggo/swag" @@ -449,12 +448,14 @@ const docTemplate = `{ "type": "object", "properties": { "autoID": { + "description": "deprecated later, keep compatible with c++ part now", "type": "boolean" }, "description": { "type": "string" }, "enable_dynamic_field": { + "description": "mark whether this table has the dynamic field function enabled.", "type": "boolean" }, "fields": { @@ -463,8 +464,20 @@ const docTemplate = `{ "$ref": "#/definitions/backuppb.FieldSchema" } }, + "functions": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.FunctionSchema" + } + }, "name": { "type": "string" + }, + "properties": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.KeyValuePair" + } } } }, @@ -477,6 +490,10 @@ const docTemplate = `{ 3, 4 ], + "x-enum-comments": { + "ConsistencyLevel_Customized": "Users pass their own ` + "`" + `guarantee_timestamp` + "`" + `.", + "ConsistencyLevel_Session": "default in PyMilvus" + }, "x-enum-varnames": [ "ConsistencyLevel_Strong", "ConsistencyLevel_Session", @@ -558,6 +575,9 @@ const docTemplate = `{ 103, 104 ], + "x-enum-comments": { + "DataType_VarChar": "variable-length strings with a specified maximum length" + }, "x-enum-varnames": [ "DataType_None", "DataType_Bool", @@ -623,16 +643,27 @@ const docTemplate = `{ "$ref": "#/definitions/backuppb.DataType" }, "default_value": { - "$ref": "#/definitions/backuppb.ValueField" + "description": "default_value only support scalars except array and json for now", + "allOf": [ + { + "$ref": "#/definitions/backuppb.ValueField" + } + ] }, "default_value_proto": { + "description": "json not support marshall oneof, so use proto string", "type": "string" }, "description": { "type": "string" }, "element_type": { - "$ref": "#/definitions/backuppb.DataType" + "description": "For array type, the element type is stored here", + "allOf": [ + { + "$ref": "#/definitions/backuppb.DataType" + } + ] }, "fieldID": { "type": "integer" @@ -644,9 +675,14 @@ const docTemplate = `{ } }, "is_dynamic": { + "description": "mark whether this field is the dynamic field", + "type": "boolean" + }, + "is_function_output": { "type": "boolean" }, "is_partition_key": { + "description": "enable logic partitions", "type": "boolean" }, "is_primary_key": { @@ -659,7 +695,12 @@ const docTemplate = `{ "type": "boolean" }, "state": { - "$ref": "#/definitions/backuppb.FieldState" + "description": "To keep compatible with older version, the default state is ` + "`" + `Created` + "`" + `.", + "allOf": [ + { + "$ref": "#/definitions/backuppb.FieldState" + } + ] }, "type_params": { "type": "array", @@ -684,6 +725,66 @@ const docTemplate = `{ "FieldState_FieldDropped" ] }, + "backuppb.FunctionSchema": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "input_field_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "input_field_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "output_field_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "output_field_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "params": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.KeyValuePair" + } + }, + "type": { + "$ref": "#/definitions/backuppb.FunctionType" + } + } + }, + "backuppb.FunctionType": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "x-enum-varnames": [ + "FunctionType_Unknown", + "FunctionType_BM25", + "FunctionType_TextEmbedding" + ] + }, "backuppb.GrantEntity": { "type": "object", "properties": { @@ -959,6 +1060,14 @@ const docTemplate = `{ "description": "if true, skip the diskQuota in Import", "type": "boolean" }, + "skip_params": { + "description": "if key is set, will skip the params in restore process", + "allOf": [ + { + "$ref": "#/definitions/backuppb.SkipParams" + } + ] + }, "useAutoIndex": { "description": "if true use autoindex when restore vector index", "type": "boolean" @@ -1083,6 +1192,9 @@ const docTemplate = `{ "skipDiskQuotaCheck": { "type": "boolean" }, + "skip_params": { + "$ref": "#/definitions/backuppb.SkipParams" + }, "start_time": { "type": "integer" }, @@ -1203,6 +1315,35 @@ const docTemplate = `{ } } }, + "backuppb.SkipParams": { + "type": "object", + "properties": { + "collection_properties": { + "type": "array", + "items": { + "type": "string" + } + }, + "filed_index_params": { + "type": "array", + "items": { + "type": "string" + } + }, + "filed_type_params": { + "type": "array", + "items": { + "type": "string" + } + }, + "index_params": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, "backuppb.UserEntity": { "type": "object", "properties": { @@ -1232,7 +1373,7 @@ const docTemplate = `{ "type": "object", "properties": { "data": { - "description": "Types that are valid to be assigned to Data:\n\n\t*ValueField_BoolData\n\t*ValueField_IntData\n\t*ValueField_LongData\n\t*ValueField_FloatData\n\t*ValueField_DoubleData\n\t*ValueField_StringData\n\t*ValueField_BytesData" + "description": "Types that are assignable to Data:\n\n\t*ValueField_BoolData\n\t*ValueField_IntData\n\t*ValueField_LongData\n\t*ValueField_FloatData\n\t*ValueField_DoubleData\n\t*ValueField_StringData\n\t*ValueField_BytesData" } } } @@ -1249,6 +1390,8 @@ var SwaggerInfo = &swag.Spec{ Description: "A data backup & restore tool for Milvus", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", } func init() { diff --git a/docs/swagger.json b/docs/swagger.json index d6aea68..e07ba2c 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -441,12 +441,14 @@ "type": "object", "properties": { "autoID": { + "description": "deprecated later, keep compatible with c++ part now", "type": "boolean" }, "description": { "type": "string" }, "enable_dynamic_field": { + "description": "mark whether this table has the dynamic field function enabled.", "type": "boolean" }, "fields": { @@ -455,8 +457,20 @@ "$ref": "#/definitions/backuppb.FieldSchema" } }, + "functions": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.FunctionSchema" + } + }, "name": { "type": "string" + }, + "properties": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.KeyValuePair" + } } } }, @@ -469,6 +483,10 @@ 3, 4 ], + "x-enum-comments": { + "ConsistencyLevel_Customized": "Users pass their own `guarantee_timestamp`.", + "ConsistencyLevel_Session": "default in PyMilvus" + }, "x-enum-varnames": [ "ConsistencyLevel_Strong", "ConsistencyLevel_Session", @@ -550,6 +568,9 @@ 103, 104 ], + "x-enum-comments": { + "DataType_VarChar": "variable-length strings with a specified maximum length" + }, "x-enum-varnames": [ "DataType_None", "DataType_Bool", @@ -615,16 +636,27 @@ "$ref": "#/definitions/backuppb.DataType" }, "default_value": { - "$ref": "#/definitions/backuppb.ValueField" + "description": "default_value only support scalars except array and json for now", + "allOf": [ + { + "$ref": "#/definitions/backuppb.ValueField" + } + ] }, "default_value_proto": { + "description": "json not support marshall oneof, so use proto string", "type": "string" }, "description": { "type": "string" }, "element_type": { - "$ref": "#/definitions/backuppb.DataType" + "description": "For array type, the element type is stored here", + "allOf": [ + { + "$ref": "#/definitions/backuppb.DataType" + } + ] }, "fieldID": { "type": "integer" @@ -636,9 +668,14 @@ } }, "is_dynamic": { + "description": "mark whether this field is the dynamic field", + "type": "boolean" + }, + "is_function_output": { "type": "boolean" }, "is_partition_key": { + "description": "enable logic partitions", "type": "boolean" }, "is_primary_key": { @@ -651,7 +688,12 @@ "type": "boolean" }, "state": { - "$ref": "#/definitions/backuppb.FieldState" + "description": "To keep compatible with older version, the default state is `Created`.", + "allOf": [ + { + "$ref": "#/definitions/backuppb.FieldState" + } + ] }, "type_params": { "type": "array", @@ -676,6 +718,66 @@ "FieldState_FieldDropped" ] }, + "backuppb.FunctionSchema": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "input_field_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "input_field_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "output_field_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "output_field_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "params": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.KeyValuePair" + } + }, + "type": { + "$ref": "#/definitions/backuppb.FunctionType" + } + } + }, + "backuppb.FunctionType": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "x-enum-varnames": [ + "FunctionType_Unknown", + "FunctionType_BM25", + "FunctionType_TextEmbedding" + ] + }, "backuppb.GrantEntity": { "type": "object", "properties": { @@ -951,6 +1053,14 @@ "description": "if true, skip the diskQuota in Import", "type": "boolean" }, + "skip_params": { + "description": "if key is set, will skip the params in restore process", + "allOf": [ + { + "$ref": "#/definitions/backuppb.SkipParams" + } + ] + }, "useAutoIndex": { "description": "if true use autoindex when restore vector index", "type": "boolean" @@ -1075,6 +1185,9 @@ "skipDiskQuotaCheck": { "type": "boolean" }, + "skip_params": { + "$ref": "#/definitions/backuppb.SkipParams" + }, "start_time": { "type": "integer" }, @@ -1195,6 +1308,35 @@ } } }, + "backuppb.SkipParams": { + "type": "object", + "properties": { + "collection_properties": { + "type": "array", + "items": { + "type": "string" + } + }, + "filed_index_params": { + "type": "array", + "items": { + "type": "string" + } + }, + "filed_type_params": { + "type": "array", + "items": { + "type": "string" + } + }, + "index_params": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, "backuppb.UserEntity": { "type": "object", "properties": { @@ -1224,7 +1366,7 @@ "type": "object", "properties": { "data": { - "description": "Types that are valid to be assigned to Data:\n\n\t*ValueField_BoolData\n\t*ValueField_IntData\n\t*ValueField_LongData\n\t*ValueField_FloatData\n\t*ValueField_DoubleData\n\t*ValueField_StringData\n\t*ValueField_BytesData" + "description": "Types that are assignable to Data:\n\n\t*ValueField_BoolData\n\t*ValueField_IntData\n\t*ValueField_LongData\n\t*ValueField_FloatData\n\t*ValueField_DoubleData\n\t*ValueField_StringData\n\t*ValueField_BytesData" } } } diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 39eadda..06456b9 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -133,17 +133,27 @@ definitions: backuppb.CollectionSchema: properties: autoID: + description: deprecated later, keep compatible with c++ part now type: boolean description: type: string enable_dynamic_field: + description: mark whether this table has the dynamic field function enabled. type: boolean fields: items: $ref: '#/definitions/backuppb.FieldSchema' type: array + functions: + items: + $ref: '#/definitions/backuppb.FunctionSchema' + type: array name: type: string + properties: + items: + $ref: '#/definitions/backuppb.KeyValuePair' + type: array type: object backuppb.ConsistencyLevel: enum: @@ -153,6 +163,9 @@ definitions: - 3 - 4 type: integer + x-enum-comments: + ConsistencyLevel_Customized: Users pass their own `guarantee_timestamp`. + ConsistencyLevel_Session: default in PyMilvus x-enum-varnames: - ConsistencyLevel_Strong - ConsistencyLevel_Session @@ -220,6 +233,8 @@ definitions: - 103 - 104 type: integer + x-enum-comments: + DataType_VarChar: variable-length strings with a specified maximum length x-enum-varnames: - DataType_None - DataType_Bool @@ -267,13 +282,19 @@ definitions: data_type: $ref: '#/definitions/backuppb.DataType' default_value: - $ref: '#/definitions/backuppb.ValueField' + allOf: + - $ref: '#/definitions/backuppb.ValueField' + description: default_value only support scalars except array and json for + now default_value_proto: + description: json not support marshall oneof, so use proto string type: string description: type: string element_type: - $ref: '#/definitions/backuppb.DataType' + allOf: + - $ref: '#/definitions/backuppb.DataType' + description: For array type, the element type is stored here fieldID: type: integer index_params: @@ -281,8 +302,12 @@ definitions: $ref: '#/definitions/backuppb.KeyValuePair' type: array is_dynamic: + description: mark whether this field is the dynamic field + type: boolean + is_function_output: type: boolean is_partition_key: + description: enable logic partitions type: boolean is_primary_key: type: boolean @@ -291,7 +316,9 @@ definitions: nullable: type: boolean state: - $ref: '#/definitions/backuppb.FieldState' + allOf: + - $ref: '#/definitions/backuppb.FieldState' + description: To keep compatible with older version, the default state is `Created`. type_params: items: $ref: '#/definitions/backuppb.KeyValuePair' @@ -309,6 +336,47 @@ definitions: - FieldState_FieldCreating - FieldState_FieldDropping - FieldState_FieldDropped + backuppb.FunctionSchema: + properties: + description: + type: string + id: + type: integer + input_field_ids: + items: + type: integer + type: array + input_field_names: + items: + type: string + type: array + name: + type: string + output_field_ids: + items: + type: integer + type: array + output_field_names: + items: + type: string + type: array + params: + items: + $ref: '#/definitions/backuppb.KeyValuePair' + type: array + type: + $ref: '#/definitions/backuppb.FunctionType' + type: object + backuppb.FunctionType: + enum: + - 0 + - 1 + - 2 + type: integer + x-enum-varnames: + - FunctionType_Unknown + - FunctionType_BM25 + - FunctionType_TextEmbedding backuppb.GrantEntity: properties: db_name: @@ -497,6 +565,10 @@ definitions: restoreIndex: description: if true restore index info type: boolean + skip_params: + allOf: + - $ref: '#/definitions/backuppb.SkipParams' + description: if key is set, will skip the params in restore process skipCreateCollection: description: if true, will skip collection, use when collection exist, restore index or data @@ -581,6 +653,8 @@ definitions: type: boolean restored_size: type: integer + skip_params: + $ref: '#/definitions/backuppb.SkipParams' skipCreateCollection: description: if true will skip create collections type: boolean @@ -671,6 +745,25 @@ definitions: $ref: '#/definitions/backuppb.FieldBinlog' type: array type: object + backuppb.SkipParams: + properties: + collection_properties: + items: + type: string + type: array + filed_index_params: + items: + type: string + type: array + filed_type_params: + items: + type: string + type: array + index_params: + items: + type: string + type: array + type: object backuppb.UserEntity: properties: name: @@ -690,7 +783,7 @@ definitions: backuppb.ValueField: properties: data: - description: "Types that are valid to be assigned to Data:\n\n\t*ValueField_BoolData\n\t*ValueField_IntData\n\t*ValueField_LongData\n\t*ValueField_FloatData\n\t*ValueField_DoubleData\n\t*ValueField_StringData\n\t*ValueField_BytesData" + description: "Types that are assignable to Data:\n\n\t*ValueField_BoolData\n\t*ValueField_IntData\n\t*ValueField_LongData\n\t*ValueField_FloatData\n\t*ValueField_DoubleData\n\t*ValueField_StringData\n\t*ValueField_BytesData" type: object info: contact: diff --git a/go.mod b/go.mod index 4d776c2..140cca6 100644 --- a/go.mod +++ b/go.mod @@ -1,116 +1,130 @@ module github.com/zilliztech/milvus-backup -go 1.18 +go 1.23.0 require ( - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0 - github.com/aliyun/credentials-go v1.3.0 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0 + github.com/aliyun/credentials-go v1.4.3 github.com/blang/semver/v4 v4.0.0 - github.com/cockroachdb/errors v1.9.1 - github.com/gin-gonic/gin v1.8.1 - github.com/golang/protobuf v1.5.2 - github.com/google/btree v1.0.1 - github.com/google/uuid v1.3.0 + github.com/cockroachdb/errors v1.11.3 + github.com/gin-gonic/gin v1.10.0 + github.com/golang/protobuf v1.5.4 + github.com/google/btree v1.1.3 + github.com/google/uuid v1.6.0 + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 + github.com/imroc/req/v3 v3.49.1 github.com/json-iterator/go v1.1.12 github.com/lingdor/stackerror v0.0.0-20191119040541-976d8885ed76 - //github.com/milvus-io/milvus-proto/go-api/v2 v2.4.3 - github.com/milvus-io/milvus-sdk-go/v2 v2.4.2-0.20241009111120-8008f14f2c16 - github.com/minio/minio-go/v7 v7.0.61 + github.com/milvus-io/milvus-proto/go-api/v2 v2.5.1 + github.com/minio/minio-go/v7 v7.0.82 github.com/pkg/errors v0.9.1 - github.com/samber/lo v1.39.0 - github.com/sony/sonyflake v1.1.0 - github.com/spf13/cast v1.3.1 - github.com/spf13/cobra v1.5.0 - github.com/spf13/viper v1.8.1 - github.com/stretchr/testify v1.8.4 - github.com/swaggo/files v1.0.0 - github.com/swaggo/gin-swagger v1.5.3 - github.com/swaggo/swag v1.16.1 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.865 - github.com/uber/jaeger-client-go v2.25.0+incompatible - go.uber.org/atomic v1.10.0 - go.uber.org/zap v1.17.0 - golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 - golang.org/x/sync v0.8.0 - golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 - google.golang.org/grpc v1.48.0 - gopkg.in/natefinch/lumberjack.v2 v2.0.0 + github.com/samber/lo v1.47.0 + github.com/sony/sonyflake v1.2.0 + github.com/spf13/cast v1.7.1 + github.com/spf13/cobra v1.8.1 + github.com/spf13/viper v1.19.0 + github.com/stretchr/testify v1.10.0 + github.com/swaggo/files v1.0.1 + github.com/swaggo/gin-swagger v1.6.0 + github.com/swaggo/swag v1.16.4 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1071 + github.com/uber/jaeger-client-go v2.30.0+incompatible + go.uber.org/atomic v1.11.0 + go.uber.org/zap v1.27.0 + golang.org/x/oauth2 v0.24.0 + golang.org/x/sync v0.10.0 + golang.org/x/time v0.8.0 + google.golang.org/grpc v1.69.2 + google.golang.org/protobuf v1.36.1 + gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v3 v3.0.1 ) -replace github.com/milvus-io/milvus-sdk-go/v2 => github.com/wayblink/milvus-sdk-go/v2 v2.3.0-beta4.0.20241030091852-d6eb85c1a8ff - -require github.com/milvus-io/milvus-proto/go-api/v2 v2.3.4-0.20240909041258-8f8ca67816cd - require ( - cloud.google.com/go v0.81.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 // indirect + cloud.google.com/go/compute/metadata v0.6.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 // indirect github.com/KyleBanks/depth v1.2.1 // indirect - github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 // indirect - github.com/alibabacloud-go/tea v1.1.8 // indirect - github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f // indirect - github.com/cockroachdb/redact v1.1.3 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/alibabacloud-go/debug v1.0.1 // indirect + github.com/alibabacloud-go/tea v1.2.2 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect + github.com/bytedance/sonic v1.12.6 // indirect + github.com/bytedance/sonic/loader v0.2.1 // indirect + github.com/cloudflare/circl v1.5.0 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/getsentry/sentry-go v0.12.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.7 // indirect + github.com/getsentry/sentry-go v0.30.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-openapi/jsonpointer v0.20.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/spec v0.20.9 // indirect - github.com/go-openapi/swag v0.22.4 // indirect - github.com/go-playground/locales v0.14.0 // indirect - github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-playground/validator/v10 v10.10.0 // indirect - github.com/goccy/go-json v0.9.7 // indirect + github.com/go-ini/ini v1.67.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.23.0 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.0.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/leodido/go-urn v1.2.1 // indirect - github.com/magiconair/properties v1.8.5 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/magiconair/properties v1.8.9 // indirect + github.com/mailru/easyjson v0.9.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/minio/md5-simd v1.1.2 // indirect - github.com/minio/sha256-simd v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml v1.9.3 // indirect - github.com/pelletier/go-toml/v2 v2.0.1 // indirect - github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/rs/xid v1.5.0 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/spf13/afero v1.6.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/onsi/ginkgo/v2 v2.22.0 // indirect + github.com/onsi/gomega v1.35.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pingcap/errors v0.11.5-0.20211224045212-9687c2b0f87c // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.48.2 // indirect + github.com/refraction-networking/utls v1.6.7 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/rs/xid v1.6.0 // indirect + github.com/sagikazarmark/locafero v0.6.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/subosito/gotenv v1.2.0 // indirect - github.com/tidwall/gjson v1.14.4 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/ugorji/go/codec v1.2.7 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.11.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29 // indirect - google.golang.org/protobuf v1.33.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + go.opentelemetry.io/otel v1.33.0 // indirect + go.opentelemetry.io/otel/sdk v1.33.0 // indirect + go.uber.org/mock v0.5.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/arch v0.12.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/tools v0.28.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 689b2ed..3a57167 100644 --- a/go.sum +++ b/go.sum @@ -1,346 +1,169 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0 h1:nVocQV40OQne5613EeLayJiRAJuKlBGy+m22qWG+WRg= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= -github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0 h1:JZg6HRh6W6U4OLl6lk7BZ7BLisIzM9dG1R50zUk9C/M= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0/go.mod h1:YL1xnZ6QejvQHWJrX/AvhFl4WW4rqHVoKspWNVwFk0M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 h1:B/dfvscEQtew9dVuoxqxrUKKv8Ih2f55PydknDamU+g= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0/go.mod h1:fiPSssYvltE08HJchL04dOy+RD4hgrjph0cwGGMntdI= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0 h1:+m0M/LFxN43KvULkDNfdXOgrjtg6UYJPFBJyuEcRCAw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0/go.mod h1:PwOyop78lveYMRs6oCxjiVyBdyCgIYH6XHIVZO9/SFQ= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0 h1:mlmW46Q0B79I+Aj4azKC6xDMFN9a9SyZWESlGWYXbFs= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0/go.mod h1:PXe2h+LKcWTX9afWdZoHyODqR4fBa5boUM/8uJfZ0Jo= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 h1:kYRSnvJju5gYVyhkij+RTJ/VR6QIUaCfWeaFm2ycsjQ= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 h1:NqugFkGxx1TXSh/pBcU00Y6bljgDPaFdh5MUSeJ7e50= -github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY= -github.com/alibabacloud-go/tea v1.1.8 h1:vFF0707fqjGiQTxrtMnIXRjOCvQXf49CuDVRtTopmwU= -github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= -github.com/aliyun/credentials-go v1.3.0 h1:wfBNojfNJJyuHK3YUIIjRPwnlQIdmy/YMkia1XOnPtY= -github.com/aliyun/credentials-go v1.3.0/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTsBEN04dgcAcYz0= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/alibabacloud-go/debug v1.0.0/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= +github.com/alibabacloud-go/debug v1.0.1 h1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg= +github.com/alibabacloud-go/debug v1.0.1/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= +github.com/alibabacloud-go/tea v1.2.2 h1:aTsR6Rl3ANWPfqeQugPglfurloyBJY85eFy7Gc1+8oU= +github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZLAQdpmpXMgwk= +github.com/aliyun/credentials-go v1.4.3 h1:N3iHyvHRMyOwY1+0qBLSf3hb5JFiOujVSVuEpgeGttY= +github.com/aliyun/credentials-go v1.4.3/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bytedance/sonic v1.12.6 h1:/isNmCUF2x3Sh8RAp/4mh4ZGkcFAX/hLrzrK3AvpRzk= +github.com/bytedance/sonic v1.12.6/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.1 h1:1GgorWTqf12TA8mma4DDSbaQigE2wOgQo7iCjjJv3+E= +github.com/bytedance/sonic/loader v0.2.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys= +github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f h1:6jduT9Hfc0njg5jJ1DdKCFPdMBrp/mdZfCpa5h+WM74= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 h1:ASDL+UJcILMqgNeV5jiqR4j+sTuvQNHdf2chuKj1M5k= +github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506/go.mod h1:Mw7HqKr2kdtu6aYGn3tPmAftiP3QPX63LdK/zcariIo= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/sentry-go v0.12.0 h1:era7g0re5iY13bHSdN/xMkyV+5zZppjRVQhZrXCaEIk= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= +github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= +github.com/getsentry/sentry-go v0.30.0 h1:lWUwDnY7sKHaVIoZ9wYqRHJ5iEmoc0pqcRqFkosKzBo= +github.com/getsentry/sentry-go v0.30.0/go.mod h1:WU9B9/1/sHDqeV8T+3VwwbjeR5MSXs/6aqG3mqZrezA= github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-faker/faker/v4 v4.1.0 h1:ffuWmpDrducIUOO0QSKSF5Q2dxAht+dhsT9FvVHhPEI= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= -github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= -github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= -github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= -github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= -github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= +github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= -github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/imroc/req/v3 v3.49.1 h1:Nvwo02riiPEzh74ozFHeEJrtjakFxnoWNR3YZYuQm9U= +github.com/imroc/req/v3 v3.49.1/go.mod h1:tsOk8K7zI6cU4xu/VWCZVtq9Djw9IWm4MslKzme5woU= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -349,664 +172,279 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lingdor/stackerror v0.0.0-20191119040541-976d8885ed76 h1:IVlcvV0CjvfBYYod5ePe89l+3LBAl//6n9kJ9Vr2i0k= github.com/lingdor/stackerror v0.0.0-20191119040541-976d8885ed76/go.mod h1:Iu9BHUvTh8/KpbuSoKx/CaJEdJvFxSverxIy7I+nq7s= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/milvus-io/milvus-proto/go-api/v2 v2.3.4-0.20240909041258-8f8ca67816cd h1:x0b0+foTe23sKcVFseR1DE8+BB08EH6ViiRHaz8PEik= -github.com/milvus-io/milvus-proto/go-api/v2 v2.3.4-0.20240909041258-8f8ca67816cd/go.mod h1:/6UT4zZl6awVeXLeE7UGDWZvXj3IWkRsh3mqsn0DiAs= +github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= +github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/milvus-io/milvus-proto/go-api/v2 v2.5.1 h1:kUXwIa2FRXTx69bB46aMriqfrjbLnHMRAD4/+BhnL6w= +github.com/milvus-io/milvus-proto/go-api/v2 v2.5.1/go.mod h1:/6UT4zZl6awVeXLeE7UGDWZvXj3IWkRsh3mqsn0DiAs= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.61 h1:87c+x8J3jxQ5VUGimV9oHdpjsAvy3fhneEBKuoKEVUI= -github.com/minio/minio-go/v7 v7.0.61/go.mod h1:BTu8FcrEw+HidY0zd/0eny43QnVNkXRPXrLXFuQBHXg= -github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= -github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/minio/minio-go/v7 v7.0.82 h1:tWfICLhmp2aFPXL8Tli0XDTHj2VB/fNf0PC1f/i1gRo= +github.com/minio/minio-go/v7 v7.0.82/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= +github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pingcap/errors v0.11.5-0.20211224045212-9687c2b0f87c h1:xpW9bvK+HuuTmyFqUwr+jcCvpVkK7sumiz+ko5H9eq4= +github.com/pingcap/errors v0.11.5-0.20211224045212-9687c2b0f87c/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4= +github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA= +github.com/refraction-networking/utls v1.6.7 h1:zVJ7sP1dJx/WtVuITug3qYUq034cDq9B2MR1K67ULZM= +github.com/refraction-networking/utls v1.6.7/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA= -github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk= +github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= +github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/sony/sonyflake v1.1.0 h1:wnrEcL3aOkWmPlhScLEGAXKkLAIslnBteNUq4Bw6MM4= -github.com/sony/sonyflake v1.1.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/sony/sonyflake v1.2.0 h1:Pfr3A+ejSg+0SPqpoAmQgEtNDAhc2G1SUYk205qVMLQ= +github.com/sony/sonyflake v1.2.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w= -github.com/swaggo/files v1.0.0 h1:1gGXVIeUFCS/dta17rnP0iOpr6CXFwKD7EO5ID233e4= -github.com/swaggo/files v1.0.0/go.mod h1:N59U6URJLyU1PQgFqPM7wXLMhJx7QAolnvfQkqO13kc= -github.com/swaggo/gin-swagger v1.5.3 h1:8mWmHLolIbrhJJTflsaFoZzRBYVmEE7JZGIq08EiC0Q= -github.com/swaggo/gin-swagger v1.5.3/go.mod h1:3XJKSfHjDMB5dBo/0rrTXidPmgLeqsX89Yp4uA50HpI= -github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ= -github.com/swaggo/swag v1.16.1 h1:fTNRhKstPKxcnoKsytm4sahr8FaYzUcT7i1/3nd/fBg= -github.com/swaggo/swag v1.16.1/go.mod h1:9/LMvHycG3NFHfR6LwvikHv5iFvmPADQ359cKikGxto= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.865 h1:LcUqBlKC4j15LhT303yQDX/XxyHG4haEQqbHgZZA4SY= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.865/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= -github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= -github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= -github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/wayblink/milvus-sdk-go/v2 v2.3.0-beta4.0.20241030091852-d6eb85c1a8ff h1:b73JFTui+bKEy5HuDFUOYNH3XNbYYl62Rv7JKA/thZo= -github.com/wayblink/milvus-sdk-go/v2 v2.3.0-beta4.0.20241030091852-d6eb85c1a8ff/go.mod h1:TdzShm5isV4F6kvrd+9V/CKowNIX+H+jvybF0WWts0Y= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= +github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= +github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= +github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A= +github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1071 h1:Q/Ue/yRv4HSpaiFAnXIshoDjxzwyhwezEidXU49Boa4= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1071/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= +go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= +go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= +go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= +go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM= +go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= +go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/arch v0.12.0 h1:UsYJhbzPYGsT0HbEdmYcqtCv8UNGvnaL561NnIUvaKg= +golang.org/x/arch v0.12.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM= -golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= -golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29 h1:DJUvgAPiJWeMBiT+RzBVcJGQN7bAEWS5UEoMshES9xs= -google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 h1:TqExAhdPaB60Ux47Cn0oLV07rGnxZzIsaRhQaqS666A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc/examples v0.0.0-20220617181431-3e7b97febc7f h1:rqzndB2lIQGivcXdTuY3Y9NBvr70X+y77woofSRluec= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/internal/common/workerpool.go b/internal/common/workerpool.go index d5e42b7..8fd38dd 100644 --- a/internal/common/workerpool.go +++ b/internal/common/workerpool.go @@ -4,10 +4,11 @@ import ( "context" "errors" "fmt" - "go.uber.org/atomic" "sync" "time" + "go.uber.org/atomic" + "golang.org/x/sync/errgroup" "golang.org/x/time/rate" ) diff --git a/internal/util/errorutil/util_test.go b/internal/util/errorutil/util_test.go index ef688fc..148c01c 100644 --- a/internal/util/errorutil/util_test.go +++ b/internal/util/errorutil/util_test.go @@ -4,8 +4,9 @@ import ( "errors" "testing" - "github.com/zilliztech/milvus-backup/internal/log" "go.uber.org/zap" + + "github.com/zilliztech/milvus-backup/internal/log" ) func TestErrorList_Error(t *testing.T) { diff --git a/internal/util/grpcclient/client.go b/internal/util/grpcclient/client.go index 3effd57..8bf0844 100644 --- a/internal/util/grpcclient/client.go +++ b/internal/util/grpcclient/client.go @@ -24,11 +24,12 @@ import ( "google.golang.org/grpc/backoff" - "github.com/zilliztech/milvus-backup/internal/log" - "github.com/zilliztech/milvus-backup/internal/util/funcutil" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/keepalive" + + "github.com/zilliztech/milvus-backup/internal/log" + "github.com/zilliztech/milvus-backup/internal/util/funcutil" ) // GrpcClient abstracts client of grpc diff --git a/main.go b/main.go index 96f1bd3..7071ed6 100644 --- a/main.go +++ b/main.go @@ -3,12 +3,7 @@ package main import ( "github.com/zilliztech/milvus-backup/cmd" _ "github.com/zilliztech/milvus-backup/docs" -) - -var ( - version = "dev" - commit = "unknown" - date = "unknown" + "github.com/zilliztech/milvus-backup/version" ) // @title Milvus Backup Service @@ -20,6 +15,6 @@ var ( // @license.url http://www.apache.org/licenses/LICENSE-2.0.html // @BasePath /api/v1 func main() { - cmd.SetVersionInfo(version, commit, date) + cmd.SetVersionInfo(version.Version, version.Commit, version.Date) cmd.Execute() } diff --git a/version/version.go b/version/version.go new file mode 100644 index 0000000..7dd0d3a --- /dev/null +++ b/version/version.go @@ -0,0 +1,7 @@ +package version + +var ( + Version = "dev" + Commit = "unknown" + Date = "unknown" +)