From 312e7e94ac8febba723fc6ad2b3ceb2cb3697913 Mon Sep 17 00:00:00 2001 From: huanghaoyuanhhy Date: Thu, 16 Jan 2025 18:58:55 +0800 Subject: [PATCH] support create bulk inert job via restful api (#503) Signed-off-by: huanghaoyuanhhy --- Makefile | 7 +- core/backup_context.go | 24 +- core/backup_impl_restore_backup.go | 4 + core/client/grpc.go | 6 +- core/client/restful.go | 46 ++-- core/proto/backup.proto | 14 +- core/proto/backuppb/backup.pb.go | 337 +++++++++++++++-------------- core/restore/collection.go | 199 ++++++++++++++--- core/storage/mpath/path.go | 3 + docs/docs.go | 18 +- docs/swagger.json | 18 +- docs/swagger.yaml | 24 +- 12 files changed, 458 insertions(+), 242 deletions(-) diff --git a/Makefile b/Makefile index 5ed2f1e1..ed04bf7d 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,11 @@ all: gen build # Build the binary build: - @echo "Building binary..." - GO111MODULE=on CGO_ENABLED=0 go build -ldflags '$(LDFLAGS)' -o $(BINARY_NAME) + @echo "Building Backup binary..." + @echo "Version: $(VERSION)" + @echo "Commit: $(COMMIT)" + @echo "Date: $(DATE)" + @GO111MODULE=on CGO_ENABLED=0 go build -ldflags '$(LDFLAGS)' -o $(BINARY_NAME) gen: ./scripts/gen_swag.sh diff --git a/core/backup_context.go b/core/backup_context.go index 46677df1..1d176e29 100644 --- a/core/backup_context.go +++ b/core/backup_context.go @@ -64,7 +64,7 @@ type BackupContext struct { bulkinsertWorkerPools sync.Map } -func CreateMilvusClient(ctx context.Context, params *paramtable.BackupParams) (client.Grpc, error) { +func paramsToCfg(params *paramtable.BackupParams) (*client.Cfg, error) { ep := params.MilvusCfg.Address + ":" + params.MilvusCfg.Port log.Debug("Start Milvus client", zap.String("endpoint", ep)) @@ -76,6 +76,7 @@ func CreateMilvusClient(ctx context.Context, params *paramtable.BackupParams) (c enableTLS = true default: log.Error("milvus.TLSMode is illegal, support value 0, 1, 2") + return nil, fmt.Errorf("milvus.TLSMode is illegal, support value 0, 1, 2") } cfg := &client.Cfg{ @@ -84,6 +85,17 @@ func CreateMilvusClient(ctx context.Context, params *paramtable.BackupParams) (c Username: params.MilvusCfg.User, Password: params.MilvusCfg.Password, } + + return cfg, nil +} + +func CreateGrpcClient(params *paramtable.BackupParams) (client.Grpc, error) { + cfg, err := paramsToCfg(params) + if err != nil { + log.Error("failed to create milvus client", zap.Error(err)) + return nil, fmt.Errorf("failed to create milvus client: %w", err) + } + cli, err := client.NewGrpc(cfg) if err != nil { log.Error("failed to create milvus client", zap.Error(err)) @@ -93,10 +105,12 @@ func CreateMilvusClient(ctx context.Context, params *paramtable.BackupParams) (c } 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, err := paramsToCfg(params) + if err != nil { + log.Error("failed to create restful client", zap.Error(err)) + return nil, fmt.Errorf("failed to create restful client: %w", err) + } - 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)) @@ -136,7 +150,7 @@ func CreateBackupContext(ctx context.Context, params *paramtable.BackupParams) * func (b *BackupContext) getMilvusClient() client.Grpc { if b.grpcClient == nil { - milvusClient, err := CreateMilvusClient(b.ctx, b.params) + milvusClient, err := CreateGrpcClient(b.params) if err != nil { log.Error("failed to initial milvus client", zap.Error(err)) panic(err) diff --git a/core/backup_impl_restore_backup.go b/core/backup_impl_restore_backup.go index 03de97a4..c9509c0c 100644 --- a/core/backup_impl_restore_backup.go +++ b/core/backup_impl_restore_backup.go @@ -41,6 +41,8 @@ func (b *BackupContext) RestoreBackup(ctx context.Context, request *backuppb.Res zap.String("path", request.GetPath()), zap.String("databaseCollections", utils.GetRestoreDBCollections(request)), zap.Bool("skipDiskQuotaCheck", request.GetSkipImportDiskQuotaCheck()), + zap.Any("skipParams", request.GetSkipParams()), + zap.Bool("useV2Restore", request.GetUseV2Restore()), zap.Int32("maxShardNum", request.GetMaxShardNum())) resp := &backuppb.RestoreBackupResponse{ @@ -311,6 +313,8 @@ func (b *BackupContext) RestoreBackup(ctx context.Context, request *backuppb.Res SkipCreateCollection: request.GetSkipCreateCollection(), SkipDiskQuotaCheck: request.GetSkipImportDiskQuotaCheck(), MaxShardNum: request.GetMaxShardNum(), + SkipParams: request.GetSkipParams(), + UseV2Restore: request.GetUseV2Restore(), } restoreCollectionTasks = append(restoreCollectionTasks, restoreCollectionTask) task.CollectionRestoreTasks = restoreCollectionTasks diff --git a/core/client/grpc.go b/core/client/grpc.go index aa61f929..7dd4e431 100644 --- a/core/client/grpc.go +++ b/core/client/grpc.go @@ -77,7 +77,7 @@ type Grpc interface { 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) + BulkInsert(ctx context.Context, input GrpcBulkInsertInput) (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 @@ -355,7 +355,7 @@ func (m *GrpcClient) HasCollection(ctx context.Context, db, collName string) (bo return resp.GetValue(), nil } -type BulkInsertInput struct { +type GrpcBulkInsertInput struct { DB string CollectionName string PartitionName string @@ -366,7 +366,7 @@ type BulkInsertInput struct { SkipDiskQuotaCheck bool } -func (m *GrpcClient) BulkInsert(ctx context.Context, input BulkInsertInput) (int64, error) { +func (m *GrpcClient) BulkInsert(ctx context.Context, input GrpcBulkInsertInput) (int64, error) { ctx = m.newCtxWithDB(ctx, input.DB) var opts []*commonpb.KeyValuePair if input.EndTime > 0 { diff --git a/core/client/restful.go b/core/client/restful.go index 9cdd0a66..f889761b 100644 --- a/core/client/restful.go +++ b/core/client/restful.go @@ -12,8 +12,28 @@ import ( "github.com/zilliztech/milvus-backup/internal/log" ) +type ImportState string + +const ( + ImportStatePending ImportState = "Pending" + ImportStateImporting ImportState = "Importing" + ImportStateCompleted ImportState = "Completed" + ImportStateFailed ImportState = "Failed" +) + +type RestfulBulkInsertInput 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 +} + type Restful interface { - BulkInsert(ctx context.Context, db, collName, partitionName string, files []string, endTime int64, isL0 bool, skipDiskQuotaCheck bool) (string, error) + BulkInsert(ctx context.Context, input RestfulBulkInsertInput) (string, error) GetBulkInsertState(ctx context.Context, db, jobID string) (*GetProcessResp, error) } @@ -73,27 +93,27 @@ 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) { +func (r *RestfulClient) BulkInsert(ctx context.Context, input RestfulBulkInsertInput) (string, error) { opts := make(map[string]string) - if endTime > 0 { - opts["end_time"] = strconv.FormatInt(endTime, 10) + if input.EndTime > 0 { + opts["end_time"] = strconv.FormatInt(input.EndTime, 10) } - if isL0 { + if input.IsL0 { opts["l0_import"] = "true" } else { opts["backup"] = "true" } - opts["skip_disk_quota_check"] = strconv.FormatBool(skipDiskQuotaCheck) + opts["skip_disk_quota_check"] = strconv.FormatBool(input.SkipDiskQuotaCheck) createReq := createImportReq{ - DbName: db, - CollectionName: collName, - PartitionName: partitionName, - Files: [][]string{files}, + DbName: input.DB, + CollectionName: input.CollectionName, + PartitionName: input.PartitionName, + Files: input.Paths, Options: opts, } var createResp createImportResp - log.Info("create import job via restful", zap.Any("createReq", createReq)) + log.Debug("create import job via restful", zap.Any("createReq", createReq)) resp, err := r.cli.R(). SetContext(ctx). SetBody(createReq). @@ -102,7 +122,7 @@ func (r *RestfulClient) BulkInsert(ctx context.Context, db, collName, partitionN 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)) + log.Debug("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) } @@ -125,7 +145,7 @@ func (r *RestfulClient) GetBulkInsertState(ctx context.Context, dbName, jobID st 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)) + log.Debug("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) } diff --git a/core/proto/backup.proto b/core/proto/backup.proto index b08df50a..ef13a265 100644 --- a/core/proto/backup.proto +++ b/core/proto/backup.proto @@ -246,12 +246,12 @@ enum RestoreTaskStateCode { } message SkipParams { - repeated string collection_properties = 1; + repeated string collectionProperties = 1; - repeated string filed_index_params = 2; - repeated string filed_type_params = 3; + repeated string fieldIndexParams = 2; + repeated string fieldTypeParams = 3; - repeated string index_params = 4; + repeated string indexParams = 4; } message RestoreBackupRequest { @@ -295,7 +295,8 @@ message RestoreBackupRequest { // target max shard number int32 maxShardNum = 19; // if key is set, will skip the params in restore process - SkipParams skip_params = 20; + SkipParams skipParams = 20; + bool useV2Restore = 21; } message RestorePartitionTask { @@ -336,7 +337,8 @@ message RestoreCollectionTask { bool skipDiskQuotaCheck = 19; // target max shard number int32 maxShardNum = 20; - SkipParams skip_params = 21; + SkipParams skipParams = 21; + bool useV2Restore = 22; } message RestoreBackupTask { diff --git a/core/proto/backuppb/backup.pb.go b/core/proto/backuppb/backup.pb.go index 1ca874fd..eddeff63 100644 --- a/core/proto/backuppb/backup.pb.go +++ b/core/proto/backuppb/backup.pb.go @@ -8,15 +8,14 @@ package backuppb import ( context "context" - 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" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( @@ -1801,10 +1800,10 @@ type SkipParams struct { 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"` + CollectionProperties []string `protobuf:"bytes,1,rep,name=collectionProperties,proto3" json:"collectionProperties,omitempty"` + FieldIndexParams []string `protobuf:"bytes,2,rep,name=fieldIndexParams,proto3" json:"fieldIndexParams,omitempty"` + FieldTypeParams []string `protobuf:"bytes,3,rep,name=fieldTypeParams,proto3" json:"fieldTypeParams,omitempty"` + IndexParams []string `protobuf:"bytes,4,rep,name=indexParams,proto3" json:"indexParams,omitempty"` } func (x *SkipParams) Reset() { @@ -1846,16 +1845,16 @@ func (x *SkipParams) GetCollectionProperties() []string { return nil } -func (x *SkipParams) GetFiledIndexParams() []string { +func (x *SkipParams) GetFieldIndexParams() []string { if x != nil { - return x.FiledIndexParams + return x.FieldIndexParams } return nil } -func (x *SkipParams) GetFiledTypeParams() []string { +func (x *SkipParams) GetFieldTypeParams() []string { if x != nil { - return x.FiledTypeParams + return x.FieldTypeParams } return nil } @@ -1912,7 +1911,8 @@ type RestoreBackupRequest struct { // target max shard number 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"` + SkipParams *SkipParams `protobuf:"bytes,20,opt,name=skipParams,proto3" json:"skipParams,omitempty"` + UseV2Restore bool `protobuf:"varint,21,opt,name=useV2Restore,proto3" json:"useV2Restore,omitempty"` } func (x *RestoreBackupRequest) Reset() { @@ -2087,6 +2087,13 @@ func (x *RestoreBackupRequest) GetSkipParams() *SkipParams { return nil } +func (x *RestoreBackupRequest) GetUseV2Restore() bool { + if x != nil { + return x.UseV2Restore + } + return false +} + type RestorePartitionTask struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2213,8 +2220,9 @@ 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"` - SkipParams *SkipParams `protobuf:"bytes,21,opt,name=skip_params,json=skipParams,proto3" json:"skip_params,omitempty"` + MaxShardNum int32 `protobuf:"varint,20,opt,name=maxShardNum,proto3" json:"maxShardNum,omitempty"` + SkipParams *SkipParams `protobuf:"bytes,21,opt,name=skipParams,proto3" json:"skipParams,omitempty"` + UseV2Restore bool `protobuf:"varint,22,opt,name=useV2Restore,proto3" json:"useV2Restore,omitempty"` } func (x *RestoreCollectionTask) Reset() { @@ -2396,6 +2404,13 @@ func (x *RestoreCollectionTask) GetSkipParams() *SkipParams { return nil } +func (x *RestoreCollectionTask) GetUseV2Restore() bool { + if x != nil { + return x.UseV2Restore + } + return false +} + type RestoreBackupTask struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4343,158 +4358,162 @@ var file_backup_proto_rawDesc = []byte{ 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, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0xb8, 0x01, 0x0a, 0x0a, + 0x53, 0x6b, 0x69, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 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, 0x2a, + 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 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, 0xc7, 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, 0x0e, 0x20, + 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, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x41, 0x75, 0x74, 0x6f, + 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, 0x10, 0x20, 0x01, + 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, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, + 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, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x73, + 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, 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, + 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, 0x3f, 0x0a, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x50, 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, 0x12, 0x22, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x56, 0x32, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, + 0x65, 0x56, 0x32, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, 0xec, 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, 0x3f, 0x0a, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x50, 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, 0x12, 0x22, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x56, 0x32, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x56, 0x32, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 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, @@ -4938,13 +4957,13 @@ var file_backup_proto_depIdxs = []int32{ 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 + 22, // 26: milvus.proto.backup.RestoreBackupRequest.skipParams: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 + 22, // 32: milvus.proto.backup.RestoreCollectionTask.skipParams: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 diff --git a/core/restore/collection.go b/core/restore/collection.go index dd469194..5c8fc5d2 100644 --- a/core/restore/collection.go +++ b/core/restore/collection.go @@ -30,8 +30,9 @@ import ( ) const ( - _bulkInsertTimeout = 60 * time.Minute - _bulkInsertCheckInterval = 3 * time.Second + _bulkInsertTimeout = 60 * time.Minute + _bulkInsertCheckInterval = 3 * time.Second + _bulkInsertRestfulAPIChunkSize = 1024 ) type tearDownFn func(ctx context.Context) error @@ -61,6 +62,8 @@ type CollectionTask struct { tearDownFns []tearDownFn + useV2Restore bool + logger *zap.Logger } @@ -77,7 +80,7 @@ func NewCollectionTask(task *backuppb.RestoreCollectionTask, ) *CollectionTask { logger := log.With( zap.String("backup_db_name", task.GetCollBackup().GetDbName()), - zap.String("backup_collection_name", task.GetCollBackup().GetDbName()), + zap.String("backup_collection_name", task.GetCollBackup().GetCollectionName()), zap.String("target_db_name", task.GetTargetDbName()), zap.String("target_collection_name", task.GetTargetCollectionName())) @@ -152,14 +155,38 @@ func (ct *CollectionTask) privateExecute(ctx context.Context) error { } // restore collection data - if err := ct.restoreData(ctx); err != nil { - return fmt.Errorf("restore_collection: restore data: %w", err) + if ct.task.UseV2Restore { + if err := ct.restoreDataV2(ctx); err != nil { + return fmt.Errorf("restore_collection: restore data v2: %w", err) + } + } else { + if err := ct.restoreDataV1(ctx); err != nil { + return fmt.Errorf("restore_collection: restore data: %w", err) + } + } + + return nil +} + +func (ct *CollectionTask) restoreDataV2(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.restorePartitionV2(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.restoreL0SegV2(ctx, -1, "", ct.task.GetCollBackup().GetL0Segments()); err != nil { + return fmt.Errorf("restore_collection: restore global L0 segment: %w", err) } return nil } -func (ct *CollectionTask) restoreData(ctx context.Context) error { +func (ct *CollectionTask) restoreDataV1(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() { @@ -170,7 +197,7 @@ func (ct *CollectionTask) restoreData(ctx context.Context) error { // 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 { + if err := ct.restoreL0SegV1(ctx, -1, "", ct.task.GetCollBackup().GetL0Segments()); err != nil { return fmt.Errorf("restore_collection: restore global L0 segment: %w", err) } @@ -274,8 +301,8 @@ func (ct *CollectionTask) fields() ([]*schemapb.FieldSchema, error) { 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()...), + TypeParams: pbconv.BakKVToMilvusKV(bakField.GetTypeParams(), ct.task.SkipParams.GetFieldTypeParams()...), + IndexParams: pbconv.BakKVToMilvusKV(bakField.GetIndexParams(), ct.task.SkipParams.GetFieldIndexParams()...), IsDynamic: bakField.GetIsDynamic(), IsPartitionKey: bakField.GetIsPartitionKey(), Nullable: bakField.GetNullable(), @@ -477,7 +504,6 @@ type restoreGroup struct { } 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) @@ -516,7 +542,28 @@ func (ct *CollectionTask) restoreNotL0SegV1(ctx context.Context, part *backuppb. return nil } -func (ct *CollectionTask) restoreL0Seg(ctx context.Context, partitionID int64, partitionName string, l0Segs []*backuppb.SegmentBackupInfo) error { +func (ct *CollectionTask) restoreNotL0SegV2(ctx context.Context, part *backuppb.PartitionBackupInfo) error { + notL0Groups, err := ct.notL0Groups(ctx, part) + if err != nil { + return fmt.Errorf("restore_collection: get not L0 groups: %w", err) + } + + chunkedGroups := lo.Chunk(notL0Groups, _bulkInsertRestfulAPIChunkSize) + for _, groups := range chunkedGroups { + paths := make([][]string, 0, len(groups)) + for _, g := range notL0Groups { + paths = append(paths, []string{g.insertLogDir, g.deltaLogDir}) + } + + if err := ct.bulkInsertViaRestful(ctx, part.GetPartitionName(), paths, false); err != nil { + return fmt.Errorf("restore_collection: restore data v1 bulk insert via restful: %w", err) + } + } + + return nil +} + +func (ct *CollectionTask) restoreL0SegV1(ctx context.Context, partitionID int64, partitionName string, l0Segs []*backuppb.SegmentBackupInfo) error { for _, seg := range l0Segs { opts := []mpath.PathOption{ mpath.CollectionID(ct.task.GetCollBackup().CollectionId), @@ -537,6 +584,22 @@ func (ct *CollectionTask) restoreL0Seg(ctx context.Context, partitionID int64, p return nil } +func (ct *CollectionTask) restoreL0SegV2(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...) + if err := ct.bulkInsertViaRestful(ctx, partitionName, [][]string{{deltaLogDir}}, true); err != nil { + return fmt.Errorf("restore_collection: restore L0 segment bulk insert via restful: %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())) @@ -555,7 +618,29 @@ func (ct *CollectionTask) restorePartitionV1(ctx context.Context, part *backuppb 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 { + if err := ct.restoreL0SegV1(ctx, part.GetPartitionId(), part.GetPartitionName(), l0Segs); err != nil { + return fmt.Errorf("restore_collection: restore L0 segment: %w", err) + } + + return nil +} + +func (ct *CollectionTask) restorePartitionV2(ctx context.Context, part *backuppb.PartitionBackupInfo) error { + log.Info("start restore partition v2", 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 partition not L0 segment v2", zap.String("partition_name", part.GetPartitionName())) + if err := ct.restoreNotL0SegV2(ctx, part); err != nil { + return fmt.Errorf("restore_collection: restore not L0 groups: %w", err) + } + + l0Seg := lo.Filter(part.GetSegmentBackups(), func(seg *backuppb.SegmentBackupInfo, _ int) bool { + return seg.IsL0 + }) + if err := ct.restoreL0SegV2(ctx, part.GetPartitionId(), part.GetPartitionName(), l0Seg); err != nil { return fmt.Errorf("restore_collection: restore L0 segment: %w", err) } @@ -576,23 +661,28 @@ func (ct *CollectionTask) notL0Groups(ctx context.Context, part *backuppb.Partit 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) + opts := []mpath.PathOption{ + mpath.CollectionID(ct.task.GetCollBackup().CollectionId), + mpath.PartitionID(part.GetPartitionId()), + } + insertLogDir, deltaLogDir, err := ct.verifyBackupPartitionPaths(ctx, opts...) 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 + return []restoreGroup{{insertLogDir: insertLogDir, deltaLogDir: deltaLogDir, size: part.Size}}, nil } for _, gID := range groupIDs { - insertLogDir, deltaLogDir, size, err := ct.getBackupPartitionPaths(ctx, part) + opts := []mpath.PathOption{ + mpath.CollectionID(ct.task.GetCollBackup().CollectionId), + mpath.PartitionID(part.GetPartitionId()), + mpath.GroupID(gID), + } + insertLogDir, deltaLogDir, err := ct.verifyBackupPartitionPaths(ctx, opts...) 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}) + groups = append(groups, restoreGroup{insertLogDir: insertLogDir, deltaLogDir: deltaLogDir, size: part.Size}) } return groups, nil @@ -600,7 +690,7 @@ func (ct *CollectionTask) notL0Groups(ctx context.Context, part *backuppb.Partit 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{ + in := client.GrpcBulkInsertInput{ DB: ct.task.GetTargetDbName(), CollectionName: ct.task.GetTargetCollectionName(), PartitionName: partition, @@ -648,6 +738,56 @@ func (ct *CollectionTask) bulkInsertViaGrpc(ctx context.Context, partition strin return errors.New("restore_collection: walk into unreachable code") } +func (ct *CollectionTask) bulkInsertViaRestful(ctx context.Context, partition string, paths [][]string, isL0 bool) error { + ct.logger.Info("start bulk insert via restful", zap.Int("paths_num", len(paths)), zap.String("partition", partition)) + in := client.RestfulBulkInsertInput{ + DB: ct.task.GetTargetDbName(), + CollectionName: ct.task.GetTargetCollectionName(), + PartitionName: partition, + Paths: paths, + EndTime: ct.task.GetCollBackup().EndTime, + IsL0: isL0, + } + jobID, err := ct.restfulCli.BulkInsert(ctx, in) + if err != nil { + return fmt.Errorf("restore_collection: failed to bulk insert via restful: %w", err) + } + ct.logger.Info("create bulk insert via restful success", zap.String("job_id", jobID)) + + // wait for bulk insert job done + var lastProgress int + lastUpdateTime := time.Now() + for range time.Tick(_bulkInsertCheckInterval) { + resp, err := ct.restfulCli.GetBulkInsertState(ctx, ct.task.GetTargetDbName(), 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.String("job_id", jobID), + zap.String("state", resp.Data.State), + zap.Int("progress", resp.Data.Progress)) + switch resp.Data.State { + case string(client.ImportStateFailed): + return fmt.Errorf("restore_collection: bulk insert failed: %s", resp.Data.Reason) + case string(client.ImportStateCompleted): + ct.logger.Info("bulk insert task success", zap.String("job_id", jobID)) + return nil + default: + currentProgress := resp.Data.Progress + if currentProgress > lastProgress { + lastUpdateTime = time.Now() + } else if time.Now().Sub(lastUpdateTime) >= _bulkInsertTimeout { + ct.logger.Warn("bulk insert task timeout", zap.String("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 @@ -673,23 +813,18 @@ func getFailedReason(infos []*commonpb.KeyValuePair) string { 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)) +func (ct *CollectionTask) verifyBackupPartitionPaths(ctx context.Context, pathOpt ...mpath.PathOption) (string, string, error) { + insertLogDir := mpath.InsertLogDir(ct.backupPath, pathOpt...) + deltaLogDir := mpath.DeltaLogDir(ct.backupPath, pathOpt...) exist, err := ct.backupStorage.Exist(ctx, ct.backupBucketName, deltaLogDir) if err != nil { - return "", "", 0, fmt.Errorf("restore_collection: check delta log exist: %w", err) + return "", "", 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 + return insertLogDir, deltaLogDir, nil } else { - return insertLogDir, "", part.GetSize(), nil + return insertLogDir, "", nil } } diff --git a/core/storage/mpath/path.go b/core/storage/mpath/path.go index e3052861..23fcfe57 100644 --- a/core/storage/mpath/path.go +++ b/core/storage/mpath/path.go @@ -24,6 +24,9 @@ const Separator = "/" // ${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} +// The group ID is a virtual partition ID. The Milvus BulkInsert interface requires a partition prefix, +// but passing multiple segments is a more suitable option. +// Therefore, a virtual partition ID is used here to enable the functionality of importing multiple segments. func LogDir(base, typePrefix string, opts ...PathOption) string { elem := []string{base, _binlogPrefix, typePrefix} diff --git a/docs/docs.go b/docs/docs.go index 78985252..357caf37 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -1060,7 +1060,7 @@ const docTemplate = `{ "description": "if true, skip the diskQuota in Import", "type": "boolean" }, - "skip_params": { + "skipParams": { "description": "if key is set, will skip the params in restore process", "allOf": [ { @@ -1071,6 +1071,9 @@ const docTemplate = `{ "useAutoIndex": { "description": "if true use autoindex when restore vector index", "type": "boolean" + }, + "useV2Restore": { + "type": "boolean" } } }, @@ -1192,7 +1195,7 @@ const docTemplate = `{ "skipDiskQuotaCheck": { "type": "boolean" }, - "skip_params": { + "skipParams": { "$ref": "#/definitions/backuppb.SkipParams" }, "start_time": { @@ -1213,6 +1216,9 @@ const docTemplate = `{ "useAutoIndex": { "description": "if true use autoindex when restore vector index", "type": "boolean" + }, + "useV2Restore": { + "type": "boolean" } } }, @@ -1318,25 +1324,25 @@ const docTemplate = `{ "backuppb.SkipParams": { "type": "object", "properties": { - "collection_properties": { + "collectionProperties": { "type": "array", "items": { "type": "string" } }, - "filed_index_params": { + "fieldIndexParams": { "type": "array", "items": { "type": "string" } }, - "filed_type_params": { + "fieldTypeParams": { "type": "array", "items": { "type": "string" } }, - "index_params": { + "indexParams": { "type": "array", "items": { "type": "string" diff --git a/docs/swagger.json b/docs/swagger.json index e07ba2c6..60541232 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -1053,7 +1053,7 @@ "description": "if true, skip the diskQuota in Import", "type": "boolean" }, - "skip_params": { + "skipParams": { "description": "if key is set, will skip the params in restore process", "allOf": [ { @@ -1064,6 +1064,9 @@ "useAutoIndex": { "description": "if true use autoindex when restore vector index", "type": "boolean" + }, + "useV2Restore": { + "type": "boolean" } } }, @@ -1185,7 +1188,7 @@ "skipDiskQuotaCheck": { "type": "boolean" }, - "skip_params": { + "skipParams": { "$ref": "#/definitions/backuppb.SkipParams" }, "start_time": { @@ -1206,6 +1209,9 @@ "useAutoIndex": { "description": "if true use autoindex when restore vector index", "type": "boolean" + }, + "useV2Restore": { + "type": "boolean" } } }, @@ -1311,25 +1317,25 @@ "backuppb.SkipParams": { "type": "object", "properties": { - "collection_properties": { + "collectionProperties": { "type": "array", "items": { "type": "string" } }, - "filed_index_params": { + "fieldIndexParams": { "type": "array", "items": { "type": "string" } }, - "filed_type_params": { + "fieldTypeParams": { "type": "array", "items": { "type": "string" } }, - "index_params": { + "indexParams": { "type": "array", "items": { "type": "string" diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 06456b97..f2cc5109 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -565,10 +565,6 @@ 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 @@ -576,9 +572,15 @@ definitions: skipImportDiskQuotaCheck: description: if true, skip the diskQuota in Import type: boolean + skipParams: + allOf: + - $ref: '#/definitions/backuppb.SkipParams' + description: if key is set, will skip the params in restore process useAutoIndex: description: if true use autoindex when restore vector index type: boolean + useV2Restore: + type: boolean type: object backuppb.RestoreBackupResponse: properties: @@ -653,13 +655,13 @@ definitions: type: boolean restored_size: type: integer - skip_params: - $ref: '#/definitions/backuppb.SkipParams' skipCreateCollection: description: if true will skip create collections type: boolean skipDiskQuotaCheck: type: boolean + skipParams: + $ref: '#/definitions/backuppb.SkipParams' start_time: type: integer state_code: @@ -673,6 +675,8 @@ definitions: useAutoIndex: description: if true use autoindex when restore vector index type: boolean + useV2Restore: + type: boolean type: object backuppb.RestorePartitionTask: properties: @@ -747,19 +751,19 @@ definitions: type: object backuppb.SkipParams: properties: - collection_properties: + collectionProperties: items: type: string type: array - filed_index_params: + fieldIndexParams: items: type: string type: array - filed_type_params: + fieldTypeParams: items: type: string type: array - index_params: + indexParams: items: type: string type: array