diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index b8c31b94..5cc250b8 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 e8460c02..2f31c7ef 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 5c7b6608..4499ccbb 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 fbc5fcc9..bb3a26ae 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 a1ca91ea..a6098ab6 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 70872595..5ed2f1e1 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 e63f7c55..d16055a3 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 6b31a0ae..ec8b66a1 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 266ed2ce..a527023e 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 a0736876..7ea97ad8 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 2828603c..33ca4f9a 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 4b262427..eab6b4b5 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 19d9108e..1167a729 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 93e4a985..a02e06df 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 c910ba57..16c4b012 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 4db0581c..46677df1 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 773df830..1168b91a 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 448e2a73..0f77f991 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 05ffeb5e..03de97a4 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 6df005a6..763b2fe0 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 ff210e07..03e78ca1 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 c55bebda..d14a71d6 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 00000000..29b44090 --- /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 00000000..aa61f929 --- /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 00000000..9cdd0a66 --- /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 9d38ca9f..e958f9d5 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 612a0882..d5f71de4 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 70d2421f..00000000 --- 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 58160402..00000000 --- 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 1c109c6a..00000000 --- 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 aac7cc44..ccd56730 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 00000000..e38ede3d --- /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 00000000..626c32a5 --- /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 498c2734..b08df50a 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 fff0429b..1ca874fd 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 00000000..dd469194 --- /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 00000000..9b70a15f --- /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 947435b5..4408b474 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 47de78d5..4046d33c 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 00000000..e3052861 --- /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 00000000..205f3a16 --- /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 160fed85..0f05a3e8 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 9f0b705e..84f21178 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 ee45635e..792e8abb 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 7bc1fc59..78985252 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 d6aea683..e07ba2c6 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 39eaddac..06456b97 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 4d776c23..140cca6c 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 689b2eda..3a571672 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 d5e42b71..8fd38ddc 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 ef688fc4..148c01c8 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 3effd578..8bf0844c 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 96f1bd3b..7071ed6c 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 00000000..7dd0d3a2 --- /dev/null +++ b/version/version.go @@ -0,0 +1,7 @@ +package version + +var ( + Version = "dev" + Commit = "unknown" + Date = "unknown" +)