From 069b97c3194eb20eb05ad1ed0e7905545879d70b Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:07:12 +0800 Subject: [PATCH 01/50] add toml\json field --- dm/config/subtask.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dm/config/subtask.go b/dm/config/subtask.go index 5c28bf88b7e..2577b18fb8a 100644 --- a/dm/config/subtask.go +++ b/dm/config/subtask.go @@ -182,13 +182,13 @@ type SubTaskConfig struct { // one go runtime. // IOTotalBytes is used build TCPConnWithIOCounter and UUID is used to as a // key to let MySQL driver to find the right TCPConnWithIOCounter. - UUID string `toml:"-" json:"-"` - IOTotalBytes *atomic.Uint64 `toml:"-" json:"-"` + UUID string `toml:"uuid" json:"uuid"` + IOTotalBytes *atomic.Uint64 `toml:"io-total-bytes" json:"io-total-bytes"` // meter network usage from upstream // e.g., pulling binlog - DumpUUID string `toml:"-" json:"-"` - DumpIOTotalBytes *atomic.Uint64 `toml:"-" json:"-"` + DumpUUID string `toml:"dump-uuid" json:"dump-uuid"` + DumpIOTotalBytes *atomic.Uint64 `toml:"dump-io-total-bytes" json:"dump-io-total-bytes"` } // SampleSubtaskConfig is the content of subtask.toml in current folder. From c78282e45d79cae919d0667d245371984a0e3a29 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:08:20 +0800 Subject: [PATCH 02/50] init subtask config from openapi --- dm/config/task_converters.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dm/config/task_converters.go b/dm/config/task_converters.go index 2c34e3838bd..46e2eea4baf 100644 --- a/dm/config/task_converters.go +++ b/dm/config/task_converters.go @@ -17,6 +17,7 @@ import ( "fmt" "strings" + "github.com/google/uuid" "github.com/pingcap/tidb/pkg/util/filter" router "github.com/pingcap/tidb/pkg/util/table-router" "github.com/pingcap/tiflow/dm/config/dbconfig" @@ -27,6 +28,7 @@ import ( "github.com/pingcap/tiflow/dm/pkg/terror" bf "github.com/pingcap/tiflow/pkg/binlog-filter" "github.com/pingcap/tiflow/pkg/column-mapping" + "go.uber.org/atomic" "go.uber.org/zap" ) @@ -308,6 +310,11 @@ func OpenAPITaskToSubTaskConfigs(task *openapi.Task, toDBCfg *dbconfig.DBConfig, if task.IgnoreCheckingItems != nil && len(*task.IgnoreCheckingItems) != 0 { subTaskCfg.IgnoreCheckingItems = *task.IgnoreCheckingItems } + // set syncer IO total bytes counter + subTaskCfg.IOTotalBytes = atomic.NewUint64(0) + subTaskCfg.DumpIOTotalBytes = atomic.NewUint64(0) + subTaskCfg.UUID = uuid.NewString() + subTaskCfg.DumpUUID = uuid.NewString() // adjust sub task config if err := subTaskCfg.Adjust(true); err != nil { return nil, terror.Annotatef(err, "source name %s", sourceCfg.SourceName) From 4d933198eb46149302ebb5e7c0f8dcb8ebed584a Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:09:30 +0800 Subject: [PATCH 03/50] retrun ioconter in status --- dm/master/openapi_controller.go | 2 ++ dm/syncer/status.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/dm/master/openapi_controller.go b/dm/master/openapi_controller.go index 9255af64030..fc57b1bfac0 100644 --- a/dm/master/openapi_controller.go +++ b/dm/master/openapi_controller.go @@ -584,6 +584,8 @@ func (s *Server) getTaskStatus(ctx context.Context, taskName string) ([]openapi. SyncerBinlogGtid: syncerS.SyncerBinlogGtid, TotalEvents: syncerS.TotalEvents, TotalTps: syncerS.TotalTps, + IoTotalBytes: syncerS.IOTotalBytes, + DumpIoTotalBytes: syncerS.DumpIOTotalBytes, } if unResolvedGroups := syncerS.GetUnresolvedGroups(); len(unResolvedGroups) > 0 { openapiSubTaskStatus.SyncStatus.UnresolvedGroups = make([]openapi.ShardingGroup, len(unResolvedGroups)) diff --git a/dm/syncer/status.go b/dm/syncer/status.go index 4544646f145..fcc1c322bd9 100644 --- a/dm/syncer/status.go +++ b/dm/syncer/status.go @@ -38,6 +38,8 @@ func (s *Syncer) Status(sourceStatus *binlog.SourceStatus) interface{} { RecentRps: s.rps.Load(), SyncerBinlog: syncerLocation.Position.String(), SecondsBehindMaster: s.secondsBehindMaster.Load(), + IOTotalBytes: s.cfg.IOTotalBytes.Load(), + DumpIOTotalBytes: s.cfg.DumpIOTotalBytes.Load(), } if syncerLocation.GetGTID() != nil { From 955ee74deb0f7113dff14029ddf25de561fc0d8c Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:10:20 +0800 Subject: [PATCH 04/50] regenerate openapi define --- dm/openapi/gen.server.go | 116 +++++++++++++++++++-------------------- dm/openapi/gen.types.go | 2 + dm/openapi/spec/dm.yaml | 8 +++ 3 files changed, 68 insertions(+), 58 deletions(-) diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index 12964ec809d..80a4950ef87 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -1298,64 +1298,64 @@ var swaggerSpec = []string{ "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", - "oSm6wJbjih9uP9/+XwAAAP//rLmSJF28AAA=", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/dm/openapi/gen.types.go b/dm/openapi/gen.types.go index a1ac719d35d..41b73b5c575 100644 --- a/dm/openapi/gen.types.go +++ b/dm/openapi/gen.types.go @@ -499,6 +499,8 @@ type SyncStatus struct { // sharding DDL which current is blocking BlockingDdls []string `json:"blocking_ddls"` + DumpIoTotalBytes uint64 `json:"dump_io_total_bytes"` + IoTotalBytes uint64 `json:"io_total_bytes"` MasterBinlog string `json:"master_binlog"` MasterBinlogGtid string `json:"master_binlog_gtid"` RecentTps int64 `json:"recent_tps"` diff --git a/dm/openapi/spec/dm.yaml b/dm/openapi/spec/dm.yaml index 9881b1538a2..29310fa2d0d 100644 --- a/dm/openapi/spec/dm.yaml +++ b/dm/openapi/spec/dm.yaml @@ -1500,6 +1500,12 @@ components: seconds_behind_master: type: integer format: int64 + io_total_bytes: + type: integer + format: uint64 + dump_io_total_bytes: + type: integer + format: uint64 required: - "total_events" - "total_tps" @@ -1513,6 +1519,8 @@ components: - "synced" - "binlog_type" - "seconds_behind_master" + - "io_total_bytes" + - "dump_io_total_bytes" DumpStatus: type: object description: "status of dump unit" From 175809968ce69edd73d86c308a81c659f421f439 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:10:50 +0800 Subject: [PATCH 05/50] update grpc proto --- dm/proto/dmworker.proto | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dm/proto/dmworker.proto b/dm/proto/dmworker.proto index bc067104cf3..c2701a31c17 100644 --- a/dm/proto/dmworker.proto +++ b/dm/proto/dmworker.proto @@ -166,6 +166,8 @@ message SyncStatus { int64 totalRows = 15; int64 totalRps = 16; int64 recentRps = 17; + uint64 iOTotalBytes = 18; + uint64 dumpIOTotalBytes = 19; } // SourceStatus represents status for source runing on dm-worker From 5adf6df5caeeb0f8913de219e9bbfe1dba4c6d45 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:11:45 +0800 Subject: [PATCH 06/50] update to github.com/golang/protobuf@v1.5.4 and generate-protobuf --- cdc/processor/tablepb/table.pb.go | 95 +++--- dm/pb/dmworker.pb.go | 447 ++++++++++++++----------- engine/enginepb/datarw.pb.go | 28 +- engine/enginepb/executor.pb.go | 16 +- engine/enginepb/master.pb.go | 526 +++++++++++++++--------------- engine/enginepb/projects.pb.go | 6 +- engine/enginepb/resources.pb.go | 18 +- engine/enginepb/test.pb.go | 8 +- tools/check/go.mod | 2 +- tools/check/go.sum | 7 + 10 files changed, 618 insertions(+), 535 deletions(-) diff --git a/cdc/processor/tablepb/table.pb.go b/cdc/processor/tablepb/table.pb.go index c4b86e83406..d27572c206b 100644 --- a/cdc/processor/tablepb/table.pb.go +++ b/cdc/processor/tablepb/table.pb.go @@ -179,7 +179,7 @@ type Stats struct { // Number of captured regions. RegionCount uint64 `protobuf:"varint,1,opt,name=region_count,json=regionCount,proto3" json:"region_count,omitempty"` // The current timestamp from the table's point of view. - CurrentTs Ts `protobuf:"varint,2,opt,name=current_ts,json=currentTs,proto3,casttype=Ts" json:"current_ts,omitempty"` + CurrentTs Ts `protobuf:"varint,2,opt,name=current_ts,json=currentTs,proto3,casttype=Ts" json:"current_ts,omitempty"` // Deprecated: Do not use. // Checkponits at each stage. StageCheckpoints map[string]Checkpoint `protobuf:"bytes,3,rep,name=stage_checkpoints,json=stageCheckpoints,proto3" json:"stage_checkpoints" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The barrier timestamp of the table. @@ -226,6 +226,7 @@ func (m *Stats) GetRegionCount() uint64 { return 0 } +// Deprecated: Do not use. func (m *Stats) GetCurrentTs() Ts { if m != nil { return m.CurrentTs @@ -337,52 +338,52 @@ func init() { func init() { proto.RegisterFile("processor/tablepb/table.proto", fileDescriptor_ae83c9c6cf5ef75c) } var fileDescriptor_ae83c9c6cf5ef75c = []byte{ - // 706 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xbf, 0x6f, 0xd3, 0x4e, - 0x1c, 0xb5, 0x9d, 0x5f, 0xcd, 0x27, 0xf9, 0x56, 0xee, 0x7d, 0xdb, 0x52, 0x22, 0x91, 0x98, 0xa8, - 0x40, 0xd5, 0x22, 0x07, 0xca, 0x82, 0xba, 0x35, 0x2d, 0xa0, 0xaa, 0x42, 0x42, 0x4e, 0x60, 0x60, - 0x89, 0x1c, 0xfb, 0x70, 0xad, 0x86, 0xb3, 0xe5, 0xbb, 0xb4, 0xca, 0xc6, 0x88, 0xb2, 0xd0, 0x09, - 0xb1, 0x44, 0xea, 0x9f, 0xd3, 0xb1, 0x23, 0x03, 0x8a, 0x20, 0x15, 0x33, 0x7b, 0x27, 0x74, 0x77, - 0x6e, 0xdc, 0x04, 0x86, 0xd0, 0x25, 0x39, 0xdf, 0x7b, 0x9f, 0xa7, 0xf7, 0xde, 0x9d, 0x0e, 0xee, - 0x84, 0x51, 0xe0, 0x60, 0x4a, 0x83, 0xa8, 0xc6, 0xec, 0x76, 0x07, 0x87, 0x6d, 0xf9, 0x6f, 0x86, - 0x51, 0xc0, 0x02, 0xb4, 0x1a, 0xfa, 0xc4, 0x73, 0xec, 0xd0, 0x64, 0xfe, 0xbb, 0x4e, 0x70, 0x6c, - 0x3a, 0xae, 0x63, 0x8e, 0x27, 0xcc, 0x78, 0xa2, 0xb4, 0xe8, 0x05, 0x5e, 0x20, 0x06, 0x6a, 0x7c, - 0x25, 0x67, 0xab, 0x9f, 0x54, 0x48, 0x37, 0x42, 0x9b, 0xa0, 0xc7, 0x30, 0x27, 0x98, 0x2d, 0xdf, - 0x5d, 0x51, 0x0d, 0x75, 0x2d, 0x55, 0x5f, 0x1e, 0x0d, 0x2b, 0xb9, 0x26, 0xdf, 0xdb, 0xdb, 0xbd, - 0x4c, 0x96, 0x56, 0x4e, 0xf0, 0xf6, 0x5c, 0xb4, 0x0a, 0x79, 0xca, 0xec, 0x88, 0xb5, 0x0e, 0x71, - 0x6f, 0x45, 0x33, 0xd4, 0xb5, 0x62, 0x3d, 0x77, 0x39, 0xac, 0xa4, 0xf6, 0x71, 0xcf, 0x9a, 0x13, - 0xc8, 0x3e, 0xee, 0x21, 0x03, 0x72, 0x98, 0xb8, 0x82, 0x93, 0x9a, 0xe4, 0x64, 0x31, 0x71, 0xf7, - 0x71, 0x6f, 0xab, 0xf8, 0xf1, 0xb4, 0xa2, 0x7c, 0x39, 0xad, 0x28, 0x1f, 0xbe, 0x19, 0x4a, 0xf5, - 0x44, 0x05, 0xd8, 0x39, 0xc0, 0xce, 0x61, 0x18, 0xf8, 0x84, 0xa1, 0x0d, 0xf8, 0xcf, 0x19, 0x7f, - 0xb5, 0x18, 0x15, 0xe6, 0xd2, 0xf5, 0xec, 0xe5, 0xb0, 0xa2, 0x35, 0xa9, 0x55, 0x4c, 0xc0, 0x26, - 0x45, 0x0f, 0xa0, 0x10, 0x61, 0x1a, 0x74, 0x8e, 0xb0, 0xcb, 0xa9, 0xda, 0x04, 0x15, 0xae, 0xa0, - 0x26, 0x45, 0x0f, 0x61, 0xbe, 0x63, 0x53, 0xd6, 0xa2, 0x3d, 0xe2, 0x48, 0x6e, 0x6a, 0x52, 0x96, - 0xa3, 0x0d, 0x01, 0x36, 0x69, 0xf5, 0xa7, 0x06, 0x99, 0x06, 0xb3, 0x19, 0x45, 0x77, 0xa1, 0x18, - 0x61, 0xcf, 0x0f, 0x48, 0xcb, 0x09, 0xba, 0x84, 0x49, 0x33, 0x56, 0x41, 0xee, 0xed, 0xf0, 0x2d, - 0x74, 0x0f, 0xc0, 0xe9, 0x46, 0x11, 0x96, 0x6e, 0x27, 0x2d, 0xe4, 0x63, 0xa4, 0x49, 0x11, 0x83, - 0x05, 0xca, 0x6c, 0x0f, 0xb7, 0x92, 0x00, 0xdc, 0x44, 0x6a, 0xad, 0xb0, 0xb9, 0x6d, 0xce, 0x72, - 0xa0, 0xa6, 0x70, 0xc4, 0x7f, 0x3d, 0x9c, 0xf4, 0x45, 0x9f, 0x11, 0x16, 0xf5, 0xea, 0xe9, 0xb3, - 0x61, 0x45, 0xb1, 0x74, 0x3a, 0x05, 0x72, 0x73, 0x6d, 0x3b, 0x8a, 0x7c, 0x1c, 0x71, 0x73, 0xe9, - 0x49, 0x73, 0x31, 0xd2, 0xa4, 0xa5, 0x2e, 0x2c, 0xfd, 0x55, 0x17, 0xe9, 0x90, 0xe2, 0x07, 0xc9, - 0x63, 0xe7, 0x2d, 0xbe, 0x44, 0xcf, 0x21, 0x73, 0x64, 0x77, 0xba, 0x58, 0x24, 0x2d, 0x6c, 0x3e, - 0x9a, 0xcd, 0x7b, 0x22, 0x6c, 0xc9, 0xf1, 0x2d, 0xed, 0xa9, 0x5a, 0xfd, 0xa5, 0x41, 0x41, 0xdc, - 0x32, 0x1e, 0xad, 0x4b, 0x6f, 0x72, 0x27, 0x77, 0x21, 0x4d, 0x43, 0x9b, 0xac, 0x64, 0x84, 0x9b, - 0xf5, 0x19, 0x9b, 0x0c, 0x6d, 0x12, 0x57, 0x26, 0xa6, 0x79, 0x28, 0xca, 0x6c, 0x26, 0x43, 0xcd, - 0xcf, 0x1a, 0x6a, 0x6c, 0x1d, 0x5b, 0x72, 0x1c, 0xbd, 0x01, 0x48, 0x8e, 0x57, 0x5c, 0xb1, 0x1b, - 0x34, 0x14, 0x3b, 0xbb, 0xa6, 0x84, 0x5e, 0x48, 0x7f, 0xf2, 0x04, 0x0b, 0x9b, 0x1b, 0xff, 0x70, - 0x61, 0x62, 0x35, 0x39, 0xbf, 0xfe, 0x59, 0x03, 0x48, 0x6c, 0xa3, 0x2a, 0xe4, 0x5e, 0x93, 0x43, - 0x12, 0x1c, 0x13, 0x5d, 0x29, 0x2d, 0xf5, 0x07, 0xc6, 0x42, 0x02, 0xc6, 0x00, 0x32, 0x20, 0xbb, - 0xdd, 0xa6, 0x98, 0x30, 0x5d, 0x2d, 0x2d, 0xf6, 0x07, 0x86, 0x9e, 0x50, 0xe4, 0x3e, 0xba, 0x0f, - 0xf9, 0x57, 0x11, 0x0e, 0xed, 0xc8, 0x27, 0x9e, 0xae, 0x95, 0x6e, 0xf5, 0x07, 0xc6, 0xff, 0x09, - 0x69, 0x0c, 0xa1, 0x55, 0x98, 0x93, 0x1f, 0xd8, 0xd5, 0x53, 0xa5, 0xe5, 0xfe, 0xc0, 0x40, 0xd3, - 0x34, 0xec, 0xa2, 0x75, 0x28, 0x58, 0x38, 0xec, 0xf8, 0x8e, 0xcd, 0xb8, 0x5e, 0xba, 0x74, 0xbb, - 0x3f, 0x30, 0x96, 0xae, 0x75, 0x9d, 0x80, 0x5c, 0xb1, 0xc1, 0x82, 0x90, 0xb7, 0xa1, 0x67, 0xa6, - 0x15, 0xaf, 0x10, 0x9e, 0x52, 0xac, 0xb1, 0xab, 0x67, 0xa7, 0x53, 0xc6, 0x40, 0xfd, 0xe5, 0xf9, - 0x8f, 0xb2, 0x72, 0x36, 0x2a, 0xab, 0xe7, 0xa3, 0xb2, 0xfa, 0x7d, 0x54, 0x56, 0x4f, 0x2e, 0xca, - 0xca, 0xf9, 0x45, 0x59, 0xf9, 0x7a, 0x51, 0x56, 0xde, 0xd6, 0x3c, 0x9f, 0x1d, 0x74, 0xdb, 0xa6, - 0x13, 0xbc, 0xaf, 0xc5, 0xd5, 0xd7, 0x64, 0xf5, 0x35, 0xc7, 0x75, 0x6a, 0x7f, 0x3c, 0xd7, 0xed, - 0xac, 0x78, 0x6d, 0x9f, 0xfc, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xa3, 0xeb, 0x06, 0x9b, 0xca, 0x05, - 0x00, 0x00, + // 716 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xbf, 0x6f, 0xdb, 0x38, + 0x18, 0x95, 0xe4, 0xdf, 0x9f, 0x7d, 0x81, 0xc2, 0x4b, 0x72, 0x3e, 0x03, 0x67, 0xeb, 0x8c, 0xdc, + 0x25, 0x48, 0x0e, 0xf2, 0x5d, 0x6e, 0x29, 0xb2, 0xc5, 0x49, 0x5b, 0x04, 0x41, 0x81, 0x42, 0x76, + 0x3b, 0x74, 0x31, 0x64, 0x89, 0x55, 0x84, 0xb8, 0x94, 0x20, 0xd2, 0x09, 0xbc, 0x75, 0x2c, 0xbc, + 0x34, 0x53, 0xd1, 0xc5, 0x40, 0xfe, 0x9c, 0x8c, 0x19, 0x3b, 0x14, 0x46, 0xeb, 0x0c, 0x1d, 0xbb, + 0x67, 0x2a, 0x48, 0x2a, 0x56, 0xec, 0x76, 0x70, 0xb3, 0xd8, 0x14, 0xdf, 0xfb, 0x1e, 0xde, 0x7b, + 0x24, 0x08, 0x7f, 0x84, 0x51, 0xe0, 0x60, 0x4a, 0x83, 0xa8, 0xc1, 0xec, 0x6e, 0x0f, 0x87, 0x5d, + 0xf9, 0x6f, 0x86, 0x51, 0xc0, 0x02, 0xb4, 0x1e, 0xfa, 0xc4, 0x73, 0xec, 0xd0, 0x64, 0xfe, 0xcb, + 0x5e, 0x70, 0x66, 0x3a, 0xae, 0x63, 0x4e, 0x27, 0xcc, 0x78, 0xa2, 0xb2, 0xe2, 0x05, 0x5e, 0x20, + 0x06, 0x1a, 0x7c, 0x25, 0x67, 0xeb, 0x6f, 0x55, 0x48, 0xb7, 0x42, 0x9b, 0xa0, 0xff, 0x20, 0x2f, + 0x98, 0x1d, 0xdf, 0x2d, 0xab, 0x86, 0xba, 0x99, 0x6a, 0xae, 0x4d, 0xc6, 0xb5, 0x5c, 0x9b, 0xef, + 0x1d, 0x1e, 0xdc, 0x24, 0x4b, 0x2b, 0x27, 0x78, 0x87, 0x2e, 0x5a, 0x87, 0x02, 0x65, 0x76, 0xc4, + 0x3a, 0x27, 0x78, 0x50, 0xd6, 0x0c, 0x75, 0xb3, 0xd4, 0xcc, 0xdd, 0x8c, 0x6b, 0xa9, 0x23, 0x3c, + 0xb0, 0xf2, 0x02, 0x39, 0xc2, 0x03, 0x64, 0x40, 0x0e, 0x13, 0x57, 0x70, 0x52, 0xb3, 0x9c, 0x2c, + 0x26, 0xee, 0x11, 0x1e, 0xec, 0x96, 0xde, 0x5c, 0xd4, 0x94, 0xf7, 0x17, 0x35, 0xe5, 0xf5, 0x47, + 0x43, 0xa9, 0x9f, 0xab, 0x00, 0xfb, 0xc7, 0xd8, 0x39, 0x09, 0x03, 0x9f, 0x30, 0xb4, 0x0d, 0xbf, + 0x38, 0xd3, 0xaf, 0x0e, 0xa3, 0xc2, 0x5c, 0xba, 0x99, 0xbd, 0x19, 0xd7, 0xb4, 0x36, 0xb5, 0x4a, + 0x09, 0xd8, 0xa6, 0x68, 0x03, 0x8a, 0x11, 0xa6, 0x41, 0xef, 0x14, 0xbb, 0x9c, 0xaa, 0xcd, 0x50, + 0xe1, 0x16, 0x6a, 0x53, 0xf4, 0x0f, 0x2c, 0xf5, 0x6c, 0xca, 0x3a, 0x74, 0x40, 0x1c, 0xc9, 0x4d, + 0xcd, 0xca, 0x72, 0xb4, 0x25, 0xc0, 0x36, 0xad, 0x7f, 0xd1, 0x20, 0xd3, 0x62, 0x36, 0xa3, 0xe8, + 0x4f, 0x28, 0x45, 0xd8, 0xf3, 0x03, 0xd2, 0x71, 0x82, 0x3e, 0x61, 0xd2, 0x8c, 0x55, 0x94, 0x7b, + 0xfb, 0x7c, 0x0b, 0x6d, 0x00, 0x38, 0xfd, 0x28, 0xc2, 0xd2, 0xad, 0xb4, 0x90, 0x97, 0xb2, 0x65, + 0xd5, 0x2a, 0xc4, 0x58, 0x9b, 0x22, 0x06, 0xcb, 0x94, 0xd9, 0x1e, 0xee, 0x24, 0x11, 0xb8, 0x8d, + 0xd4, 0x66, 0x71, 0x67, 0xcf, 0x5c, 0xe4, 0x48, 0x4d, 0xe1, 0x89, 0xff, 0x7a, 0x38, 0x69, 0x8c, + 0x3e, 0x24, 0x2c, 0x1a, 0x34, 0xd3, 0x97, 0xe3, 0x9a, 0x62, 0xe9, 0x74, 0x0e, 0x44, 0x7f, 0x01, + 0x74, 0xed, 0x28, 0xf2, 0x71, 0xc4, 0xed, 0xa5, 0x67, 0x52, 0x17, 0x62, 0xa4, 0x4d, 0x2b, 0x7d, + 0x58, 0xfd, 0xa1, 0x2e, 0xd2, 0x21, 0xc5, 0x8f, 0x92, 0x07, 0x2f, 0x58, 0x7c, 0x89, 0x1e, 0x41, + 0xe6, 0xd4, 0xee, 0xf5, 0xb1, 0xc8, 0x5a, 0xdc, 0xf9, 0x77, 0x31, 0xef, 0x89, 0xb0, 0x25, 0xc7, + 0x77, 0xb5, 0x07, 0x6a, 0xfd, 0xab, 0x06, 0x45, 0x71, 0xcf, 0x78, 0xb4, 0x3e, 0xbd, 0xcf, 0xad, + 0x3c, 0x80, 0x34, 0x0d, 0x6d, 0x52, 0xce, 0x08, 0x37, 0x5b, 0x0b, 0x36, 0x19, 0xda, 0x24, 0xae, + 0x4c, 0x4c, 0xf3, 0x50, 0x94, 0xd9, 0x4c, 0x86, 0x5a, 0x5a, 0x34, 0xd4, 0xd4, 0x3a, 0xb6, 0xe4, + 0x38, 0x7a, 0x0e, 0x90, 0x1c, 0xaf, 0xb8, 0x64, 0xf7, 0x68, 0x28, 0x76, 0x76, 0x47, 0x09, 0x3d, + 0x96, 0xfe, 0xe4, 0x09, 0x16, 0x77, 0xb6, 0x7f, 0xe2, 0xc2, 0xc4, 0x6a, 0x72, 0x7e, 0xeb, 0x9d, + 0x06, 0x90, 0xd8, 0x46, 0x75, 0xc8, 0x3d, 0x23, 0x27, 0x24, 0x38, 0x23, 0xba, 0x52, 0x59, 0x1d, + 0x8e, 0x8c, 0xe5, 0x04, 0x8c, 0x01, 0x64, 0x40, 0x76, 0xaf, 0x4b, 0x31, 0x61, 0xba, 0x5a, 0x59, + 0x19, 0x8e, 0x0c, 0x3d, 0xa1, 0xc8, 0x7d, 0xf4, 0x37, 0x14, 0x9e, 0x46, 0x38, 0xb4, 0x23, 0x9f, + 0x78, 0xba, 0x56, 0xf9, 0x6d, 0x38, 0x32, 0x7e, 0x4d, 0x48, 0x53, 0x08, 0xad, 0x43, 0x5e, 0x7e, + 0x60, 0x57, 0x4f, 0x55, 0xd6, 0x86, 0x23, 0x03, 0xcd, 0xd3, 0xb0, 0x8b, 0xb6, 0xa0, 0x68, 0xe1, + 0xb0, 0xe7, 0x3b, 0x36, 0xe3, 0x7a, 0xe9, 0xca, 0xef, 0xc3, 0x91, 0xb1, 0x7a, 0xa7, 0xeb, 0x04, + 0xe4, 0x8a, 0x2d, 0x16, 0x84, 0xbc, 0x0d, 0x3d, 0x33, 0xaf, 0x78, 0x8b, 0xf0, 0x94, 0x62, 0x8d, + 0x5d, 0x3d, 0x3b, 0x9f, 0x32, 0x06, 0x9a, 0x4f, 0xae, 0x3e, 0x57, 0x95, 0xcb, 0x49, 0x55, 0xbd, + 0x9a, 0x54, 0xd5, 0x4f, 0x93, 0xaa, 0x7a, 0x7e, 0x5d, 0x55, 0xae, 0xae, 0xab, 0xca, 0x87, 0xeb, + 0xaa, 0xf2, 0xa2, 0xe1, 0xf9, 0xec, 0xb8, 0xdf, 0x35, 0x9d, 0xe0, 0x55, 0x23, 0xae, 0xbe, 0x21, + 0xab, 0x6f, 0x38, 0xae, 0xd3, 0xf8, 0xee, 0xc1, 0xee, 0x66, 0xc5, 0x7b, 0xfb, 0xff, 0xb7, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x53, 0x4d, 0xc5, 0xfa, 0xcc, 0x05, 0x00, 0x00, } func (m *Span) Marshal() (dAtA []byte, err error) { diff --git a/dm/pb/dmworker.pb.go b/dm/pb/dmworker.pb.go index 098648f4268..f538436a4ba 100644 --- a/dm/pb/dmworker.pb.go +++ b/dm/pb/dmworker.pb.go @@ -961,6 +961,8 @@ type SyncStatus struct { TotalRows int64 `protobuf:"varint,15,opt,name=totalRows,proto3" json:"totalRows,omitempty"` TotalRps int64 `protobuf:"varint,16,opt,name=totalRps,proto3" json:"totalRps,omitempty"` RecentRps int64 `protobuf:"varint,17,opt,name=recentRps,proto3" json:"recentRps,omitempty"` + IOTotalBytes uint64 `protobuf:"varint,18,opt,name=iOTotalBytes,proto3" json:"iOTotalBytes,omitempty"` + DumpIOTotalBytes uint64 `protobuf:"varint,19,opt,name=dumpIOTotalBytes,proto3" json:"dumpIOTotalBytes,omitempty"` } func (m *SyncStatus) Reset() { *m = SyncStatus{} } @@ -1115,6 +1117,20 @@ func (m *SyncStatus) GetRecentRps() int64 { return 0 } +func (m *SyncStatus) GetIOTotalBytes() uint64 { + if m != nil { + return m.IOTotalBytes + } + return 0 +} + +func (m *SyncStatus) GetDumpIOTotalBytes() uint64 { + if m != nil { + return m.DumpIOTotalBytes + } + return 0 +} + // SourceStatus represents status for source runing on dm-worker type SourceStatus struct { Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` @@ -3637,192 +3653,193 @@ func init() { func init() { proto.RegisterFile("dmworker.proto", fileDescriptor_51a1b9e17fd67b10) } var fileDescriptor_51a1b9e17fd67b10 = []byte{ - // 2947 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0xcd, 0x6f, 0xe5, 0x56, - 0xf5, 0xcf, 0xf6, 0xfb, 0x3c, 0xef, 0x25, 0x71, 0xee, 0x64, 0xe6, 0xf7, 0x9a, 0xce, 0xbc, 0xa6, - 0x9e, 0xaa, 0xbf, 0x34, 0x2a, 0x51, 0x1b, 0x8a, 0x8a, 0x2a, 0x41, 0xdb, 0x49, 0xa6, 0x99, 0x29, - 0x99, 0x66, 0xc6, 0x49, 0x87, 0x15, 0x12, 0x8e, 0xdf, 0xcd, 0x8b, 0x89, 0x9f, 0xed, 0xb1, 0xfd, - 0x12, 0x65, 0x81, 0xd8, 0xb1, 0x85, 0x0d, 0x48, 0x20, 0x36, 0x20, 0xb1, 0x65, 0xc1, 0x1f, 0xc0, - 0x12, 0xba, 0xac, 0x58, 0xb1, 0x42, 0xa8, 0xf3, 0x37, 0xb0, 0x61, 0x81, 0xd0, 0x39, 0xf7, 0x5e, - 0xfb, 0xfa, 0x7d, 0x64, 0x3a, 0x48, 0xec, 0x7c, 0x3e, 0xee, 0xb9, 0xc7, 0xe7, 0xfb, 0xf8, 0x3d, - 0x58, 0x1e, 0x8e, 0x2f, 0xe3, 0xf4, 0x9c, 0xa7, 0xdb, 0x49, 0x1a, 0xe7, 0x31, 0x33, 0x93, 0x13, - 0x67, 0x13, 0xd8, 0x93, 0x09, 0x4f, 0xaf, 0x8e, 0x72, 0x2f, 0x9f, 0x64, 0x2e, 0x7f, 0x36, 0xe1, - 0x59, 0xce, 0x18, 0xd4, 0x23, 0x6f, 0xcc, 0xfb, 0xc6, 0x86, 0xb1, 0xd9, 0x71, 0xe9, 0xd9, 0x49, - 0x60, 0x6d, 0x37, 0x1e, 0x8f, 0xe3, 0xe8, 0xfb, 0x24, 0xc3, 0xe5, 0x59, 0x12, 0x47, 0x19, 0x67, - 0xb7, 0xa0, 0x99, 0xf2, 0x6c, 0x12, 0xe6, 0xc4, 0xdd, 0x76, 0x25, 0xc4, 0x6c, 0xb0, 0xc6, 0xd9, - 0xa8, 0x6f, 0x92, 0x08, 0x7c, 0x44, 0xce, 0x2c, 0x9e, 0xa4, 0x3e, 0xef, 0x5b, 0x84, 0x94, 0x10, - 0xe2, 0x85, 0x5e, 0xfd, 0xba, 0xc0, 0x0b, 0xc8, 0xf9, 0x83, 0x01, 0x37, 0x2a, 0xca, 0xbd, 0xf4, - 0x8d, 0xef, 0x41, 0x4f, 0xdc, 0x21, 0x24, 0xd0, 0xbd, 0xdd, 0x1d, 0x7b, 0x3b, 0x39, 0xd9, 0x3e, - 0xd2, 0xf0, 0x6e, 0x85, 0x8b, 0xbd, 0x0f, 0x4b, 0xd9, 0xe4, 0xe4, 0xd8, 0xcb, 0xce, 0xe5, 0xb1, - 0xfa, 0x86, 0xb5, 0xd9, 0xdd, 0x59, 0xa5, 0x63, 0x3a, 0xc1, 0xad, 0xf2, 0x39, 0xbf, 0x37, 0xa0, - 0xbb, 0x7b, 0xc6, 0x7d, 0x09, 0xa3, 0xa2, 0x89, 0x97, 0x65, 0x7c, 0xa8, 0x14, 0x15, 0x10, 0x5b, - 0x83, 0x46, 0x1e, 0xe7, 0x5e, 0x48, 0xaa, 0x36, 0x5c, 0x01, 0xb0, 0x01, 0x40, 0x36, 0xf1, 0x7d, - 0x9e, 0x65, 0xa7, 0x93, 0x90, 0x54, 0x6d, 0xb8, 0x1a, 0x06, 0xa5, 0x9d, 0x7a, 0x41, 0xc8, 0x87, - 0x64, 0xa6, 0x86, 0x2b, 0x21, 0xd6, 0x87, 0xd6, 0xa5, 0x97, 0x46, 0x41, 0x34, 0xea, 0x37, 0x88, - 0xa0, 0x40, 0x3c, 0x31, 0xe4, 0xb9, 0x17, 0x84, 0xfd, 0xe6, 0x86, 0xb1, 0xd9, 0x73, 0x25, 0xe4, - 0xfc, 0xdb, 0x00, 0xd8, 0x9b, 0x8c, 0x13, 0xa9, 0xe6, 0x06, 0x74, 0x49, 0x83, 0x63, 0xef, 0x24, - 0xe4, 0x19, 0xe9, 0x6a, 0xb9, 0x3a, 0x8a, 0x6d, 0xc2, 0x8a, 0x1f, 0x8f, 0x93, 0x90, 0xe7, 0x7c, - 0x28, 0xb9, 0x50, 0x75, 0xc3, 0x9d, 0x46, 0xb3, 0x37, 0x60, 0xe9, 0x34, 0x88, 0x82, 0xec, 0x8c, - 0x0f, 0xef, 0x5d, 0xe5, 0x5c, 0x98, 0xdc, 0x70, 0xab, 0x48, 0xe6, 0x40, 0x4f, 0x21, 0xdc, 0xf8, - 0x32, 0xa3, 0x17, 0x32, 0xdc, 0x0a, 0x8e, 0xbd, 0x0d, 0xab, 0x3c, 0xcb, 0x83, 0xb1, 0x97, 0xf3, - 0x63, 0x54, 0x85, 0x18, 0x1b, 0xc4, 0x38, 0x4b, 0x40, 0xdf, 0x9f, 0x24, 0x19, 0xbd, 0xa7, 0xe5, - 0xe2, 0x23, 0x5b, 0x87, 0x76, 0x92, 0xc6, 0xa3, 0x94, 0x67, 0x59, 0xbf, 0x45, 0x21, 0x51, 0xc0, - 0xce, 0x17, 0x06, 0xc0, 0x41, 0xec, 0x0d, 0xa5, 0x01, 0x66, 0x94, 0x16, 0x26, 0x98, 0x52, 0x7a, - 0x00, 0x40, 0x36, 0x11, 0x2c, 0x26, 0xb1, 0x68, 0x98, 0xca, 0x85, 0x56, 0xf5, 0x42, 0x3c, 0x3b, - 0xe6, 0xb9, 0x77, 0x2f, 0x88, 0xc2, 0x78, 0x24, 0xc3, 0x5c, 0xc3, 0xb0, 0x37, 0x61, 0xb9, 0x84, - 0xf6, 0x8f, 0x1f, 0xee, 0xd1, 0x9b, 0x76, 0xdc, 0x29, 0xec, 0xec, 0x6b, 0x3a, 0xbf, 0x30, 0x60, - 0xe9, 0xe8, 0xcc, 0x4b, 0x87, 0x41, 0x34, 0xda, 0x4f, 0xe3, 0x49, 0x82, 0x5e, 0xcf, 0xbd, 0x74, - 0xc4, 0x73, 0x99, 0xbe, 0x12, 0xc2, 0xa4, 0xde, 0xdb, 0x3b, 0x40, 0xcd, 0x2d, 0x4c, 0x6a, 0x7c, - 0x16, 0x6f, 0x9e, 0x66, 0xf9, 0x41, 0xec, 0x7b, 0x79, 0x10, 0x47, 0x52, 0xf1, 0x2a, 0x92, 0x12, - 0xf7, 0x2a, 0xf2, 0x29, 0xf2, 0x2c, 0x4a, 0x5c, 0x82, 0xf0, 0x8d, 0x27, 0x91, 0xa4, 0x34, 0x88, - 0x52, 0xc0, 0xce, 0x3f, 0xeb, 0x00, 0x47, 0x57, 0x91, 0x3f, 0x15, 0x63, 0xf7, 0x2f, 0x78, 0x94, - 0x57, 0x63, 0x4c, 0xa0, 0x50, 0x98, 0x08, 0xb9, 0x44, 0x19, 0xb7, 0x80, 0xd9, 0x6d, 0xe8, 0xa4, - 0xdc, 0xe7, 0x51, 0x8e, 0x44, 0x8b, 0x88, 0x25, 0x02, 0xa3, 0x69, 0xec, 0x65, 0x39, 0x4f, 0x2b, - 0xe6, 0xad, 0xe0, 0xd8, 0x16, 0xd8, 0x3a, 0xbc, 0x9f, 0x07, 0x43, 0x69, 0xe2, 0x19, 0x3c, 0xca, - 0xa3, 0x97, 0x50, 0xf2, 0x9a, 0x42, 0x9e, 0x8e, 0x43, 0x79, 0x3a, 0x4c, 0xf2, 0x44, 0x94, 0xcd, - 0xe0, 0x51, 0xde, 0x49, 0x18, 0xfb, 0xe7, 0x41, 0x34, 0x22, 0x07, 0xb4, 0xc9, 0x54, 0x15, 0x1c, - 0xfb, 0x0e, 0xd8, 0x93, 0x28, 0xe5, 0x59, 0x1c, 0x5e, 0xf0, 0x21, 0xf9, 0x31, 0xeb, 0x77, 0xb4, - 0xb2, 0xa3, 0x7b, 0xd8, 0x9d, 0x61, 0xd5, 0x3c, 0x04, 0xa2, 0xd2, 0x48, 0x0f, 0x0d, 0x00, 0x4e, - 0x48, 0x91, 0xe3, 0xab, 0x84, 0xf7, 0xbb, 0x22, 0xee, 0x4a, 0x0c, 0x7b, 0x07, 0x6e, 0x64, 0xdc, - 0x8f, 0xa3, 0x61, 0x76, 0x8f, 0x9f, 0x05, 0xd1, 0xf0, 0x11, 0xd9, 0xa2, 0xdf, 0x23, 0x13, 0xcf, - 0x23, 0x61, 0xc4, 0x90, 0xe2, 0x7b, 0x7b, 0x07, 0x87, 0x97, 0x11, 0x4f, 0xfb, 0x4b, 0x22, 0x62, - 0x2a, 0x48, 0x74, 0xb7, 0x1f, 0x47, 0xa7, 0x61, 0xe0, 0xe7, 0x8f, 0xb2, 0x51, 0x7f, 0x99, 0x78, - 0x74, 0x14, 0xba, 0x34, 0x2f, 0xd2, 0x7a, 0x45, 0xb8, 0xb4, 0x40, 0x14, 0xc1, 0xe0, 0x26, 0x59, - 0xdf, 0xd6, 0x82, 0xc1, 0xd5, 0x83, 0x01, 0x89, 0xab, 0x7a, 0x30, 0xb8, 0x49, 0xe6, 0xfc, 0xc6, - 0x80, 0x9e, 0x5e, 0xdb, 0xb5, 0xae, 0x63, 0x2c, 0xe8, 0x3a, 0xa6, 0xde, 0x75, 0xd8, 0x5b, 0x45, - 0x77, 0x11, 0xdd, 0x82, 0xec, 0xff, 0x38, 0x8d, 0xb1, 0x0c, 0xbb, 0x44, 0x28, 0x1a, 0xce, 0xbb, - 0xd0, 0x4d, 0x79, 0xe8, 0x5d, 0x15, 0x6d, 0x02, 0xf9, 0x57, 0x90, 0xdf, 0x2d, 0xd1, 0xae, 0xce, - 0xe3, 0xfc, 0xc5, 0x84, 0xae, 0x46, 0x9c, 0x89, 0x5d, 0xe3, 0x6b, 0xc6, 0xae, 0xb9, 0x20, 0x76, - 0x37, 0x94, 0x4a, 0x93, 0x93, 0xbd, 0x20, 0x95, 0xe9, 0xac, 0xa3, 0x0a, 0x8e, 0x4a, 0xb2, 0xe8, - 0x28, 0xac, 0xf6, 0x1a, 0xa8, 0xa5, 0xca, 0x34, 0x9a, 0x6d, 0x03, 0x23, 0xd4, 0xae, 0x97, 0xfb, - 0x67, 0x9f, 0x27, 0x32, 0x7a, 0x9a, 0x14, 0x82, 0x73, 0x28, 0xec, 0x35, 0x68, 0x64, 0xb9, 0x37, - 0xe2, 0x94, 0x2a, 0xcb, 0x3b, 0x1d, 0x0a, 0x6d, 0x44, 0xb8, 0x02, 0xaf, 0x19, 0xbf, 0xfd, 0x02, - 0xe3, 0x3b, 0x7f, 0xb4, 0x60, 0xa9, 0xd2, 0x8d, 0xe7, 0x4d, 0x2d, 0xe5, 0x8d, 0xe6, 0x82, 0x1b, - 0x37, 0xa0, 0x3e, 0x89, 0x02, 0xe1, 0xec, 0xe5, 0x9d, 0x1e, 0xd2, 0x3f, 0x8f, 0x82, 0x1c, 0xb3, - 0xc3, 0x25, 0x8a, 0xa6, 0x53, 0xfd, 0x45, 0x01, 0xf1, 0x0e, 0xdc, 0x28, 0x53, 0x73, 0x6f, 0xef, - 0xe0, 0x20, 0xf6, 0xcf, 0x8b, 0x5a, 0x3e, 0x8f, 0xc4, 0x98, 0x98, 0x59, 0xa8, 0xc4, 0x3c, 0xa8, - 0x89, 0xa9, 0xe5, 0xff, 0xa1, 0xe1, 0xe3, 0x14, 0x41, 0x56, 0x92, 0x01, 0xa5, 0x8d, 0x15, 0x0f, - 0x6a, 0xae, 0xa0, 0xb3, 0x37, 0xa0, 0x3e, 0x9c, 0x8c, 0x13, 0x69, 0xab, 0x65, 0xe4, 0x2b, 0xdb, - 0xfa, 0x83, 0x9a, 0x4b, 0x54, 0xe4, 0x0a, 0x63, 0x6f, 0xd8, 0xef, 0x94, 0x5c, 0x65, 0xef, 0x43, - 0x2e, 0xa4, 0x22, 0x17, 0xd6, 0x0c, 0xaa, 0x1f, 0x92, 0xab, 0x2c, 0xdf, 0xc8, 0x85, 0x54, 0xf6, - 0x1e, 0xc0, 0x85, 0x17, 0x06, 0x43, 0xd1, 0x2c, 0xba, 0xc4, 0xbb, 0x86, 0xbc, 0x4f, 0x0b, 0xac, - 0x8c, 0x7a, 0x8d, 0xef, 0x5e, 0x1b, 0x9a, 0x99, 0x08, 0xff, 0xef, 0xc2, 0x6a, 0xc5, 0x67, 0x07, - 0x41, 0x46, 0x06, 0x16, 0xe4, 0xbe, 0xb1, 0x68, 0xd0, 0x52, 0xe7, 0x07, 0x00, 0x64, 0x89, 0xfb, - 0x69, 0x1a, 0xa7, 0x6a, 0xe0, 0x33, 0x8a, 0x81, 0xcf, 0xb9, 0x03, 0x1d, 0xb4, 0xc0, 0x35, 0x64, - 0x7c, 0xf5, 0x45, 0xe4, 0x04, 0x7a, 0xf4, 0xce, 0x4f, 0x0e, 0x16, 0x70, 0xb0, 0x1d, 0x58, 0x13, - 0x53, 0x97, 0x48, 0x82, 0xc7, 0x71, 0x16, 0x90, 0x25, 0x44, 0x3a, 0xce, 0xa5, 0x61, 0x2d, 0xe3, - 0x28, 0xee, 0xe8, 0xc9, 0x81, 0x9a, 0x0b, 0x14, 0xec, 0x7c, 0x0b, 0x3a, 0x78, 0xa3, 0xb8, 0x6e, - 0x13, 0x9a, 0x44, 0x50, 0x76, 0xb0, 0x0b, 0x27, 0x48, 0x85, 0x5c, 0x49, 0x77, 0x7e, 0x66, 0x40, - 0x57, 0x14, 0x39, 0x71, 0xf2, 0x65, 0x6b, 0xdc, 0x46, 0xe5, 0xb8, 0xaa, 0x12, 0xba, 0xc4, 0x6d, - 0x00, 0x2a, 0x53, 0x82, 0xa1, 0x5e, 0x06, 0x45, 0x89, 0x75, 0x35, 0x0e, 0x74, 0x4c, 0x09, 0xcd, - 0x31, 0xed, 0xaf, 0x4c, 0xe8, 0x49, 0x97, 0x0a, 0x96, 0xff, 0x51, 0xb2, 0xca, 0x7c, 0xaa, 0xeb, - 0xf9, 0xf4, 0xa6, 0xca, 0xa7, 0x46, 0xf9, 0x1a, 0x65, 0x14, 0x95, 0xe9, 0x74, 0x57, 0xa6, 0x53, - 0x93, 0xd8, 0x96, 0x54, 0x3a, 0x29, 0x2e, 0x91, 0x4d, 0x77, 0x65, 0x36, 0xb5, 0x4a, 0xa6, 0x22, - 0xa4, 0x8a, 0x64, 0xba, 0x2b, 0x93, 0xa9, 0x5d, 0x32, 0x15, 0x6e, 0x56, 0xb9, 0x74, 0xaf, 0x05, - 0x0d, 0x72, 0xa7, 0xf3, 0x01, 0xd8, 0xba, 0x69, 0x28, 0x27, 0xde, 0x94, 0xc4, 0x4a, 0x28, 0x68, - 0x4c, 0xae, 0x3c, 0xfb, 0x0c, 0x96, 0x2a, 0xa5, 0x08, 0x3b, 0x7e, 0x90, 0xed, 0x7a, 0x91, 0xcf, - 0xc3, 0x62, 0xef, 0xd0, 0x30, 0x5a, 0x90, 0x99, 0xa5, 0x64, 0x29, 0xa2, 0x12, 0x64, 0xda, 0xf6, - 0x60, 0x55, 0xb6, 0x87, 0xbf, 0x1a, 0xd0, 0xd3, 0x0f, 0xe0, 0x02, 0x72, 0x3f, 0x4d, 0x77, 0xe3, - 0xa1, 0xf0, 0x66, 0xc3, 0x55, 0x20, 0x86, 0x3e, 0x3e, 0x86, 0x5e, 0x96, 0xc9, 0x08, 0x2c, 0x60, - 0x49, 0x3b, 0xf2, 0xe3, 0x44, 0xed, 0x83, 0x05, 0x2c, 0x69, 0x07, 0xfc, 0x82, 0x87, 0xb2, 0x41, - 0x15, 0x30, 0xde, 0xf6, 0x88, 0x67, 0x19, 0x86, 0x89, 0xa8, 0xab, 0x0a, 0xc4, 0x53, 0xae, 0x77, - 0xb9, 0xeb, 0x4d, 0x32, 0x2e, 0x67, 0xb6, 0x02, 0x46, 0xb3, 0xe0, 0xde, 0xea, 0xa5, 0xf1, 0x24, - 0x52, 0x93, 0x9a, 0x86, 0x71, 0x2e, 0x61, 0xf5, 0xf1, 0x24, 0x1d, 0x71, 0x0a, 0x62, 0xb5, 0x06, - 0xaf, 0x43, 0x3b, 0x88, 0x3c, 0x3f, 0x0f, 0x2e, 0xb8, 0xb4, 0x64, 0x01, 0x63, 0xfc, 0xe6, 0xc1, - 0x98, 0xcb, 0x51, 0x95, 0x9e, 0x91, 0xff, 0x34, 0x08, 0x39, 0xc5, 0xb5, 0x7c, 0x25, 0x05, 0x53, - 0x8a, 0x8a, 0x9e, 0x2c, 0x97, 0x5c, 0x01, 0x39, 0xbf, 0x36, 0x61, 0xfd, 0x30, 0xe1, 0xa9, 0x97, - 0x73, 0xb1, 0x58, 0x1f, 0xf9, 0x67, 0x7c, 0xec, 0x29, 0x15, 0x6e, 0x83, 0x19, 0x27, 0x74, 0xb9, - 0x8c, 0x77, 0x41, 0x3e, 0x4c, 0x5c, 0x33, 0x4e, 0x48, 0x09, 0x2f, 0x3b, 0x97, 0xb6, 0xa5, 0xe7, - 0x85, 0x5b, 0xf6, 0x3a, 0xb4, 0x87, 0x5e, 0xee, 0x9d, 0x78, 0x19, 0x57, 0x36, 0x55, 0x30, 0x2d, - 0xa4, 0xb8, 0xbf, 0x49, 0x8b, 0x0a, 0x80, 0x24, 0xd1, 0x6d, 0xd2, 0x9a, 0x12, 0x42, 0xee, 0xd3, - 0x70, 0x92, 0x9d, 0x91, 0x19, 0xdb, 0xae, 0x00, 0x50, 0x97, 0x22, 0xe6, 0xdb, 0xb2, 0x5d, 0x0c, - 0x00, 0x4e, 0xd3, 0x78, 0x2c, 0x0a, 0x0b, 0x35, 0xa0, 0xb6, 0xab, 0x61, 0x14, 0xfd, 0x58, 0xac, - 0x2b, 0x50, 0xd2, 0x05, 0xc6, 0xc9, 0x61, 0xe9, 0xe9, 0xbb, 0x32, 0xec, 0x1f, 0xf1, 0xdc, 0x63, - 0xeb, 0x9a, 0x39, 0x00, 0xcd, 0x81, 0x14, 0x69, 0x8c, 0x17, 0x56, 0x0f, 0x55, 0x72, 0x2c, 0xad, - 0xe4, 0x28, 0x0b, 0xd6, 0x29, 0xc4, 0xe9, 0xd9, 0x79, 0x0f, 0xd6, 0xa4, 0x47, 0x9e, 0xbe, 0x8b, - 0xb7, 0x2e, 0xf4, 0x85, 0x20, 0x8b, 0xeb, 0x9d, 0x3f, 0x1b, 0x70, 0x73, 0xea, 0xd8, 0x4b, 0x7f, - 0xaf, 0x78, 0x1f, 0xea, 0xb8, 0xf0, 0xf5, 0x2d, 0x4a, 0xcd, 0xbb, 0x78, 0xc7, 0x5c, 0x91, 0xdb, - 0x08, 0xdc, 0x8f, 0xf2, 0xf4, 0xca, 0xa5, 0x03, 0xeb, 0x9f, 0x42, 0xa7, 0x40, 0xa1, 0xdc, 0x73, - 0x7e, 0xa5, 0xaa, 0xef, 0x39, 0xbf, 0xc2, 0x89, 0xe2, 0xc2, 0x0b, 0x27, 0xc2, 0x34, 0xb2, 0xc1, - 0x56, 0x0c, 0xeb, 0x0a, 0xfa, 0x07, 0xe6, 0xb7, 0x0d, 0xe7, 0xc7, 0xd0, 0x7f, 0xe0, 0x45, 0xc3, - 0x50, 0xc6, 0xa3, 0x28, 0x0a, 0xd2, 0x04, 0xaf, 0x6a, 0x26, 0xe8, 0xa2, 0x14, 0xa2, 0x5e, 0x13, - 0x8d, 0xb7, 0xa1, 0x73, 0xa2, 0xda, 0xa1, 0x34, 0x7c, 0x89, 0xa0, 0x98, 0x79, 0x16, 0x66, 0x72, - 0xad, 0xa4, 0x67, 0xe7, 0x26, 0xdc, 0xd8, 0xe7, 0xb9, 0xb8, 0x7b, 0xf7, 0x74, 0x24, 0x6f, 0x76, - 0x36, 0x61, 0xad, 0x8a, 0x96, 0xc6, 0xb5, 0xc1, 0xf2, 0x4f, 0x8b, 0x56, 0xe3, 0x9f, 0x8e, 0x9c, - 0x23, 0xb8, 0x23, 0xa6, 0xa5, 0xc9, 0x09, 0xaa, 0x80, 0xa5, 0xef, 0xf3, 0x64, 0xe8, 0xe5, 0x5c, - 0xbd, 0xc4, 0x0e, 0xac, 0x65, 0x82, 0xb6, 0x7b, 0x3a, 0x3a, 0x8e, 0xc7, 0xe1, 0x51, 0x9e, 0x06, - 0x91, 0x92, 0x31, 0x97, 0xe6, 0x1c, 0xc0, 0x60, 0x91, 0x50, 0xa9, 0x48, 0x1f, 0x5a, 0xf2, 0x63, - 0x8d, 0x74, 0xb3, 0x02, 0x67, 0xfd, 0xec, 0x8c, 0x60, 0x7d, 0x9f, 0xe7, 0x33, 0x33, 0x53, 0x59, - 0x76, 0xf0, 0x8e, 0xcf, 0xca, 0xf6, 0x58, 0xc0, 0xec, 0x1b, 0xd0, 0x3b, 0x0d, 0xc2, 0x9c, 0xa7, - 0x72, 0xe7, 0x98, 0x89, 0xf5, 0x0a, 0xd9, 0xf9, 0xbb, 0x05, 0xf6, 0xf4, 0x35, 0x85, 0x9f, 0x8c, - 0xb9, 0x55, 0xc3, 0xac, 0x54, 0x0d, 0x06, 0xf5, 0x31, 0x16, 0x76, 0x99, 0x33, 0xf8, 0x5c, 0x26, - 0x5a, 0x7d, 0x41, 0xa2, 0x6d, 0xc2, 0x8a, 0x9c, 0xfe, 0x62, 0xb5, 0xd7, 0xc8, 0x05, 0x62, 0x0a, - 0x8d, 0x03, 0xf3, 0x14, 0x8a, 0xd6, 0x0d, 0x51, 0x6f, 0xe6, 0x91, 0xb4, 0x69, 0xbc, 0xf5, 0x35, - 0xa6, 0xf1, 0x44, 0x10, 0xc4, 0x27, 0x25, 0x69, 0xb2, 0xb6, 0x10, 0x3e, 0x87, 0xc4, 0xde, 0x86, - 0xd5, 0x84, 0x47, 0xb8, 0x68, 0x6b, 0xfc, 0x1d, 0xe2, 0x9f, 0x25, 0xe0, 0x6b, 0x52, 0xab, 0xd4, - 0x78, 0x41, 0xbc, 0xe6, 0x14, 0x1a, 0x37, 0x38, 0x7f, 0x92, 0xc7, 0x17, 0x6a, 0x55, 0xc3, 0x64, - 0x10, 0xcb, 0xf8, 0x0c, 0x1e, 0x75, 0xa8, 0xe0, 0xc8, 0x20, 0x3d, 0xa1, 0xc3, 0x0c, 0xc1, 0xf9, - 0x9d, 0x01, 0x37, 0x4b, 0x07, 0xd3, 0x47, 0xb8, 0x17, 0xec, 0xbd, 0xeb, 0xd0, 0xce, 0x52, 0x9f, - 0x38, 0x55, 0x4f, 0x56, 0x30, 0xf5, 0x88, 0x2c, 0x17, 0x34, 0xd9, 0xc0, 0x14, 0xfc, 0x62, 0xaf, - 0xf7, 0xa1, 0x35, 0xae, 0x36, 0x66, 0x09, 0x3a, 0x7f, 0x32, 0xe0, 0xd5, 0xb9, 0xf1, 0xfe, 0x5f, - 0x7c, 0xd0, 0x85, 0x22, 0x28, 0x32, 0x59, 0x26, 0xaf, 0xdf, 0x3f, 0x70, 0x92, 0xf9, 0x10, 0x96, - 0xf2, 0xd2, 0x32, 0x5c, 0x7d, 0xd0, 0x7d, 0xa5, 0x7a, 0x50, 0x33, 0x9e, 0x5b, 0xe5, 0x77, 0xce, - 0xe1, 0x95, 0x8a, 0xfe, 0x95, 0x9a, 0xb8, 0x43, 0xf3, 0x3d, 0xf2, 0x72, 0x59, 0x19, 0x6f, 0x69, - 0x82, 0xc5, 0x3c, 0x4d, 0x54, 0xb7, 0xe0, 0xab, 0xa4, 0xb8, 0x59, 0x4d, 0x71, 0xe7, 0xb7, 0x26, - 0xac, 0x4c, 0x5d, 0xc5, 0x96, 0xc1, 0x0c, 0x86, 0xd2, 0x91, 0x66, 0x30, 0x5c, 0x98, 0xae, 0xba, - 0x73, 0xad, 0x29, 0xe7, 0x62, 0x81, 0x4a, 0xfd, 0x3d, 0x2f, 0xf7, 0x64, 0xff, 0x57, 0x60, 0xc5, - 0xed, 0x8d, 0x29, 0xb7, 0xf7, 0xa1, 0x35, 0xcc, 0x72, 0x3a, 0x25, 0xb2, 0x52, 0x81, 0x58, 0xda, - 0x29, 0xce, 0xe9, 0xd3, 0x92, 0x98, 0xa8, 0x4a, 0x04, 0xdb, 0x2e, 0x96, 0xba, 0xf6, 0xb5, 0x36, - 0x91, 0x5c, 0xc5, 0x3c, 0xd5, 0x91, 0x45, 0x09, 0xe7, 0x29, 0x2d, 0xa2, 0xa0, 0x1a, 0x51, 0xcf, - 0xa6, 0x0a, 0xa8, 0x74, 0xc8, 0x4b, 0xc7, 0xd3, 0x5b, 0x6a, 0xcc, 0x16, 0xa1, 0x74, 0xa3, 0x1a, - 0x11, 0x95, 0x49, 0xfb, 0x97, 0x06, 0xdc, 0x51, 0xcd, 0x78, 0x7e, 0x20, 0xdc, 0xd5, 0x9a, 0xe3, - 0xac, 0x24, 0xd9, 0x24, 0x69, 0x3e, 0xff, 0x38, 0x0c, 0xc5, 0x62, 0x65, 0xaa, 0xf9, 0x5c, 0x61, - 0x2a, 0x91, 0x61, 0x4d, 0x15, 0xff, 0x35, 0xd2, 0xf6, 0xa1, 0xf8, 0x01, 0xa0, 0xee, 0x0a, 0xc0, - 0xf9, 0x14, 0x06, 0x8b, 0xf4, 0x7a, 0x59, 0x7b, 0x38, 0x57, 0x70, 0x47, 0xb4, 0xb5, 0x52, 0x94, - 0xfa, 0xb9, 0xe7, 0xc5, 0xbd, 0xa9, 0xd2, 0xeb, 0xcd, 0xe9, 0x5e, 0x5f, 0x7c, 0x8a, 0xa4, 0xcf, - 0xdb, 0x96, 0xfe, 0x29, 0x12, 0x31, 0x5b, 0xe7, 0xd0, 0x14, 0xc3, 0x1c, 0x5b, 0x82, 0xce, 0xc3, - 0x88, 0xd2, 0xf7, 0x30, 0xb1, 0x6b, 0xac, 0x0d, 0xf5, 0xa3, 0x3c, 0x4e, 0x6c, 0x83, 0x75, 0xa0, - 0xf1, 0x18, 0xa7, 0x79, 0xdb, 0x64, 0x00, 0x4d, 0xac, 0xf6, 0x63, 0x6e, 0x5b, 0x88, 0x3e, 0xca, - 0xbd, 0x34, 0xb7, 0xeb, 0x88, 0x16, 0xfa, 0xdb, 0x0d, 0xb6, 0x0c, 0xf0, 0xf1, 0x24, 0x8f, 0x25, - 0x5b, 0x13, 0x69, 0x7b, 0x3c, 0xe4, 0x39, 0xb7, 0x5b, 0x5b, 0x3f, 0xa1, 0x23, 0x23, 0x1c, 0x1f, - 0x7a, 0xf2, 0x2e, 0x82, 0xed, 0x1a, 0x6b, 0x81, 0xf5, 0x19, 0xbf, 0xb4, 0x0d, 0xd6, 0x85, 0x96, - 0x3b, 0x89, 0xa2, 0x20, 0x1a, 0x89, 0xfb, 0xe8, 0xea, 0xa1, 0x6d, 0x21, 0x01, 0x15, 0x4a, 0xf8, - 0xd0, 0xae, 0xb3, 0x1e, 0xb4, 0x3f, 0x91, 0x3f, 0x13, 0xd8, 0x0d, 0x24, 0x21, 0x1b, 0x9e, 0x69, - 0x22, 0x89, 0x2e, 0x47, 0xa8, 0x85, 0x10, 0x9d, 0x42, 0xa8, 0xbd, 0x75, 0x08, 0x6d, 0xb5, 0xb9, - 0xb2, 0x15, 0xe8, 0x4a, 0x1d, 0x10, 0x65, 0xd7, 0xf0, 0x85, 0x68, 0xd8, 0xb0, 0x0d, 0x7c, 0x79, - 0xdc, 0x41, 0x6d, 0x13, 0x9f, 0x70, 0xd1, 0xb4, 0x2d, 0x32, 0xc8, 0x55, 0xe4, 0xdb, 0x75, 0x64, - 0xa4, 0x85, 0xc5, 0x1e, 0x6e, 0x3d, 0x82, 0x16, 0x3d, 0x1e, 0xe2, 0x1c, 0xb6, 0x2c, 0xe5, 0x49, - 0x8c, 0x5d, 0x43, 0x9b, 0xe2, 0xed, 0x82, 0xdb, 0x40, 0xdb, 0xd0, 0xeb, 0x08, 0xd8, 0x44, 0x15, - 0x84, 0x9d, 0x04, 0xc2, 0xda, 0xfa, 0xa9, 0x01, 0x6d, 0xb5, 0x6a, 0xb0, 0x1b, 0xb0, 0xa2, 0x8c, - 0x24, 0x51, 0x42, 0xe2, 0x3e, 0xcf, 0x05, 0xc2, 0x36, 0xe8, 0x82, 0x02, 0x34, 0xd1, 0xae, 0x2e, - 0x1f, 0xc7, 0x17, 0x5c, 0x62, 0x2c, 0xbc, 0x12, 0x37, 0x5b, 0x09, 0xd7, 0xf1, 0x00, 0xc2, 0x54, - 0x65, 0xec, 0x06, 0xbb, 0x05, 0x0c, 0xc1, 0x47, 0xc1, 0x08, 0x23, 0x59, 0xcc, 0xff, 0x99, 0xdd, - 0xdc, 0xfa, 0x08, 0xda, 0x6a, 0xcc, 0xd6, 0xf4, 0x50, 0xa8, 0x42, 0x0f, 0x81, 0xb0, 0x8d, 0xf2, - 0x62, 0x89, 0x31, 0xb7, 0x9e, 0xd2, 0x7a, 0x8a, 0x53, 0xaa, 0x66, 0x19, 0x89, 0x91, 0xe1, 0x75, - 0x1e, 0x24, 0xd2, 0xe1, 0x3c, 0x09, 0x3d, 0xbf, 0x08, 0xb0, 0x0b, 0x9e, 0xe6, 0xb6, 0x85, 0xcf, - 0x0f, 0xa3, 0x1f, 0x71, 0x1f, 0x23, 0x0c, 0xdd, 0x10, 0x64, 0xb9, 0xdd, 0xd8, 0x3a, 0x80, 0xee, - 0x53, 0xd5, 0x63, 0x0e, 0x13, 0x7c, 0x01, 0xa5, 0x5c, 0x89, 0xb5, 0x6b, 0x78, 0x27, 0x45, 0x67, - 0x81, 0xb5, 0x0d, 0xb6, 0x0a, 0x4b, 0xe8, 0x8d, 0x12, 0x65, 0x6e, 0x3d, 0x01, 0x36, 0x5b, 0x1d, - 0xd1, 0x68, 0xa5, 0xc2, 0x76, 0x0d, 0x35, 0xf9, 0x8c, 0x5f, 0xe2, 0x33, 0xf9, 0xf0, 0xe1, 0x28, - 0x8a, 0x53, 0x4e, 0x34, 0xe5, 0x43, 0xfa, 0xbe, 0x88, 0x08, 0x6b, 0xeb, 0xe9, 0x54, 0x1f, 0x39, - 0x4c, 0xb4, 0x70, 0x27, 0xd8, 0xae, 0x51, 0xf0, 0x91, 0x14, 0x81, 0x90, 0x06, 0x24, 0x31, 0x02, - 0x63, 0xe2, 0x45, 0xbb, 0x21, 0xf7, 0x52, 0x01, 0x5b, 0x3b, 0xff, 0x6a, 0x42, 0x53, 0x54, 0x05, - 0xf6, 0x11, 0x74, 0xb5, 0x5f, 0x68, 0x19, 0x15, 0xf9, 0xd9, 0xdf, 0x93, 0xd7, 0xff, 0x6f, 0x06, - 0x2f, 0x2a, 0x93, 0x53, 0x63, 0x1f, 0x02, 0x94, 0x8b, 0x37, 0xbb, 0x49, 0xd3, 0xdc, 0xf4, 0x22, - 0xbe, 0xde, 0xa7, 0x4f, 0x36, 0x73, 0x7e, 0x7d, 0x76, 0x6a, 0xec, 0x7b, 0xb0, 0x24, 0xcb, 0x9f, - 0x08, 0x2d, 0x36, 0xd0, 0xd6, 0xa6, 0x39, 0x2b, 0xf5, 0xb5, 0xc2, 0x3e, 0x29, 0x84, 0x89, 0xf0, - 0x61, 0xfd, 0x39, 0x3b, 0x98, 0x10, 0xf3, 0xca, 0xc2, 0xed, 0xcc, 0xa9, 0xb1, 0x7d, 0xe8, 0x8a, - 0x1d, 0x4a, 0x14, 0xf5, 0xdb, 0xc8, 0xbb, 0x68, 0xa9, 0xba, 0x56, 0xa1, 0x5d, 0xe8, 0xe9, 0x6b, - 0x0f, 0x23, 0x4b, 0xce, 0xd9, 0x8f, 0x84, 0x90, 0x79, 0x1b, 0x92, 0x53, 0x63, 0x1e, 0xdc, 0x9a, - 0xbf, 0xbc, 0xb0, 0xd7, 0xcb, 0x6f, 0xcb, 0x0b, 0xb6, 0xa5, 0x75, 0xe7, 0x3a, 0x96, 0xe2, 0x8a, - 0x1f, 0x40, 0xbf, 0xb8, 0xbc, 0x08, 0x6b, 0x19, 0x15, 0x03, 0xa9, 0xda, 0x82, 0x7d, 0x67, 0xfd, - 0xb5, 0x85, 0xf4, 0x42, 0xfc, 0x31, 0xac, 0x96, 0x0c, 0xb1, 0x30, 0x1f, 0xbb, 0x33, 0x73, 0xae, - 0x62, 0xd6, 0xc1, 0x22, 0x72, 0x21, 0xf5, 0x87, 0xe5, 0xc6, 0x5e, 0x95, 0xfc, 0xba, 0xee, 0xdb, - 0xf9, 0xd2, 0x9d, 0xeb, 0x58, 0x8a, 0x1b, 0x1e, 0xc3, 0x4a, 0xa5, 0x9f, 0x2a, 0xd9, 0xd7, 0x36, - 0xd9, 0xeb, 0x02, 0xe2, 0x5e, 0xff, 0x8b, 0xaf, 0x06, 0xc6, 0x97, 0x5f, 0x0d, 0x8c, 0x7f, 0x7c, - 0x35, 0x30, 0x7e, 0xfe, 0x7c, 0x50, 0xfb, 0xf2, 0xf9, 0xa0, 0xf6, 0xb7, 0xe7, 0x83, 0xda, 0x49, - 0x93, 0xfe, 0xd5, 0xf1, 0xcd, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x31, 0xe0, 0x21, 0xb2, 0xe7, - 0x21, 0x00, 0x00, + // 2971 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x6f, 0xdc, 0xd6, + 0xb5, 0x43, 0x72, 0x3e, 0xcf, 0x8c, 0x24, 0xea, 0x4a, 0xf6, 0x9b, 0x28, 0xf6, 0x44, 0xa1, 0x83, + 0x3c, 0x45, 0xc8, 0x13, 0x12, 0xbd, 0x3c, 0xe4, 0x21, 0x40, 0x9b, 0xc4, 0x92, 0x23, 0x3b, 0x95, + 0x23, 0x9b, 0x52, 0xdc, 0x55, 0x81, 0x52, 0x9c, 0xab, 0x11, 0x2b, 0x0e, 0x49, 0x93, 0x1c, 0x09, + 0x5a, 0x14, 0xdd, 0x75, 0xdb, 0x6e, 0x5a, 0xa0, 0x45, 0x37, 0x2d, 0xd0, 0x6d, 0x17, 0xfd, 0x01, + 0xdd, 0xb5, 0xcd, 0x32, 0xe8, 0xaa, 0xab, 0xa2, 0x48, 0xfe, 0x45, 0x17, 0x45, 0x71, 0xce, 0xbd, + 0x97, 0xbc, 0x9c, 0x0f, 0x39, 0x2e, 0xd0, 0x1d, 0xcf, 0xc7, 0x3d, 0xf7, 0xf0, 0x7c, 0x1f, 0xce, + 0xc0, 0xf2, 0x70, 0x7c, 0x15, 0xa7, 0x17, 0x3c, 0xdd, 0x49, 0xd2, 0x38, 0x8f, 0x99, 0x99, 0x9c, + 0x3a, 0x5b, 0xc0, 0x9e, 0x4e, 0x78, 0x7a, 0x7d, 0x9c, 0x7b, 0xf9, 0x24, 0x73, 0xf9, 0xf3, 0x09, + 0xcf, 0x72, 0xc6, 0xa0, 0x1e, 0x79, 0x63, 0xde, 0x37, 0x36, 0x8d, 0xad, 0x8e, 0x4b, 0xcf, 0x4e, + 0x02, 0xeb, 0x7b, 0xf1, 0x78, 0x1c, 0x47, 0xdf, 0x25, 0x19, 0x2e, 0xcf, 0x92, 0x38, 0xca, 0x38, + 0xbb, 0x0d, 0xcd, 0x94, 0x67, 0x93, 0x30, 0x27, 0xee, 0xb6, 0x2b, 0x21, 0x66, 0x83, 0x35, 0xce, + 0x46, 0x7d, 0x93, 0x44, 0xe0, 0x23, 0x72, 0x66, 0xf1, 0x24, 0xf5, 0x79, 0xdf, 0x22, 0xa4, 0x84, + 0x10, 0x2f, 0xf4, 0xea, 0xd7, 0x05, 0x5e, 0x40, 0xce, 0xef, 0x0c, 0x58, 0xab, 0x28, 0xf7, 0xd2, + 0x37, 0xbe, 0x07, 0x3d, 0x71, 0x87, 0x90, 0x40, 0xf7, 0x76, 0x77, 0xed, 0x9d, 0xe4, 0x74, 0xe7, + 0x58, 0xc3, 0xbb, 0x15, 0x2e, 0xf6, 0x3e, 0x2c, 0x65, 0x93, 0xd3, 0x13, 0x2f, 0xbb, 0x90, 0xc7, + 0xea, 0x9b, 0xd6, 0x56, 0x77, 0x77, 0x95, 0x8e, 0xe9, 0x04, 0xb7, 0xca, 0xe7, 0xfc, 0xd6, 0x80, + 0xee, 0xde, 0x39, 0xf7, 0x25, 0x8c, 0x8a, 0x26, 0x5e, 0x96, 0xf1, 0xa1, 0x52, 0x54, 0x40, 0x6c, + 0x1d, 0x1a, 0x79, 0x9c, 0x7b, 0x21, 0xa9, 0xda, 0x70, 0x05, 0xc0, 0x06, 0x00, 0xd9, 0xc4, 0xf7, + 0x79, 0x96, 0x9d, 0x4d, 0x42, 0x52, 0xb5, 0xe1, 0x6a, 0x18, 0x94, 0x76, 0xe6, 0x05, 0x21, 0x1f, + 0x92, 0x99, 0x1a, 0xae, 0x84, 0x58, 0x1f, 0x5a, 0x57, 0x5e, 0x1a, 0x05, 0xd1, 0xa8, 0xdf, 0x20, + 0x82, 0x02, 0xf1, 0xc4, 0x90, 0xe7, 0x5e, 0x10, 0xf6, 0x9b, 0x9b, 0xc6, 0x56, 0xcf, 0x95, 0x90, + 0xf3, 0x4f, 0x03, 0x60, 0x7f, 0x32, 0x4e, 0xa4, 0x9a, 0x9b, 0xd0, 0x25, 0x0d, 0x4e, 0xbc, 0xd3, + 0x90, 0x67, 0xa4, 0xab, 0xe5, 0xea, 0x28, 0xb6, 0x05, 0x2b, 0x7e, 0x3c, 0x4e, 0x42, 0x9e, 0xf3, + 0xa1, 0xe4, 0x42, 0xd5, 0x0d, 0x77, 0x1a, 0xcd, 0xde, 0x80, 0xa5, 0xb3, 0x20, 0x0a, 0xb2, 0x73, + 0x3e, 0xbc, 0x7f, 0x9d, 0x73, 0x61, 0x72, 0xc3, 0xad, 0x22, 0x99, 0x03, 0x3d, 0x85, 0x70, 0xe3, + 0xab, 0x8c, 0x5e, 0xc8, 0x70, 0x2b, 0x38, 0xf6, 0x36, 0xac, 0xf2, 0x2c, 0x0f, 0xc6, 0x5e, 0xce, + 0x4f, 0x50, 0x15, 0x62, 0x6c, 0x10, 0xe3, 0x2c, 0x01, 0x7d, 0x7f, 0x9a, 0x64, 0xf4, 0x9e, 0x96, + 0x8b, 0x8f, 0x6c, 0x03, 0xda, 0x49, 0x1a, 0x8f, 0x52, 0x9e, 0x65, 0xfd, 0x16, 0x85, 0x44, 0x01, + 0x3b, 0x5f, 0x18, 0x00, 0x87, 0xb1, 0x37, 0x94, 0x06, 0x98, 0x51, 0x5a, 0x98, 0x60, 0x4a, 0xe9, + 0x01, 0x00, 0xd9, 0x44, 0xb0, 0x98, 0xc4, 0xa2, 0x61, 0x2a, 0x17, 0x5a, 0xd5, 0x0b, 0xf1, 0xec, + 0x98, 0xe7, 0xde, 0xfd, 0x20, 0x0a, 0xe3, 0x91, 0x0c, 0x73, 0x0d, 0xc3, 0xde, 0x84, 0xe5, 0x12, + 0x3a, 0x38, 0x79, 0xb4, 0x4f, 0x6f, 0xda, 0x71, 0xa7, 0xb0, 0xb3, 0xaf, 0xe9, 0xfc, 0xcc, 0x80, + 0xa5, 0xe3, 0x73, 0x2f, 0x1d, 0x06, 0xd1, 0xe8, 0x20, 0x8d, 0x27, 0x09, 0x7a, 0x3d, 0xf7, 0xd2, + 0x11, 0xcf, 0x65, 0xfa, 0x4a, 0x08, 0x93, 0x7a, 0x7f, 0xff, 0x10, 0x35, 0xb7, 0x30, 0xa9, 0xf1, + 0x59, 0xbc, 0x79, 0x9a, 0xe5, 0x87, 0xb1, 0xef, 0xe5, 0x41, 0x1c, 0x49, 0xc5, 0xab, 0x48, 0x4a, + 0xdc, 0xeb, 0xc8, 0xa7, 0xc8, 0xb3, 0x28, 0x71, 0x09, 0xc2, 0x37, 0x9e, 0x44, 0x92, 0xd2, 0x20, + 0x4a, 0x01, 0x3b, 0x7f, 0x6c, 0x00, 0x1c, 0x5f, 0x47, 0xfe, 0x54, 0x8c, 0x3d, 0xb8, 0xe4, 0x51, + 0x5e, 0x8d, 0x31, 0x81, 0x42, 0x61, 0x22, 0xe4, 0x12, 0x65, 0xdc, 0x02, 0x66, 0x77, 0xa0, 0x93, + 0x72, 0x9f, 0x47, 0x39, 0x12, 0x2d, 0x22, 0x96, 0x08, 0x8c, 0xa6, 0xb1, 0x97, 0xe5, 0x3c, 0xad, + 0x98, 0xb7, 0x82, 0x63, 0xdb, 0x60, 0xeb, 0xf0, 0x41, 0x1e, 0x0c, 0xa5, 0x89, 0x67, 0xf0, 0x28, + 0x8f, 0x5e, 0x42, 0xc9, 0x6b, 0x0a, 0x79, 0x3a, 0x0e, 0xe5, 0xe9, 0x30, 0xc9, 0x13, 0x51, 0x36, + 0x83, 0x47, 0x79, 0xa7, 0x61, 0xec, 0x5f, 0x04, 0xd1, 0x88, 0x1c, 0xd0, 0x26, 0x53, 0x55, 0x70, + 0xec, 0x5b, 0x60, 0x4f, 0xa2, 0x94, 0x67, 0x71, 0x78, 0xc9, 0x87, 0xe4, 0xc7, 0xac, 0xdf, 0xd1, + 0xca, 0x8e, 0xee, 0x61, 0x77, 0x86, 0x55, 0xf3, 0x10, 0x88, 0x4a, 0x23, 0x3d, 0x34, 0x00, 0x38, + 0x25, 0x45, 0x4e, 0xae, 0x13, 0xde, 0xef, 0x8a, 0xb8, 0x2b, 0x31, 0xec, 0x1d, 0x58, 0xcb, 0xb8, + 0x1f, 0x47, 0xc3, 0xec, 0x3e, 0x3f, 0x0f, 0xa2, 0xe1, 0x63, 0xb2, 0x45, 0xbf, 0x47, 0x26, 0x9e, + 0x47, 0xc2, 0x88, 0x21, 0xc5, 0xf7, 0xf7, 0x0f, 0x8f, 0xae, 0x22, 0x9e, 0xf6, 0x97, 0x44, 0xc4, + 0x54, 0x90, 0xe8, 0x6e, 0x3f, 0x8e, 0xce, 0xc2, 0xc0, 0xcf, 0x1f, 0x67, 0xa3, 0xfe, 0x32, 0xf1, + 0xe8, 0x28, 0x74, 0x69, 0x5e, 0xa4, 0xf5, 0x8a, 0x70, 0x69, 0x81, 0x28, 0x82, 0xc1, 0x4d, 0xb2, + 0xbe, 0xad, 0x05, 0x83, 0xab, 0x07, 0x03, 0x12, 0x57, 0xf5, 0x60, 0x70, 0x45, 0x30, 0x04, 0x47, + 0x27, 0x65, 0x9e, 0xb2, 0x4d, 0x63, 0xab, 0xee, 0x56, 0x70, 0xe8, 0xbc, 0xe1, 0x64, 0x9c, 0x3c, + 0xd2, 0xf9, 0xd6, 0x88, 0x6f, 0x06, 0xef, 0xfc, 0xca, 0x80, 0x9e, 0xde, 0x2b, 0xb4, 0x2e, 0x66, + 0x2c, 0xe8, 0x62, 0xa6, 0xde, 0xc5, 0xd8, 0x5b, 0x45, 0xb7, 0x12, 0xdd, 0x87, 0xfc, 0xf9, 0x24, + 0x8d, 0xb1, 0xac, 0xbb, 0x44, 0x28, 0x1a, 0xd8, 0xbb, 0xd0, 0x4d, 0x79, 0xe8, 0x5d, 0x17, 0x6d, + 0x07, 0xf9, 0x57, 0x90, 0xdf, 0x2d, 0xd1, 0xae, 0xce, 0xe3, 0xfc, 0xd9, 0x84, 0xae, 0x46, 0x9c, + 0xc9, 0x05, 0xe3, 0x1b, 0xe6, 0x82, 0xb9, 0x20, 0x17, 0x36, 0x95, 0x4a, 0x93, 0xd3, 0xfd, 0x20, + 0x95, 0xe5, 0x41, 0x47, 0x15, 0x1c, 0x95, 0xe4, 0xd3, 0x51, 0xd8, 0x3d, 0x34, 0x50, 0x4b, 0xbd, + 0x69, 0x34, 0xdb, 0x01, 0x46, 0xa8, 0x3d, 0x2f, 0xf7, 0xcf, 0x3f, 0x4f, 0x64, 0x34, 0x36, 0x29, + 0xa4, 0xe7, 0x50, 0xd8, 0x6b, 0xd0, 0xc8, 0x72, 0x6f, 0xc4, 0x29, 0xf5, 0x96, 0x77, 0x3b, 0x94, + 0x2a, 0x88, 0x70, 0x05, 0x5e, 0x33, 0x7e, 0xfb, 0x05, 0xc6, 0x77, 0x7e, 0x6f, 0xc1, 0x52, 0xa5, + 0xbb, 0xcf, 0x9b, 0x82, 0xca, 0x1b, 0xcd, 0x05, 0x37, 0x6e, 0x42, 0x7d, 0x12, 0x05, 0xc2, 0xd9, + 0xcb, 0xbb, 0x3d, 0xa4, 0x7f, 0x1e, 0x05, 0x39, 0x66, 0x9b, 0x4b, 0x14, 0x4d, 0xa7, 0xfa, 0x8b, + 0x02, 0xe2, 0x1d, 0x58, 0x2b, 0x53, 0x7d, 0x7f, 0xff, 0xf0, 0x30, 0xf6, 0x2f, 0x8a, 0xde, 0x30, + 0x8f, 0xc4, 0x98, 0x98, 0x81, 0xa8, 0x64, 0x3d, 0xac, 0x89, 0x29, 0xe8, 0xbf, 0xa1, 0xe1, 0xe3, + 0x54, 0x42, 0x56, 0x92, 0x01, 0xa5, 0x8d, 0x29, 0x0f, 0x6b, 0xae, 0xa0, 0xb3, 0x37, 0xa0, 0x8e, + 0xf1, 0x2f, 0x6d, 0xb5, 0x8c, 0x7c, 0xe5, 0x98, 0xf0, 0xb0, 0xe6, 0x12, 0x15, 0xb9, 0xc2, 0xd8, + 0x1b, 0xf6, 0x3b, 0x25, 0x57, 0xd9, 0x4b, 0x91, 0x0b, 0xa9, 0xc8, 0x85, 0x35, 0x88, 0xea, 0x91, + 0xe4, 0x2a, 0xdb, 0x01, 0x72, 0x21, 0x95, 0xbd, 0x07, 0x70, 0xe9, 0x85, 0xc1, 0x50, 0x34, 0x9f, + 0x2e, 0xf1, 0xae, 0x23, 0xef, 0xb3, 0x02, 0x2b, 0xa3, 0x5e, 0xe3, 0xbb, 0xdf, 0x86, 0x66, 0x26, + 0xc2, 0xff, 0xdb, 0xb0, 0x5a, 0xf1, 0xd9, 0x61, 0x90, 0x91, 0x81, 0x05, 0xb9, 0x6f, 0x2c, 0x1a, + 0xdc, 0xd4, 0xf9, 0x01, 0x00, 0x59, 0xe2, 0x41, 0x9a, 0xc6, 0xa9, 0x1a, 0x20, 0x8d, 0x62, 0x80, + 0x74, 0xee, 0x42, 0x07, 0x2d, 0x70, 0x03, 0x19, 0x5f, 0x7d, 0x11, 0x39, 0x81, 0x1e, 0xbd, 0xf3, + 0xd3, 0xc3, 0x05, 0x1c, 0x6c, 0x17, 0xd6, 0xc5, 0x14, 0x27, 0x92, 0xe0, 0x49, 0x9c, 0x05, 0x64, + 0x09, 0x91, 0x8e, 0x73, 0x69, 0x58, 0x1b, 0x39, 0x8a, 0x3b, 0x7e, 0x7a, 0xa8, 0xe6, 0x0c, 0x05, + 0x3b, 0xff, 0x07, 0x1d, 0xbc, 0x51, 0x5c, 0xb7, 0x05, 0x4d, 0x22, 0x28, 0x3b, 0xd8, 0x85, 0x13, + 0xa4, 0x42, 0xae, 0xa4, 0x3b, 0x3f, 0x31, 0xa0, 0x2b, 0x8a, 0x9c, 0x38, 0xf9, 0xb2, 0x35, 0x6e, + 0xb3, 0x72, 0x5c, 0x55, 0x09, 0x5d, 0xe2, 0x0e, 0x00, 0x95, 0x29, 0xc1, 0x50, 0x2f, 0x83, 0xa2, + 0xc4, 0xba, 0x1a, 0x07, 0x3a, 0xa6, 0x84, 0xe6, 0x98, 0xf6, 0x17, 0x26, 0xf4, 0xa4, 0x4b, 0x05, + 0xcb, 0x7f, 0x28, 0x59, 0x65, 0x3e, 0xd5, 0xf5, 0x7c, 0x7a, 0x53, 0xe5, 0x53, 0xa3, 0x7c, 0x8d, + 0x32, 0x8a, 0xca, 0x74, 0xba, 0x27, 0xd3, 0xa9, 0x49, 0x6c, 0x4b, 0x2a, 0x9d, 0x14, 0x97, 0xc8, + 0xa6, 0x7b, 0x32, 0x9b, 0x5a, 0x25, 0x53, 0x11, 0x52, 0x45, 0x32, 0xdd, 0x93, 0xc9, 0xd4, 0x2e, + 0x99, 0x0a, 0x37, 0xab, 0x5c, 0xba, 0xdf, 0x82, 0x06, 0xb9, 0xd3, 0xf9, 0x00, 0x6c, 0xdd, 0x34, + 0x94, 0x13, 0x6f, 0x4a, 0x62, 0x25, 0x14, 0x34, 0x26, 0x57, 0x9e, 0x7d, 0x0e, 0x4b, 0x95, 0x52, + 0x84, 0x13, 0x44, 0x90, 0xed, 0x79, 0x91, 0xcf, 0xc3, 0x62, 0x8f, 0xd1, 0x30, 0x5a, 0x90, 0x99, + 0xa5, 0x64, 0x29, 0xa2, 0x12, 0x64, 0xda, 0x36, 0x62, 0x55, 0xb6, 0x91, 0xbf, 0x18, 0xd0, 0xd3, + 0x0f, 0xe0, 0x42, 0xf3, 0x20, 0x4d, 0xf7, 0xe2, 0xa1, 0xf0, 0x66, 0xc3, 0x55, 0x20, 0x86, 0x3e, + 0x3e, 0x86, 0x5e, 0x96, 0xc9, 0x08, 0x2c, 0x60, 0x49, 0x3b, 0xf6, 0xe3, 0x44, 0xed, 0x97, 0x05, + 0x2c, 0x69, 0x87, 0xfc, 0x92, 0x87, 0xb2, 0x41, 0x15, 0x30, 0xde, 0xf6, 0x98, 0x67, 0x19, 0x86, + 0x89, 0xa8, 0xab, 0x0a, 0xc4, 0x53, 0xae, 0x77, 0xb5, 0xe7, 0x4d, 0x32, 0x2e, 0x67, 0xc0, 0x02, + 0x46, 0xb3, 0xe0, 0x1e, 0xec, 0xa5, 0xf1, 0x24, 0x52, 0x93, 0x9f, 0x86, 0x71, 0xae, 0x60, 0xf5, + 0xc9, 0x24, 0x1d, 0x71, 0x0a, 0x62, 0xb5, 0x56, 0x6f, 0x40, 0x3b, 0x88, 0x3c, 0x3f, 0x0f, 0x2e, + 0xb9, 0xb4, 0x64, 0x01, 0x63, 0xfc, 0xe6, 0xc1, 0x98, 0xcb, 0xd1, 0x97, 0x9e, 0x91, 0xff, 0x2c, + 0x08, 0x39, 0xc5, 0xb5, 0x7c, 0x25, 0x05, 0x53, 0x8a, 0x8a, 0x9e, 0x2c, 0x97, 0x66, 0x01, 0x39, + 0xbf, 0x34, 0x61, 0xe3, 0x28, 0xe1, 0xa9, 0x97, 0x73, 0xb1, 0xa8, 0x1f, 0xfb, 0xe7, 0x7c, 0xec, + 0x29, 0x15, 0xee, 0x80, 0x19, 0x27, 0x74, 0xb9, 0x8c, 0x77, 0x41, 0x3e, 0x4a, 0x5c, 0x33, 0x4e, + 0x48, 0x09, 0x2f, 0xbb, 0x90, 0xb6, 0xa5, 0xe7, 0x85, 0x5b, 0xfb, 0x06, 0xb4, 0x87, 0x5e, 0xee, + 0x9d, 0x7a, 0x19, 0x57, 0x36, 0x55, 0x30, 0x2d, 0xb8, 0xb8, 0x0f, 0x4a, 0x8b, 0x0a, 0x80, 0x24, + 0xd1, 0x6d, 0xd2, 0x9a, 0x12, 0x42, 0xee, 0xb3, 0x70, 0x92, 0x9d, 0x93, 0x19, 0xdb, 0xae, 0x00, + 0x50, 0x97, 0x22, 0xe6, 0xdb, 0xb2, 0x5d, 0x0c, 0x00, 0xce, 0xd2, 0x78, 0x2c, 0x0a, 0x0b, 0x35, + 0xa0, 0xb6, 0xab, 0x61, 0x14, 0xfd, 0x44, 0xac, 0x3f, 0x50, 0xd2, 0x05, 0xc6, 0xc9, 0x61, 0xe9, + 0xd9, 0xbb, 0x32, 0xec, 0x1f, 0xf3, 0xdc, 0x63, 0x1b, 0x9a, 0x39, 0x00, 0xcd, 0x81, 0x14, 0x69, + 0x8c, 0x17, 0x56, 0x0f, 0x55, 0x72, 0x2c, 0xad, 0xe4, 0x28, 0x0b, 0xd6, 0x29, 0xc4, 0xe9, 0xd9, + 0x79, 0x0f, 0xd6, 0xa5, 0x47, 0x9e, 0xbd, 0x8b, 0xb7, 0x2e, 0xf4, 0x85, 0x20, 0x8b, 0xeb, 0x9d, + 0x3f, 0x19, 0x70, 0x6b, 0xea, 0xd8, 0x4b, 0x7f, 0xff, 0x78, 0x1f, 0xea, 0xb8, 0x40, 0xf6, 0x2d, + 0x4a, 0xcd, 0x7b, 0x78, 0xc7, 0x5c, 0x91, 0x3b, 0x08, 0x3c, 0x88, 0xf2, 0xf4, 0xda, 0xa5, 0x03, + 0x1b, 0x9f, 0x42, 0xa7, 0x40, 0xa1, 0xdc, 0x0b, 0x7e, 0xad, 0xaa, 0xef, 0x05, 0xbf, 0xc6, 0x89, + 0xe2, 0xd2, 0x0b, 0x27, 0xc2, 0x34, 0xb2, 0xc1, 0x56, 0x0c, 0xeb, 0x0a, 0xfa, 0x07, 0xe6, 0xff, + 0x1b, 0xce, 0x0f, 0xa1, 0xff, 0xd0, 0x8b, 0x86, 0xa1, 0x8c, 0x47, 0x51, 0x14, 0xa4, 0x09, 0x5e, + 0xd5, 0x4c, 0xd0, 0x45, 0x29, 0x44, 0xbd, 0x21, 0x1a, 0xef, 0x40, 0xe7, 0x54, 0xb5, 0x43, 0x69, + 0xf8, 0x12, 0x41, 0x31, 0xf3, 0x3c, 0xcc, 0xe4, 0x9a, 0x4a, 0xcf, 0xce, 0x2d, 0x58, 0x3b, 0xe0, + 0xb9, 0xb8, 0x7b, 0xef, 0x6c, 0x24, 0x6f, 0x76, 0xb6, 0x60, 0xbd, 0x8a, 0x96, 0xc6, 0xb5, 0xc1, + 0xf2, 0xcf, 0x8a, 0x56, 0xe3, 0x9f, 0x8d, 0x9c, 0x63, 0xb8, 0x2b, 0xa6, 0xa5, 0xc9, 0x29, 0xaa, + 0x80, 0xa5, 0xef, 0xf3, 0x64, 0xe8, 0xe5, 0x5c, 0xbd, 0xc4, 0x2e, 0xac, 0x67, 0x82, 0xb6, 0x77, + 0x36, 0x3a, 0x89, 0xc7, 0xe1, 0x71, 0x9e, 0x06, 0x91, 0x92, 0x31, 0x97, 0xe6, 0x1c, 0xc2, 0x60, + 0x91, 0x50, 0xa9, 0x48, 0x1f, 0x5a, 0xf2, 0xe3, 0x8f, 0x74, 0xb3, 0x02, 0x67, 0xfd, 0xec, 0x8c, + 0x60, 0xe3, 0x80, 0xe7, 0x33, 0x33, 0x53, 0x59, 0x76, 0xf0, 0x8e, 0xcf, 0xca, 0xf6, 0x58, 0xc0, + 0xec, 0x7f, 0xa0, 0x77, 0x16, 0x84, 0x39, 0x4f, 0xe5, 0xce, 0x31, 0x13, 0xeb, 0x15, 0xb2, 0xf3, + 0x37, 0x0b, 0xec, 0xe9, 0x6b, 0x0a, 0x3f, 0x19, 0x73, 0xab, 0x86, 0x59, 0xa9, 0x1a, 0x0c, 0xea, + 0x63, 0x2c, 0xec, 0x32, 0x67, 0xf0, 0xb9, 0x4c, 0xb4, 0xfa, 0x82, 0x44, 0xdb, 0x82, 0x15, 0x39, + 0xfd, 0xc5, 0x6a, 0xaf, 0x91, 0x0b, 0xc4, 0x14, 0x1a, 0x07, 0xe6, 0x29, 0x14, 0xad, 0x1b, 0xa2, + 0xde, 0xcc, 0x23, 0x69, 0xd3, 0x78, 0xeb, 0x1b, 0x4c, 0xe3, 0x89, 0x20, 0x88, 0x4f, 0x54, 0xd2, + 0x64, 0x6d, 0x21, 0x7c, 0x0e, 0x89, 0xbd, 0x0d, 0xab, 0x09, 0x8f, 0x70, 0x71, 0xd7, 0xf8, 0x3b, + 0xc4, 0x3f, 0x4b, 0xc0, 0xd7, 0xa4, 0x56, 0xa9, 0xf1, 0x82, 0x78, 0xcd, 0x29, 0x34, 0x6e, 0x70, + 0xfe, 0x24, 0x8f, 0x2f, 0xd5, 0xaa, 0x86, 0xc9, 0x20, 0x96, 0xfb, 0x19, 0x3c, 0xea, 0x50, 0xc1, + 0x91, 0x41, 0x7a, 0x42, 0x87, 0x19, 0x82, 0xf3, 0x1b, 0x03, 0x6e, 0x95, 0x0e, 0xa6, 0x8f, 0x7a, + 0x2f, 0xd8, 0x7b, 0x37, 0xa0, 0x9d, 0xa5, 0x3e, 0x71, 0xaa, 0x9e, 0xac, 0x60, 0xea, 0x11, 0x59, + 0x2e, 0x68, 0xb2, 0x81, 0x29, 0xf8, 0xc5, 0x5e, 0xef, 0x43, 0x6b, 0x5c, 0x6d, 0xcc, 0x12, 0x74, + 0xfe, 0x60, 0xc0, 0xab, 0x73, 0xe3, 0xfd, 0xdf, 0xf8, 0x40, 0x0c, 0x45, 0x50, 0x64, 0xb2, 0x4c, + 0xde, 0xbc, 0x7f, 0xe0, 0x24, 0xf3, 0x21, 0x2c, 0xe5, 0xa5, 0x65, 0xb8, 0xfa, 0x40, 0xfc, 0x4a, + 0xf5, 0xa0, 0x66, 0x3c, 0xb7, 0xca, 0xef, 0x5c, 0xc0, 0x2b, 0x15, 0xfd, 0x2b, 0x35, 0x71, 0x97, + 0xe6, 0x7b, 0xe4, 0xe5, 0xb2, 0x32, 0xde, 0xd6, 0x04, 0x8b, 0x79, 0x9a, 0xa8, 0x6e, 0xc1, 0x57, + 0x49, 0x71, 0xb3, 0x9a, 0xe2, 0xce, 0xaf, 0x4d, 0x58, 0x99, 0xba, 0x8a, 0x2d, 0x83, 0x19, 0x0c, + 0xa5, 0x23, 0xcd, 0x60, 0xb8, 0x30, 0x5d, 0x75, 0xe7, 0x5a, 0x53, 0xce, 0xc5, 0x02, 0x95, 0xfa, + 0xfb, 0x5e, 0xee, 0xc9, 0xfe, 0xaf, 0xc0, 0x8a, 0xdb, 0x1b, 0x53, 0x6e, 0xef, 0x43, 0x6b, 0x98, + 0xe5, 0x74, 0x4a, 0x64, 0xa5, 0x02, 0xb1, 0xb4, 0x53, 0x9c, 0xd3, 0xa7, 0x2a, 0x31, 0x51, 0x95, + 0x08, 0xb6, 0x53, 0x2c, 0x75, 0xed, 0x1b, 0x6d, 0x22, 0xb9, 0x8a, 0x79, 0xaa, 0x23, 0x8b, 0x12, + 0xce, 0x53, 0x5a, 0x44, 0x41, 0x35, 0xa2, 0x9e, 0x4f, 0x15, 0x50, 0xe9, 0x90, 0x97, 0x8e, 0xa7, + 0xb7, 0xd4, 0x98, 0x2d, 0x42, 0x69, 0xad, 0x1a, 0x11, 0x95, 0x49, 0xfb, 0xe7, 0x06, 0xdc, 0x55, + 0xcd, 0x78, 0x7e, 0x20, 0xdc, 0xd3, 0x9a, 0xe3, 0xac, 0x24, 0xd9, 0x24, 0x69, 0x3e, 0xff, 0x38, + 0x0c, 0xc5, 0x62, 0x65, 0xaa, 0xf9, 0x5c, 0x61, 0x2a, 0x91, 0x61, 0x4d, 0x15, 0xff, 0x75, 0xd2, + 0xf6, 0x91, 0xf8, 0x41, 0xa1, 0xee, 0x0a, 0xc0, 0xf9, 0x14, 0x06, 0x8b, 0xf4, 0x7a, 0x59, 0x7b, + 0x38, 0xd7, 0x70, 0x57, 0xb4, 0xb5, 0x52, 0x94, 0xfa, 0xf9, 0xe8, 0xc5, 0xbd, 0xa9, 0xd2, 0xeb, + 0xcd, 0xe9, 0x5e, 0x5f, 0x7c, 0xda, 0xa4, 0xcf, 0xe5, 0x96, 0xfe, 0x69, 0x13, 0x31, 0xdb, 0x17, + 0xd0, 0x14, 0xc3, 0x1c, 0x5b, 0x82, 0xce, 0xa3, 0x88, 0xd2, 0xf7, 0x28, 0xb1, 0x6b, 0xac, 0x0d, + 0xf5, 0xe3, 0x3c, 0x4e, 0x6c, 0x83, 0x75, 0xa0, 0xf1, 0x04, 0xa7, 0x79, 0xdb, 0x64, 0x00, 0x4d, + 0xac, 0xf6, 0x63, 0x6e, 0x5b, 0x88, 0x3e, 0xce, 0xbd, 0x34, 0xb7, 0xeb, 0x88, 0x16, 0xfa, 0xdb, + 0x0d, 0xb6, 0x0c, 0xf0, 0xf1, 0x24, 0x8f, 0x25, 0x5b, 0x13, 0x69, 0xfb, 0x3c, 0xe4, 0x39, 0xb7, + 0x5b, 0xdb, 0x3f, 0xa2, 0x23, 0x23, 0x1c, 0x1f, 0x7a, 0xf2, 0x2e, 0x82, 0xed, 0x1a, 0x6b, 0x81, + 0xf5, 0x19, 0xbf, 0xb2, 0x0d, 0xd6, 0x85, 0x96, 0x3b, 0x89, 0xa2, 0x20, 0x1a, 0x89, 0xfb, 0xe8, + 0xea, 0xa1, 0x6d, 0x21, 0x01, 0x15, 0x4a, 0xf8, 0xd0, 0xae, 0xb3, 0x1e, 0xb4, 0x3f, 0x91, 0x3f, + 0x3b, 0xd8, 0x0d, 0x24, 0x21, 0x1b, 0x9e, 0x69, 0x22, 0x89, 0x2e, 0x47, 0xa8, 0x85, 0x10, 0x9d, + 0x42, 0xa8, 0xbd, 0x7d, 0x04, 0x6d, 0xb5, 0xb9, 0xb2, 0x15, 0xe8, 0x4a, 0x1d, 0x10, 0x65, 0xd7, + 0xf0, 0x85, 0x68, 0xd8, 0xb0, 0x0d, 0x7c, 0x79, 0xdc, 0x41, 0x6d, 0x13, 0x9f, 0x70, 0xd1, 0xb4, + 0x2d, 0x32, 0xc8, 0x75, 0xe4, 0xdb, 0x75, 0x64, 0xa4, 0x85, 0xc5, 0x1e, 0x6e, 0x3f, 0x86, 0x16, + 0x3d, 0x1e, 0xe1, 0x1c, 0xb6, 0x2c, 0xe5, 0x49, 0x8c, 0x5d, 0x43, 0x9b, 0xe2, 0xed, 0x82, 0xdb, + 0x40, 0xdb, 0xd0, 0xeb, 0x08, 0xd8, 0x44, 0x15, 0x84, 0x9d, 0x04, 0xc2, 0xda, 0xfe, 0xb1, 0x01, + 0x6d, 0xb5, 0x6a, 0xb0, 0x35, 0x58, 0x51, 0x46, 0x92, 0x28, 0x21, 0xf1, 0x80, 0xe7, 0x02, 0x61, + 0x1b, 0x74, 0x41, 0x01, 0x9a, 0x68, 0x57, 0x97, 0x8f, 0xe3, 0x4b, 0x2e, 0x31, 0x16, 0x5e, 0x89, + 0x9b, 0xad, 0x84, 0xeb, 0x78, 0x00, 0x61, 0xaa, 0x32, 0x76, 0x83, 0xdd, 0x06, 0x86, 0xe0, 0xe3, + 0x60, 0x84, 0x91, 0x2c, 0xe6, 0xff, 0xcc, 0x6e, 0x6e, 0x7f, 0x04, 0x6d, 0x35, 0x66, 0x6b, 0x7a, + 0x28, 0x54, 0xa1, 0x87, 0x40, 0xd8, 0x46, 0x79, 0xb1, 0xc4, 0x98, 0xdb, 0xcf, 0x68, 0x3d, 0xc5, + 0x29, 0x55, 0xb3, 0x8c, 0xc4, 0xc8, 0xf0, 0xba, 0x08, 0x12, 0xe9, 0x70, 0x9e, 0x84, 0x9e, 0x5f, + 0x04, 0xd8, 0x25, 0x4f, 0x73, 0xdb, 0xc2, 0xe7, 0x47, 0xd1, 0x0f, 0xb8, 0x8f, 0x11, 0x86, 0x6e, + 0x08, 0xb2, 0xdc, 0x6e, 0x6c, 0x1f, 0x42, 0xf7, 0x99, 0xea, 0x31, 0x47, 0x09, 0xbe, 0x80, 0x52, + 0xae, 0xc4, 0xda, 0x35, 0xbc, 0x93, 0xa2, 0xb3, 0xc0, 0xda, 0x06, 0x5b, 0x85, 0x25, 0xf4, 0x46, + 0x89, 0x32, 0xb7, 0x9f, 0x02, 0x9b, 0xad, 0x8e, 0x68, 0xb4, 0x52, 0x61, 0xbb, 0x86, 0x9a, 0x7c, + 0xc6, 0xaf, 0xf0, 0x99, 0x7c, 0xf8, 0x68, 0x14, 0xc5, 0x29, 0x27, 0x9a, 0xf2, 0x21, 0x7d, 0x5f, + 0x44, 0x84, 0xb5, 0xfd, 0x6c, 0xaa, 0x8f, 0x1c, 0x25, 0x5a, 0xb8, 0x13, 0x6c, 0xd7, 0x28, 0xf8, + 0x48, 0x8a, 0x40, 0x48, 0x03, 0x92, 0x18, 0x81, 0x31, 0xf1, 0xa2, 0xbd, 0x90, 0x7b, 0xa9, 0x80, + 0xad, 0xdd, 0x7f, 0x34, 0xa1, 0x29, 0xaa, 0x02, 0xfb, 0x08, 0xba, 0xda, 0x2f, 0xbe, 0x8c, 0x8a, + 0xfc, 0xec, 0xef, 0xd3, 0x1b, 0xff, 0x35, 0x83, 0x17, 0x95, 0xc9, 0xa9, 0xb1, 0x0f, 0x01, 0xca, + 0xc5, 0x9b, 0xdd, 0xa2, 0x69, 0x6e, 0x7a, 0x11, 0xdf, 0xe8, 0xd3, 0x27, 0x9b, 0x39, 0xbf, 0x66, + 0x3b, 0x35, 0xf6, 0x1d, 0x58, 0x92, 0xe5, 0x4f, 0x84, 0x16, 0x1b, 0x68, 0x6b, 0xd3, 0x9c, 0x95, + 0xfa, 0x46, 0x61, 0x9f, 0x14, 0xc2, 0x44, 0xf8, 0xb0, 0xfe, 0x9c, 0x1d, 0x4c, 0x88, 0x79, 0x65, + 0xe1, 0x76, 0xe6, 0xd4, 0xd8, 0x01, 0x74, 0xc5, 0x0e, 0x25, 0x8a, 0xfa, 0x1d, 0xe4, 0x5d, 0xb4, + 0x54, 0xdd, 0xa8, 0xd0, 0x1e, 0xf4, 0xf4, 0xb5, 0x87, 0x91, 0x25, 0xe7, 0xec, 0x47, 0x42, 0xc8, + 0xbc, 0x0d, 0xc9, 0xa9, 0x31, 0x0f, 0x6e, 0xcf, 0x5f, 0x5e, 0xd8, 0xeb, 0xe5, 0xb7, 0xe5, 0x05, + 0xdb, 0xd2, 0x86, 0x73, 0x13, 0x4b, 0x71, 0xc5, 0xf7, 0xa0, 0x5f, 0x5c, 0x5e, 0x84, 0xb5, 0x8c, + 0x8a, 0x81, 0x54, 0x6d, 0xc1, 0xbe, 0xb3, 0xf1, 0xda, 0x42, 0x7a, 0x21, 0xfe, 0x04, 0x56, 0x4b, + 0x86, 0x58, 0x98, 0x8f, 0xdd, 0x9d, 0x39, 0x57, 0x31, 0xeb, 0x60, 0x11, 0xb9, 0x90, 0xfa, 0xfd, + 0x72, 0x63, 0xaf, 0x4a, 0x7e, 0x5d, 0xf7, 0xed, 0x7c, 0xe9, 0xce, 0x4d, 0x2c, 0xc5, 0x0d, 0x4f, + 0x60, 0xa5, 0xd2, 0x4f, 0x95, 0xec, 0x1b, 0x9b, 0xec, 0x4d, 0x01, 0x71, 0xbf, 0xff, 0xc5, 0x57, + 0x03, 0xe3, 0xcb, 0xaf, 0x06, 0xc6, 0xdf, 0xbf, 0x1a, 0x18, 0x3f, 0xfd, 0x7a, 0x50, 0xfb, 0xf2, + 0xeb, 0x41, 0xed, 0xaf, 0x5f, 0x0f, 0x6a, 0xa7, 0x4d, 0xfa, 0x97, 0xc8, 0xff, 0xfe, 0x2b, 0x00, + 0x00, 0xff, 0xff, 0xec, 0x69, 0xc8, 0x38, 0x37, 0x22, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4692,6 +4709,20 @@ func (m *SyncStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.DumpIOTotalBytes != 0 { + i = encodeVarintDmworker(dAtA, i, uint64(m.DumpIOTotalBytes)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x98 + } + if m.IOTotalBytes != 0 { + i = encodeVarintDmworker(dAtA, i, uint64(m.IOTotalBytes)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x90 + } if m.RecentRps != 0 { i = encodeVarintDmworker(dAtA, i, uint64(m.RecentRps)) i-- @@ -7063,6 +7094,12 @@ func (m *SyncStatus) Size() (n int) { if m.RecentRps != 0 { n += 2 + sovDmworker(uint64(m.RecentRps)) } + if m.IOTotalBytes != 0 { + n += 2 + sovDmworker(uint64(m.IOTotalBytes)) + } + if m.DumpIOTotalBytes != 0 { + n += 2 + sovDmworker(uint64(m.DumpIOTotalBytes)) + } return n } @@ -9639,6 +9676,44 @@ func (m *SyncStatus) Unmarshal(dAtA []byte) error { break } } + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IOTotalBytes", wireType) + } + m.IOTotalBytes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDmworker + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.IOTotalBytes |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 19: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DumpIOTotalBytes", wireType) + } + m.DumpIOTotalBytes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDmworker + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DumpIOTotalBytes |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipDmworker(dAtA[iNdEx:]) diff --git a/engine/enginepb/datarw.pb.go b/engine/enginepb/datarw.pb.go index bbb6a4c9f6b..d2bd6de6824 100644 --- a/engine/enginepb/datarw.pb.go +++ b/engine/enginepb/datarw.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/datarw.proto @@ -733,7 +733,7 @@ func file_engine_proto_datarw_proto_rawDescGZIP() []byte { } var file_engine_proto_datarw_proto_msgTypes = make([]protoimpl.MessageInfo, 12) -var file_engine_proto_datarw_proto_goTypes = []interface{}{ +var file_engine_proto_datarw_proto_goTypes = []any{ (*GenerateDataRequest)(nil), // 0: enginepb.GenerateDataRequest (*GenerateDataResponse)(nil), // 1: enginepb.GenerateDataResponse (*CheckDirRequest)(nil), // 2: enginepb.CheckDirRequest @@ -773,7 +773,7 @@ func file_engine_proto_datarw_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_engine_proto_datarw_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*GenerateDataRequest); i { case 0: return &v.state @@ -785,7 +785,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*GenerateDataResponse); i { case 0: return &v.state @@ -797,7 +797,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*CheckDirRequest); i { case 0: return &v.state @@ -809,7 +809,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*CheckDirResponse); i { case 0: return &v.state @@ -821,7 +821,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*IsReadyRequest); i { case 0: return &v.state @@ -833,7 +833,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*IsReadyResponse); i { case 0: return &v.state @@ -845,7 +845,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*ListFilesReq); i { case 0: return &v.state @@ -857,7 +857,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*ListFilesResponse); i { case 0: return &v.state @@ -869,7 +869,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*ReadLinesRequest); i { case 0: return &v.state @@ -881,7 +881,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*ReadLinesResponse); i { case 0: return &v.state @@ -893,7 +893,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*WriteLinesRequest); i { case 0: return &v.state @@ -905,7 +905,7 @@ func file_engine_proto_datarw_proto_init() { return nil } } - file_engine_proto_datarw_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_datarw_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*WriteLinesResponse); i { case 0: return &v.state diff --git a/engine/enginepb/executor.pb.go b/engine/enginepb/executor.pb.go index 1c316b94193..c04627ea745 100644 --- a/engine/enginepb/executor.pb.go +++ b/engine/enginepb/executor.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/executor.proto @@ -422,7 +422,7 @@ func file_engine_proto_executor_proto_rawDescGZIP() []byte { } var file_engine_proto_executor_proto_msgTypes = make([]protoimpl.MessageInfo, 6) -var file_engine_proto_executor_proto_goTypes = []interface{}{ +var file_engine_proto_executor_proto_goTypes = []any{ (*PreDispatchTaskRequest)(nil), // 0: enginepb.PreDispatchTaskRequest (*PreDispatchTaskResponse)(nil), // 1: enginepb.PreDispatchTaskResponse (*ConfirmDispatchTaskRequest)(nil), // 2: enginepb.ConfirmDispatchTaskRequest @@ -453,7 +453,7 @@ func file_engine_proto_executor_proto_init() { } file_engine_proto_projects_proto_init() if !protoimpl.UnsafeEnabled { - file_engine_proto_executor_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*PreDispatchTaskRequest); i { case 0: return &v.state @@ -465,7 +465,7 @@ func file_engine_proto_executor_proto_init() { return nil } } - file_engine_proto_executor_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*PreDispatchTaskResponse); i { case 0: return &v.state @@ -477,7 +477,7 @@ func file_engine_proto_executor_proto_init() { return nil } } - file_engine_proto_executor_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*ConfirmDispatchTaskRequest); i { case 0: return &v.state @@ -489,7 +489,7 @@ func file_engine_proto_executor_proto_init() { return nil } } - file_engine_proto_executor_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*ConfirmDispatchTaskResponse); i { case 0: return &v.state @@ -501,7 +501,7 @@ func file_engine_proto_executor_proto_init() { return nil } } - file_engine_proto_executor_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*RemoveLocalResourceRequest); i { case 0: return &v.state @@ -513,7 +513,7 @@ func file_engine_proto_executor_proto_init() { return nil } } - file_engine_proto_executor_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_executor_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*RemoveLocalResourceResponse); i { case 0: return &v.state diff --git a/engine/enginepb/master.pb.go b/engine/enginepb/master.pb.go index 5168ded9d3a..c81d3e28678 100644 --- a/engine/enginepb/master.pb.go +++ b/engine/enginepb/master.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/master.proto @@ -1782,248 +1782,248 @@ var file_engine_proto_master_proto_rawDesc = []byte{ 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0x13, 0x0a, 0x11, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x01, 0x0a, - 0x08, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x36, 0x0a, 0x06, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, - 0x49, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x08, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x22, 0x16, 0x0a, 0x14, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x49, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x52, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x63, 0x0a, - 0x06, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2a, 0x0a, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x13, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x09, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x12, 0x30, 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, + 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc1, 0x01, 0x0a, + 0x08, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x36, 0x0a, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0x49, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x08, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x22, 0x16, 0x0a, 0x14, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x52, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x63, + 0x0a, 0x06, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, 0x13, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2a, 0x0a, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x95, 0x01, 0x0a, + 0x13, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x33, 0x0a, + 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x22, 0x5c, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x22, 0x12, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, + 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x4c, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xee, 0x03, 0x0a, 0x03, 0x4a, 0x6f, + 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x04, 0xe2, + 0x41, 0x01, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x03, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x30, 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x22, 0x5c, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x22, 0x12, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x64, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xeb, 0x03, 0x0a, 0x03, 0x4a, 0x6f, 0x62, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, - 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, - 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x1b, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x2e, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x30, 0x0a, - 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, - 0x35, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x42, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, - 0x0a, 0x0b, 0x54, 0x79, 0x70, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, - 0x0b, 0x0a, 0x07, 0x43, 0x56, 0x53, 0x44, 0x65, 0x6d, 0x6f, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, - 0x44, 0x4d, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x44, 0x43, 0x10, 0x03, 0x12, 0x0b, 0x0a, - 0x07, 0x46, 0x61, 0x6b, 0x65, 0x4a, 0x6f, 0x62, 0x10, 0x04, 0x22, 0x6a, 0x0a, 0x05, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, - 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x46, - 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x63, - 0x65, 0x6c, 0x65, 0x64, 0x10, 0x06, 0x22, 0x6f, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x03, 0x6a, 0x6f, - 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x1b, 0x0a, 0x09, 0x74, - 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x72, 0x73, 0x1a, 0x35, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x42, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x79, 0x70, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x56, 0x53, 0x44, 0x65, 0x6d, 0x6f, 0x10, 0x01, + 0x12, 0x06, 0x0a, 0x02, 0x44, 0x4d, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x44, 0x43, 0x10, + 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x61, 0x6b, 0x65, 0x4a, 0x6f, 0x62, 0x10, 0x04, 0x22, 0x6a, + 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x10, 0x04, 0x12, 0x0d, 0x0a, + 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x10, 0x06, 0x22, 0x6f, 0x0a, 0x10, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, + 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, + 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x82, 0x01, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x22, 0x83, 0x02, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x5d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, + 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x04, 0x6a, 0x6f, + 0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x5e, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x83, 0x02, 0x0a, - 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, - 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, - 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x22, 0x5d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, - 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, - 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x5e, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x22, 0x5e, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x22, 0x3c, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x74, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, - 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x02, 0x74, 0x70, 0x22, - 0x30, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x22, 0x1b, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x34, - 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2a, 0x32, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x4d, 0x65, 0x74, - 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x10, 0x01, 0x32, 0x9c, 0x06, 0x0a, 0x09, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x77, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x21, 0x2e, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, - 0x6b, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x1e, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x63, 0x0a, 0x0b, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, - 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x12, 0x46, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x1a, + 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x5e, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, + 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, + 0x0a, 0x02, 0x74, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x02, 0x74, 0x70, 0x22, 0x30, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x1b, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x34, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2a, 0x32, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4d, + 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x70, + 0x70, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x10, 0x01, 0x32, 0x9c, 0x06, 0x0a, + 0x09, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x77, 0x0a, 0x10, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x21, + 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x12, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x08, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x63, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x1c, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x46, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x48, 0x65, + 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x1f, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, - 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x61, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, - 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x64, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x1d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, - 0x69, 0x67, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, - 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x2f, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x32, 0x60, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x0c, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x1d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x70, 0x62, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xc1, 0x03, 0x0a, 0x0a, 0x4a, 0x6f, - 0x62, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, - 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x3a, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x4d, 0x0a, 0x06, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x17, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, - 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x22, 0x1b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6a, - 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x12, 0x57, 0x0a, 0x08, 0x4c, 0x69, - 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x19, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, - 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6a, - 0x6f, 0x62, 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, - 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6e, 0x63, - 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x22, 0x22, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1c, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6a, 0x6f, 0x62, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x2f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x12, - 0x5c, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1a, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x42, 0x2b, 0x5a, - 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x69, 0x6e, 0x67, - 0x63, 0x61, 0x70, 0x2f, 0x74, 0x69, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, + 0x0e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, + 0x1f, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4d, 0x65, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1d, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x17, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x32, 0x60, 0x0a, 0x0d, 0x54, + 0x61, 0x73, 0x6b, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x0c, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x1d, 0x2e, 0x65, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xc1, 0x03, + 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x51, 0x0a, 0x09, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, + 0x2e, 0x4a, 0x6f, 0x62, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x03, 0x6a, 0x6f, + 0x62, 0x22, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x12, + 0x4d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x17, 0x2e, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, + 0x62, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x12, 0x57, + 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x19, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0d, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x22, + 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x2f, 0x63, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x12, 0x5c, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, + 0x12, 0x1a, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6a, 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, + 0x7d, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x70, 0x69, 0x6e, 0x67, 0x63, 0x61, 0x70, 0x2f, 0x74, 0x69, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x65, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2040,7 +2040,7 @@ func file_engine_proto_master_proto_rawDescGZIP() []byte { var file_engine_proto_master_proto_enumTypes = make([]protoimpl.EnumInfo, 4) var file_engine_proto_master_proto_msgTypes = make([]protoimpl.MessageInfo, 28) -var file_engine_proto_master_proto_goTypes = []interface{}{ +var file_engine_proto_master_proto_goTypes = []any{ (StoreType)(0), // 0: enginepb.StoreType (Selector_Op)(0), // 1: enginepb.Selector.Op (Job_Type)(0), // 2: enginepb.Job.Type @@ -2135,7 +2135,7 @@ func file_engine_proto_master_proto_init() { } file_engine_proto_resources_proto_init() if !protoimpl.UnsafeEnabled { - file_engine_proto_master_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*Selector); i { case 0: return &v.state @@ -2147,7 +2147,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*HeartbeatRequest); i { case 0: return &v.state @@ -2159,7 +2159,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*HeartbeatResponse); i { case 0: return &v.state @@ -2171,7 +2171,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*Executor); i { case 0: return &v.state @@ -2183,7 +2183,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*RegisterExecutorRequest); i { case 0: return &v.state @@ -2195,7 +2195,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*ListExecutorsRequest); i { case 0: return &v.state @@ -2207,7 +2207,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*ListExecutorsResponse); i { case 0: return &v.state @@ -2219,7 +2219,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*Master); i { case 0: return &v.state @@ -2231,7 +2231,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*ListMastersRequest); i { case 0: return &v.state @@ -2243,7 +2243,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*ListMastersResponse); i { case 0: return &v.state @@ -2255,7 +2255,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*ScheduleTaskRequest); i { case 0: return &v.state @@ -2267,7 +2267,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*ScheduleTaskResponse); i { case 0: return &v.state @@ -2279,7 +2279,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*GetLeaderRequest); i { case 0: return &v.state @@ -2291,7 +2291,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*GetLeaderResponse); i { case 0: return &v.state @@ -2303,7 +2303,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*ResignLeaderRequest); i { case 0: return &v.state @@ -2315,7 +2315,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*Job); i { case 0: return &v.state @@ -2327,7 +2327,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*CreateJobRequest); i { case 0: return &v.state @@ -2339,7 +2339,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*GetJobRequest); i { case 0: return &v.state @@ -2351,7 +2351,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*ListJobsRequest); i { case 0: return &v.state @@ -2363,7 +2363,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*ListJobsResponse); i { case 0: return &v.state @@ -2375,7 +2375,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*CancelJobRequest); i { case 0: return &v.state @@ -2387,7 +2387,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*DeleteJobRequest); i { case 0: return &v.state @@ -2399,7 +2399,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*QueryMetaStoreRequest); i { case 0: return &v.state @@ -2411,7 +2411,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*QueryMetaStoreResponse); i { case 0: return &v.state @@ -2423,7 +2423,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*QueryStorageConfigRequest); i { case 0: return &v.state @@ -2435,7 +2435,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*QueryStorageConfigResponse); i { case 0: return &v.state @@ -2447,7 +2447,7 @@ func file_engine_proto_master_proto_init() { return nil } } - file_engine_proto_master_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_master_proto_msgTypes[27].Exporter = func(v any, i int) any { switch v := v.(*Job_Error); i { case 0: return &v.state diff --git a/engine/enginepb/projects.pb.go b/engine/enginepb/projects.pb.go index e7a72aae763..c8bccfd6007 100644 --- a/engine/enginepb/projects.pb.go +++ b/engine/enginepb/projects.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/projects.proto @@ -104,7 +104,7 @@ func file_engine_proto_projects_proto_rawDescGZIP() []byte { } var file_engine_proto_projects_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_engine_proto_projects_proto_goTypes = []interface{}{ +var file_engine_proto_projects_proto_goTypes = []any{ (*ProjectInfo)(nil), // 0: enginepb.ProjectInfo } var file_engine_proto_projects_proto_depIdxs = []int32{ @@ -121,7 +121,7 @@ func file_engine_proto_projects_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_engine_proto_projects_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_projects_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*ProjectInfo); i { case 0: return &v.state diff --git a/engine/enginepb/resources.pb.go b/engine/enginepb/resources.pb.go index fdd1822a8b4..4915c07aaa2 100644 --- a/engine/enginepb/resources.pb.go +++ b/engine/enginepb/resources.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/resources.proto @@ -471,7 +471,7 @@ func file_engine_proto_resources_proto_rawDescGZIP() []byte { } var file_engine_proto_resources_proto_msgTypes = make([]protoimpl.MessageInfo, 7) -var file_engine_proto_resources_proto_goTypes = []interface{}{ +var file_engine_proto_resources_proto_goTypes = []any{ (*CreateResourceRequest)(nil), // 0: enginepb.CreateResourceRequest (*CreateResourceResponse)(nil), // 1: enginepb.CreateResourceResponse (*ResourceKey)(nil), // 2: enginepb.ResourceKey @@ -505,7 +505,7 @@ func file_engine_proto_resources_proto_init() { } file_engine_proto_projects_proto_init() if !protoimpl.UnsafeEnabled { - file_engine_proto_resources_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*CreateResourceRequest); i { case 0: return &v.state @@ -517,7 +517,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*CreateResourceResponse); i { case 0: return &v.state @@ -529,7 +529,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*ResourceKey); i { case 0: return &v.state @@ -541,7 +541,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*QueryResourceRequest); i { case 0: return &v.state @@ -553,7 +553,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*QueryResourceResponse); i { case 0: return &v.state @@ -565,7 +565,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*RemoveResourceRequest); i { case 0: return &v.state @@ -577,7 +577,7 @@ func file_engine_proto_resources_proto_init() { return nil } } - file_engine_proto_resources_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_resources_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*RemoveResourceResponse); i { case 0: return &v.state diff --git a/engine/enginepb/test.pb.go b/engine/enginepb/test.pb.go index 787ff75592f..22435f85ab9 100644 --- a/engine/enginepb/test.pb.go +++ b/engine/enginepb/test.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.34.2 // protoc v3.20.1 // source: engine/proto/test.proto @@ -246,7 +246,7 @@ func file_engine_proto_test_proto_rawDescGZIP() []byte { var file_engine_proto_test_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_engine_proto_test_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_engine_proto_test_proto_goTypes = []interface{}{ +var file_engine_proto_test_proto_goTypes = []any{ (Record_RecordType)(0), // 0: enginepb.Record.RecordType (*Record)(nil), // 1: enginepb.Record (*TestBinlogRequest)(nil), // 2: enginepb.TestBinlogRequest @@ -268,7 +268,7 @@ func file_engine_proto_test_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_engine_proto_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_test_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*Record); i { case 0: return &v.state @@ -280,7 +280,7 @@ func file_engine_proto_test_proto_init() { return nil } } - file_engine_proto_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_engine_proto_test_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*TestBinlogRequest); i { case 0: return &v.state diff --git a/tools/check/go.mod b/tools/check/go.mod index 9f869541869..ec6abb43de9 100644 --- a/tools/check/go.mod +++ b/tools/check/go.mod @@ -85,7 +85,7 @@ require ( github.com/gobwas/glob v0.2.3 // indirect github.com/gofrs/flock v0.12.1 // indirect github.com/golang/glog v1.0.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect diff --git a/tools/check/go.sum b/tools/check/go.sum index b710465dfc0..f797a06f316 100644 --- a/tools/check/go.sum +++ b/tools/check/go.sum @@ -377,6 +377,8 @@ 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/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= @@ -1445,7 +1447,12 @@ google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220719170305-83ca9fad585f h1:P8EiVSxZwC6xH2niv2N66aqwMtYFg+D54gbjpcqKJtM= google.golang.org/genproto v0.0.0-20220719170305-83ca9fad585f/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f h1:b1Ln/PG8orm0SsBbHZWke8dDp2lrCD4jSmfglFpTZbk= +google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:AHT0dDg3SoMOgZGnZk29b5xTbPHMoEC8qthmBLJCpys= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= 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= From 842c5eb1d668d798cb232e97442ff9a397684ce4 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:11:53 +0800 Subject: [PATCH 07/50] add test --- dm/config/task_converters_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dm/config/task_converters_test.go b/dm/config/task_converters_test.go index 24eb74a09c0..fc368db2384 100644 --- a/dm/config/task_converters_test.go +++ b/dm/config/task_converters_test.go @@ -16,6 +16,7 @@ import ( "fmt" "testing" + "github.com/google/uuid" "github.com/pingcap/check" "github.com/pingcap/tidb/pkg/util/filter" "github.com/pingcap/tiflow/dm/config/dbconfig" @@ -117,6 +118,13 @@ func testNoShardTaskToSubTaskConfigs(c *check.C) { c.Assert(subTaskConfig.BAList, check.DeepEquals, bAListFromOpenAPITask) // check ignore check items c.Assert(subTaskConfig.IgnoreCheckingItems, check.IsNil) + // check io total bytes counter and uuid + c.Assert(subTaskConfig.IOTotalBytes, check.NotNil) + c.Assert(subTaskConfig.DumpIOTotalBytes, check.NotNil) + c.Assert(subTaskConfig.IOTotalBytes.Load(), check.Equals, uint64(0)) + c.Assert(subTaskConfig.DumpIOTotalBytes.Load(), check.Equals, uint64(0)) + c.Assert(subTaskConfig.UUID, check.HasLen, len(uuid.NewString())) + c.Assert(subTaskConfig.DumpUUID, check.HasLen, len(uuid.NewString())) } func testShardAndFilterTaskToSubTaskConfigs(c *check.C) { From 00b827ac0f768c7f3a36878ff40f1411343a4d82 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 14 Nov 2024 13:20:04 +0800 Subject: [PATCH 08/50] remove json tag for uuid --- dm/config/subtask.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dm/config/subtask.go b/dm/config/subtask.go index 2577b18fb8a..620f2b86abe 100644 --- a/dm/config/subtask.go +++ b/dm/config/subtask.go @@ -182,12 +182,12 @@ type SubTaskConfig struct { // one go runtime. // IOTotalBytes is used build TCPConnWithIOCounter and UUID is used to as a // key to let MySQL driver to find the right TCPConnWithIOCounter. - UUID string `toml:"uuid" json:"uuid"` + UUID string `toml:"uuid" json:"-"` IOTotalBytes *atomic.Uint64 `toml:"io-total-bytes" json:"io-total-bytes"` // meter network usage from upstream // e.g., pulling binlog - DumpUUID string `toml:"dump-uuid" json:"dump-uuid"` + DumpUUID string `toml:"dump-uuid" json:"-"` DumpIOTotalBytes *atomic.Uint64 `toml:"dump-io-total-bytes" json:"dump-io-total-bytes"` } From b094cb43c0db9c8dc7b7ae93cff3e4a622ace954 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:34:33 +0800 Subject: [PATCH 09/50] manual clone atomic.Uint64 and add test --- dm/config/subtask.go | 4 ++- dm/config/subtask_test.go | 75 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/dm/config/subtask.go b/dm/config/subtask.go index 620f2b86abe..9737d99ac70 100644 --- a/dm/config/subtask.go +++ b/dm/config/subtask.go @@ -495,6 +495,8 @@ func (c *SubTaskConfig) Clone() (*SubTaskConfig, error) { if err != nil { return nil, terror.ErrConfigTomlTransform.Delegate(err, "decode subtask config from data") } - + // Manually copy atomic values for atomic.Uint64 doesn't implement TOML marshaling interfaces + clone.IOTotalBytes = atomic.NewUint64(c.IOTotalBytes.Load()) + clone.DumpIOTotalBytes = atomic.NewUint64(c.DumpIOTotalBytes.Load()) return clone, nil } diff --git a/dm/config/subtask_test.go b/dm/config/subtask_test.go index ab0956e403a..ec9b680c9d6 100644 --- a/dm/config/subtask_test.go +++ b/dm/config/subtask_test.go @@ -16,7 +16,9 @@ package config import ( "context" "crypto/rand" + "encoding/json" "reflect" + "sync" "testing" "github.com/DATA-DOG/go-sqlmock" @@ -27,6 +29,7 @@ import ( "github.com/pingcap/tiflow/dm/pkg/terror" "github.com/pingcap/tiflow/dm/pkg/utils" "github.com/stretchr/testify/require" + "go.uber.org/atomic" ) func TestSubTask(t *testing.T) { @@ -345,3 +348,75 @@ func TestFetchTZSetting(t *testing.T) { require.NoError(t, err) require.Equal(t, "+01:00", tz) } + +func TestSubTaskConfigMarshalAtomic(t *testing.T) { + var ( + uuid string = "test-uuid" + dumpUuid string = "test-dump-uuid" + ) + cfg := &SubTaskConfig{ + Name: "test", + SourceID: "source-1", + UUID: uuid, + DumpUUID: dumpUuid, + IOTotalBytes: atomic.NewUint64(100), + DumpIOTotalBytes: atomic.NewUint64(200), + } + require.Equal(t, cfg.IOTotalBytes.Load(), uint64(100)) + require.Equal(t, cfg.DumpIOTotalBytes.Load(), uint64(200)) + + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + data, err := json.Marshal(cfg) + require.NoError(t, err) + jsonMap := make(map[string]interface{}) + err = json.Unmarshal(data, &jsonMap) + require.NoError(t, err) + + // Check atomic values exist and are numbers + ioBytes, ok := jsonMap["io-total-bytes"].(float64) + require.True(t, ok, "io-total-bytes should be a number") + require.GreaterOrEqual(t, ioBytes, float64(100)) + + dumpBytes, ok := jsonMap["dump-io-total-bytes"].(float64) + require.True(t, ok, "dump-io-total-bytes should be a number") + require.GreaterOrEqual(t, dumpBytes, float64(200)) + + // UUID fields should not be present in JSON + _, hasUUID := jsonMap["uuid"] + _, hasDumpUUID := jsonMap["dump-uuid"] + require.False(t, hasUUID, "UUID should not be in JSON") + require.False(t, hasDumpUUID, "DumpUUID should not be in JSON") + }() + + wg.Add(1) + go func() { + defer wg.Done() + + newCfg, err := cfg.Clone() + require.NoError(t, err) + + // Check atomic values exist and are numbers + require.GreaterOrEqual(t, newCfg.IOTotalBytes.Load(), uint64(100)) + require.GreaterOrEqual(t, newCfg.DumpIOTotalBytes.Load(), uint64(200)) + require.Equal(t, newCfg.UUID, uuid) + require.Equal(t, newCfg.DumpUUID, dumpUuid) + }() + + wg.Add(1) + go func() { + defer wg.Done() + cfg.IOTotalBytes.Add(1) + cfg.DumpIOTotalBytes.Add(1) + }() + } + wg.Wait() + + // Final check: values should have increased + require.Greater(t, cfg.IOTotalBytes.Load(), uint64(100)) + require.Greater(t, cfg.DumpIOTotalBytes.Load(), uint64(200)) +} From e3b5bcb7901a03ae90ae50f8b72850c8cdd1bd03 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:37:57 +0800 Subject: [PATCH 10/50] fix test --- dm/config/subtask_test.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dm/config/subtask_test.go b/dm/config/subtask_test.go index ec9b680c9d6..fa95ce617ed 100644 --- a/dm/config/subtask_test.go +++ b/dm/config/subtask_test.go @@ -416,7 +416,6 @@ func TestSubTaskConfigMarshalAtomic(t *testing.T) { } wg.Wait() - // Final check: values should have increased - require.Greater(t, cfg.IOTotalBytes.Load(), uint64(100)) - require.Greater(t, cfg.DumpIOTotalBytes.Load(), uint64(200)) + require.GreaterOrEqual(t, cfg.IOTotalBytes.Load(), uint64(100)) + require.GreaterOrEqual(t, cfg.DumpIOTotalBytes.Load(), uint64(200)) } From 38ff844dad22534d6cf10544b8559e5bdca0bc69 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:50:50 +0800 Subject: [PATCH 11/50] fix nil pointer... --- dm/config/subtask.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dm/config/subtask.go b/dm/config/subtask.go index 9737d99ac70..19c5334c65e 100644 --- a/dm/config/subtask.go +++ b/dm/config/subtask.go @@ -496,7 +496,11 @@ func (c *SubTaskConfig) Clone() (*SubTaskConfig, error) { return nil, terror.ErrConfigTomlTransform.Delegate(err, "decode subtask config from data") } // Manually copy atomic values for atomic.Uint64 doesn't implement TOML marshaling interfaces - clone.IOTotalBytes = atomic.NewUint64(c.IOTotalBytes.Load()) - clone.DumpIOTotalBytes = atomic.NewUint64(c.DumpIOTotalBytes.Load()) + if c.IOTotalBytes != nil { + clone.IOTotalBytes = atomic.NewUint64(c.IOTotalBytes.Load()) + } + if c.DumpIOTotalBytes != nil { + clone.DumpIOTotalBytes = atomic.NewUint64(c.DumpIOTotalBytes.Load()) + } return clone, nil } From 5c2c5ae1ce482bcde083a91431fee0a01e853ebf Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:28:40 +0800 Subject: [PATCH 12/50] fix build --- dm/config/subtask_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dm/config/subtask_test.go b/dm/config/subtask_test.go index fa95ce617ed..58039b0f63d 100644 --- a/dm/config/subtask_test.go +++ b/dm/config/subtask_test.go @@ -351,14 +351,14 @@ func TestFetchTZSetting(t *testing.T) { func TestSubTaskConfigMarshalAtomic(t *testing.T) { var ( - uuid string = "test-uuid" - dumpUuid string = "test-dump-uuid" + uuid = "test-uuid" + dumpUUID = "test-dump-uuid" ) cfg := &SubTaskConfig{ Name: "test", SourceID: "source-1", UUID: uuid, - DumpUUID: dumpUuid, + DumpUUID: dumpUUID, IOTotalBytes: atomic.NewUint64(100), DumpIOTotalBytes: atomic.NewUint64(200), } @@ -404,7 +404,7 @@ func TestSubTaskConfigMarshalAtomic(t *testing.T) { require.GreaterOrEqual(t, newCfg.IOTotalBytes.Load(), uint64(100)) require.GreaterOrEqual(t, newCfg.DumpIOTotalBytes.Load(), uint64(200)) require.Equal(t, newCfg.UUID, uuid) - require.Equal(t, newCfg.DumpUUID, dumpUuid) + require.Equal(t, newCfg.DumpUUID, dumpUUID) }() wg.Add(1) From 91304ea7555dfce3c6b1fe7558d5f651db54f981 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 14 Nov 2024 18:11:09 +0800 Subject: [PATCH 13/50] fix nil --- dm/config/task_converters.go | 5 +++++ dm/syncer/status.go | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/dm/config/task_converters.go b/dm/config/task_converters.go index 46e2eea4baf..b45dac542ac 100644 --- a/dm/config/task_converters.go +++ b/dm/config/task_converters.go @@ -103,6 +103,11 @@ func TaskConfigToSubTaskConfigs(c *TaskConfig, sources map[string]dbconfig.DBCon cfg.CleanDumpFile = c.CleanDumpFile + cfg.IOTotalBytes = atomic.NewUint64(0) + cfg.DumpIOTotalBytes = atomic.NewUint64(0) + cfg.UUID = uuid.NewString() + cfg.DumpUUID = uuid.NewString() + if err := cfg.Adjust(true); err != nil { return nil, terror.Annotatef(err, "source %s", inst.SourceID) } diff --git a/dm/syncer/status.go b/dm/syncer/status.go index fcc1c322bd9..0e0e185d447 100644 --- a/dm/syncer/status.go +++ b/dm/syncer/status.go @@ -38,8 +38,12 @@ func (s *Syncer) Status(sourceStatus *binlog.SourceStatus) interface{} { RecentRps: s.rps.Load(), SyncerBinlog: syncerLocation.Position.String(), SecondsBehindMaster: s.secondsBehindMaster.Load(), - IOTotalBytes: s.cfg.IOTotalBytes.Load(), - DumpIOTotalBytes: s.cfg.DumpIOTotalBytes.Load(), + } + if s.cfg.IOTotalBytes != nil { + st.IOTotalBytes = s.cfg.IOTotalBytes.Load() + } + if s.cfg.DumpIOTotalBytes != nil { + st.DumpIOTotalBytes = s.cfg.DumpIOTotalBytes.Load() } if syncerLocation.GetGTID() != nil { From 9f1009a9c352eadcb68097289c4e0cdcba357150 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 14 Nov 2024 18:34:48 +0800 Subject: [PATCH 14/50] fix ut --- dm/config/task_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dm/config/task_test.go b/dm/config/task_test.go index bb90c5b83e0..fd41681df56 100644 --- a/dm/config/task_test.go +++ b/dm/config/task_test.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tiflow/dm/pkg/utils" bf "github.com/pingcap/tiflow/pkg/binlog-filter" "github.com/stretchr/testify/require" + "go.uber.org/atomic" ) var correctTaskConfig = `--- @@ -688,6 +689,8 @@ func TestGenAndFromSubTaskConfigs(t *testing.T) { ValidatorCfg: validatorCfg, CleanDumpFile: true, EnableANSIQuotes: true, + IOTotalBytes: atomic.NewUint64(0), + DumpIOTotalBytes: atomic.NewUint64(0), } ) From 98a610a051866cfcc5af1b58bbcada92eb423f8e Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 14 Nov 2024 23:42:01 +0800 Subject: [PATCH 15/50] skip compare atomic value --- dm/config/subtask.go | 7 +++++++ dm/syncer/syncer.go | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/dm/config/subtask.go b/dm/config/subtask.go index 19c5334c65e..fd6057169a8 100644 --- a/dm/config/subtask.go +++ b/dm/config/subtask.go @@ -222,6 +222,10 @@ func (c *SubTaskConfig) String() string { } // Toml returns TOML format representation of config. +// Note: The atomic.Uint64 fields (IOTotalBytes and DumpIOTotalBytes) are not +// encoded in the TOML output because they do not implement the necessary +// marshaling interfaces. As a result, these fields will not be included in +// the TOML representation. func (c *SubTaskConfig) Toml() (string, error) { var b bytes.Buffer enc := toml.NewEncoder(&b) @@ -242,6 +246,9 @@ func (c *SubTaskConfig) DecodeFile(fpath string, verifyDecryptPassword bool) err } // Decode loads config from file data. +// Note: The atomic.Uint64 fields (IOTotalBytes and DumpIOTotalBytes) will not +// be populated from the TOML data since they cannot be decoded by toml.Decode(). +// As a result, these fields will remain uninitialized (zero value) after decoding. func (c *SubTaskConfig) Decode(data string, verifyDecryptPassword bool) error { if _, err := toml.Decode(data, c); err != nil { return terror.ErrConfigTomlTransform.Delegate(err, "decode subtask config from data") diff --git a/dm/syncer/syncer.go b/dm/syncer/syncer.go index 75491e0084c..ed08dbc1632 100644 --- a/dm/syncer/syncer.go +++ b/dm/syncer/syncer.go @@ -3376,6 +3376,12 @@ func (s *Syncer) CheckCanUpdateCfg(newCfg *config.SubTaskConfig) error { oldCfg.EnableGTID = newCfg.EnableGTID oldCfg.CaseSensitive = newCfg.CaseSensitive + // Skip comparing atomic values since they cannot be marshaled/unmarshaled + // by the TOML encoder/decoder. These fields will remain uninitialized (zero value) + // after decoding. + newCfg.IOTotalBytes = oldCfg.IOTotalBytes + newCfg.DumpIOTotalBytes = oldCfg.DumpIOTotalBytes + if oldCfg.String() != newCfg.String() { s.tctx.L().Warn("can not update cfg", zap.Stringer("old cfg", oldCfg), zap.Stringer("new cfg", newCfg)) return terror.ErrWorkerUpdateSubTaskConfig.Generatef("can't update subtask config for syncer because new config contains some fields that should not be changed, task: %s", s.cfg.Name) From 4d3d92809966c8388a4bf0e8e8d73402ac6df05f Mon Sep 17 00:00:00 2001 From: OliverS929 <182192954+OliverS929@users.noreply.github.com> Date: Tue, 12 Nov 2024 17:31:42 +0800 Subject: [PATCH 16/50] Primary work to add a stand-alone load mode to DM. Load&Sync mode might not be needed anymore and could be depreciated in the future. --- dm/config/helper.go | 2 +- dm/config/helper_test.go | 4 ++++ dm/config/subtask.go | 2 ++ dm/config/task.go | 6 +++--- dm/pkg/terror/error_list.go | 2 +- dm/worker/subtask.go | 2 ++ engine/executor/dm/worker.go | 18 ++++++++++-------- engine/jobmaster/dm/task_manager.go | 3 ++- engine/jobmaster/dm/worker_manager.go | 3 +++ 9 files changed, 28 insertions(+), 14 deletions(-) diff --git a/dm/config/helper.go b/dm/config/helper.go index 49badba0169..36fed03edeb 100644 --- a/dm/config/helper.go +++ b/dm/config/helper.go @@ -26,7 +26,7 @@ func HasDump(taskMode string) bool { // HasLoad returns true if taskMode contains load unit. func HasLoad(taskMode string) bool { switch taskMode { - case ModeAll, ModeFull, ModeLoadSync: + case ModeAll, ModeFull, ModeLoad, ModeLoadSync: return true default: return false diff --git a/dm/config/helper_test.go b/dm/config/helper_test.go index c7cc677c5c7..a644e8c1a7d 100644 --- a/dm/config/helper_test.go +++ b/dm/config/helper_test.go @@ -36,6 +36,10 @@ func TestTaskModeHasFunction(t *testing.T) { require.False(t, HasLoad(ModeDump)) require.False(t, HasSync(ModeDump)) + require.False(t, HasDump(ModeLoad)) + require.True(t, HasLoad(ModeLoad)) + require.False(t, HasSync(ModeLoad)) + require.False(t, HasDump(ModeLoadSync)) require.True(t, HasLoad(ModeLoadSync)) require.True(t, HasSync(ModeLoadSync)) diff --git a/dm/config/subtask.go b/dm/config/subtask.go index fd6057169a8..42055784932 100644 --- a/dm/config/subtask.go +++ b/dm/config/subtask.go @@ -52,6 +52,7 @@ const ( ModeFull = "full" ModeIncrement = "incremental" ModeDump = "dump" + ModeLoad = "load" ModeLoadSync = "load&sync" DefaultShadowTableRules = "^_(.+)_(?:new|gho)$" @@ -337,6 +338,7 @@ func (c *SubTaskConfig) Adjust(verifyDecryptPassword bool) error { } // adjust dir, no need to do for load&sync mode because it needs its own s3 repository + // still use dir for standalone load mode (different from the behavior of load&sync mode) if HasLoad(c.Mode) && c.Mode != ModeLoadSync { // check isS3 := storage.IsS3Path(c.LoaderConfig.Dir) diff --git a/dm/config/task.go b/dm/config/task.go index 8cedfbd5e65..9f5a77324f0 100644 --- a/dm/config/task.go +++ b/dm/config/task.go @@ -669,7 +669,7 @@ func (c *TaskConfig) adjust() error { return terror.ErrConfigNeedUniqueTaskName.Generate() } switch c.TaskMode { - case ModeFull, ModeIncrement, ModeAll, ModeDump, ModeLoadSync: + case ModeFull, ModeIncrement, ModeAll, ModeDump, ModeLoad, ModeLoadSync: default: return terror.ErrConfigInvalidTaskMode.Generate() } @@ -774,9 +774,9 @@ func (c *TaskConfig) adjust() error { instanceIDs[inst.SourceID] = i switch c.TaskMode { - case ModeFull, ModeAll, ModeDump: + case ModeFull, ModeAll, ModeDump, ModeLoad: if inst.Meta != nil { - log.L().Warn("metadata will not be used. for Full mode, incremental sync will never occur; for All mode, the meta dumped by MyDumper will be used", zap.Int("mysql instance", i), zap.String("task mode", c.TaskMode)) + log.L().Warn("metadata will not be used. for Full/Dump/Load mode, incremental sync will never occur; for All mode, the meta dumped by MyDumper will be used", zap.Int("mysql instance", i), zap.String("task mode", c.TaskMode)) } case ModeIncrement: if inst.Meta == nil { diff --git a/dm/pkg/terror/error_list.go b/dm/pkg/terror/error_list.go index dfa040e989f..602a4b58313 100644 --- a/dm/pkg/terror/error_list.go +++ b/dm/pkg/terror/error_list.go @@ -935,7 +935,7 @@ var ( ErrConfigSyncerCfgConflict = New(codeConfigSyncerCfgConflict, ClassConfig, ScopeInternal, LevelMedium, "syncer-config-name and syncer should only specify one", "Please check the `syncer-config-name` and `syncer` config in task configuration file.") ErrConfigReadCfgFromFile = New(codeConfigReadCfgFromFile, ClassConfig, ScopeInternal, LevelMedium, "read config file %v", "") ErrConfigNeedUniqueTaskName = New(codeConfigNeedUniqueTaskName, ClassConfig, ScopeInternal, LevelMedium, "must specify a unique task name", "Please check the `name` config in task configuration file.") - ErrConfigInvalidTaskMode = New(codeConfigInvalidTaskMode, ClassConfig, ScopeInternal, LevelMedium, "please specify right task-mode, support `full`, `incremental`, `all`", "Please check the `task-mode` config in task configuration file.") + ErrConfigInvalidTaskMode = New(codeConfigInvalidTaskMode, ClassConfig, ScopeInternal, LevelMedium, "please specify right task-mode, support `full`, `incremental`, `all`, `dump`, `load`", "Please check the `task-mode` config in task configuration file.") ErrConfigNeedTargetDB = New(codeConfigNeedTargetDB, ClassConfig, ScopeInternal, LevelMedium, "must specify target-database", "Please check the `target-database` config in task configuration file.") ErrConfigMetadataNotSet = New(codeConfigMetadataNotSet, ClassConfig, ScopeInternal, LevelMedium, "mysql-instance(%s) must set meta for task-mode %s", "Please check the `meta` config in task configuration file.") ErrConfigRouteRuleNotFound = New(codeConfigRouteRuleNotFound, ClassConfig, ScopeInternal, LevelMedium, "mysql-instance(%d)'s route-rules %s not exist in routes", "Please check the `route-rules` config in task configuration file.") diff --git a/dm/worker/subtask.go b/dm/worker/subtask.go index 8db5b050a63..e5c2e5980a0 100644 --- a/dm/worker/subtask.go +++ b/dm/worker/subtask.go @@ -69,6 +69,8 @@ func createRealUnits(cfg *config.SubTaskConfig, etcdClient *clientv3.Client, wor us = append(us, syncer.NewSyncer(cfg, etcdClient, relay)) case config.ModeDump: us = append(us, dumpling.NewDumpling(cfg)) + case config.ModeLoad: + us = append(us, loader.NewLightning(cfg, etcdClient, workerName)) case config.ModeLoadSync: us = append(us, loader.NewLightning(cfg, etcdClient, workerName)) us = append(us, syncer.NewSyncer(cfg, etcdClient, relay)) diff --git a/engine/executor/dm/worker.go b/engine/executor/dm/worker.go index 21445c8f3b8..502b280e6db 100644 --- a/engine/executor/dm/worker.go +++ b/engine/executor/dm/worker.go @@ -152,12 +152,12 @@ func (w *dmWorker) InitImpl(ctx context.Context) error { if err := w.messageAgent.UpdateClient(w.masterID, w); err != nil { return err } - // for dump/load&sync mode task, we needn't to setup external storage - // these two tasks will directly read/write data from/to user specified external storage without executor's management - // for all/full mode task, the dump/load units run on a same executor, so they can access the s3 data under a same executor - // but for dump/load&sync mode task, import API needs a clear S3 URI without exector's prefix, - // what's more, dump/load units may not be executed on a same executor, - // so we choose to use user's own external storage and don't set up here. + // For dump/load/load&sync mode tasks, we don’t need to set up external storage. + // These tasks directly read/write data to/from user-specified external storage without the executor's management. + // In all/full mode tasks, dump/load units run on the same executor, allowing access to S3 data under the same executor's namespace. + // However, for dump/load & sync mode tasks, the import API requires a plain S3 URI without the executor's prefix. + // Additionally, dump/load units may not run on the same executor, + // so we opt to use the user’s external storage directly instead of configuring it here. if (w.cfg.Mode == dmconfig.ModeAll || w.cfg.Mode == dmconfig.ModeFull) && w.needExtStorage { if err := w.setupStorage(ctx); err != nil { return err @@ -258,8 +258,10 @@ func (w *dmWorker) updateStatusWhenStageChange(ctx context.Context) error { return w.UpdateStatus(ctx, status) } - // now we are in StageFinished - // for all and full mode, resource is managed by engine, we need to discard them + // Now we are in StageFinished + // For all and full mode, resource is managed by engine, we need to discard them + // In standalone modes (e.g., dump and load), we use user-specified storage. + // No additional operations on storage are needed, leaving management to the user. if w.cfg.Mode == dmconfig.ModeAll || w.cfg.Mode == dmconfig.ModeFull { switch w.workerType { case frameModel.WorkerDMDump: diff --git a/engine/jobmaster/dm/task_manager.go b/engine/jobmaster/dm/task_manager.go index 5009e21d439..137b1a13392 100644 --- a/engine/jobmaster/dm/task_manager.go +++ b/engine/jobmaster/dm/task_manager.go @@ -287,7 +287,8 @@ func (tm *TaskManager) allFinished(ctx context.Context) bool { if runningTask.Unit != frameModel.WorkerDMLoad { return false } - case dmconfig.ModeDump: + case dmconfig.ModeDump, dmconfig.ModeLoad, dmconfig.ModeLoadSync: + //passing through, as long as the stage is done default: return false } diff --git a/engine/jobmaster/dm/worker_manager.go b/engine/jobmaster/dm/worker_manager.go index a628e77a009..e845ed11f2d 100644 --- a/engine/jobmaster/dm/worker_manager.go +++ b/engine/jobmaster/dm/worker_manager.go @@ -302,6 +302,9 @@ var workerSeqMap = map[string][]frameModel.WorkerType{ dmconfig.ModeDump: { frameModel.WorkerDMDump, }, + dmconfig.ModeLoad: { + frameModel.WorkerDMLoad, + }, dmconfig.ModeLoadSync: { frameModel.WorkerDMLoad, frameModel.WorkerDMSync, From d12fd38d954730e70f87c1224c604a917771f00d Mon Sep 17 00:00:00 2001 From: OliverS929 <182192954+OliverS929@users.noreply.github.com> Date: Wed, 13 Nov 2024 19:23:35 +0800 Subject: [PATCH 17/50] Fix format. --- engine/jobmaster/dm/task_manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/jobmaster/dm/task_manager.go b/engine/jobmaster/dm/task_manager.go index 137b1a13392..e2f1973e3e5 100644 --- a/engine/jobmaster/dm/task_manager.go +++ b/engine/jobmaster/dm/task_manager.go @@ -288,7 +288,7 @@ func (tm *TaskManager) allFinished(ctx context.Context) bool { return false } case dmconfig.ModeDump, dmconfig.ModeLoad, dmconfig.ModeLoadSync: - //passing through, as long as the stage is done + // passing through, as long as the stage is done default: return false } From 5a3e1e9321d92a8ae7f4e7733749d7013a042d62 Mon Sep 17 00:00:00 2001 From: OliverS929 <182192954+OliverS929@users.noreply.github.com> Date: Wed, 13 Nov 2024 20:25:20 +0800 Subject: [PATCH 18/50] Update error.txt --- dm/_utils/terror_gen/errors_release.txt | 2 +- dm/errors.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dm/_utils/terror_gen/errors_release.txt b/dm/_utils/terror_gen/errors_release.txt index f6ad305846a..6e1af7f9907 100644 --- a/dm/_utils/terror_gen/errors_release.txt +++ b/dm/_utils/terror_gen/errors_release.txt @@ -152,7 +152,7 @@ ErrConfigLoaderCfgConflict,[code=20016:class=config:scope=internal:level=medium] ErrConfigSyncerCfgConflict,[code=20017:class=config:scope=internal:level=medium], "Message: syncer-config-name and syncer should only specify one, Workaround: Please check the `syncer-config-name` and `syncer` config in task configuration file." ErrConfigReadCfgFromFile,[code=20018:class=config:scope=internal:level=medium], "Message: read config file %v" ErrConfigNeedUniqueTaskName,[code=20019:class=config:scope=internal:level=medium], "Message: must specify a unique task name, Workaround: Please check the `name` config in task configuration file." -ErrConfigInvalidTaskMode,[code=20020:class=config:scope=internal:level=medium], "Message: please specify right task-mode, support `full`, `incremental`, `all`, Workaround: Please check the `task-mode` config in task configuration file." +ErrConfigInvalidTaskMode,[code=20020:class=config:scope=internal:level=medium], "Message: please specify right task-mode, support `full`, `incremental`, `all`, `dump`, `load`, Workaround: Please check the `task-mode` config in task configuration file." ErrConfigNeedTargetDB,[code=20021:class=config:scope=internal:level=medium], "Message: must specify target-database, Workaround: Please check the `target-database` config in task configuration file." ErrConfigMetadataNotSet,[code=20022:class=config:scope=internal:level=medium], "Message: mysql-instance(%s) must set meta for task-mode %s, Workaround: Please check the `meta` config in task configuration file." ErrConfigRouteRuleNotFound,[code=20023:class=config:scope=internal:level=medium], "Message: mysql-instance(%d)'s route-rules %s not exist in routes, Workaround: Please check the `route-rules` config in task configuration file." diff --git a/dm/errors.toml b/dm/errors.toml index 7f4c65fcf2b..d78d858038e 100644 --- a/dm/errors.toml +++ b/dm/errors.toml @@ -929,7 +929,7 @@ workaround = "Please check the `name` config in task configuration file." tags = ["internal", "medium"] [error.DM-config-20020] -message = "please specify right task-mode, support `full`, `incremental`, `all`" +message = "please specify right task-mode, support `full`, `incremental`, `all`, `dump`, `load`" description = "" workaround = "Please check the `task-mode` config in task configuration file." tags = ["internal", "medium"] From ddd640a776be494c09b336ac62a8a0d2de14418d Mon Sep 17 00:00:00 2001 From: OliverS929 <182192954+OliverS929@users.noreply.github.com> Date: Thu, 14 Nov 2024 20:25:00 +0800 Subject: [PATCH 19/50] Add stand-alone load mode into openapi. Conflict in openapi gen code. regen those later. --- dm/openapi/gen.client.go | 44 ++++++++++++++ dm/openapi/gen.server.go | 120 +++++++++++++++++++-------------------- dm/openapi/gen.types.go | 2 + dm/openapi/spec/dm.yaml | 1 + 4 files changed, 106 insertions(+), 61 deletions(-) diff --git a/dm/openapi/gen.client.go b/dm/openapi/gen.client.go index 6ec5ed95191..30d24e9369f 100644 --- a/dm/openapi/gen.client.go +++ b/dm/openapi/gen.client.go @@ -1211,6 +1211,7 @@ func NewDMAPIGetSourceListRequest(server string, params *DMAPIGetSourceListParam queryValues := queryURL.Query() if params.WithStatus != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "with_status", runtime.ParamLocationQuery, *params.WithStatus); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1222,9 +1223,11 @@ func NewDMAPIGetSourceListRequest(server string, params *DMAPIGetSourceListParam } } } + } if params.EnableRelay != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "enable_relay", runtime.ParamLocationQuery, *params.EnableRelay); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1236,6 +1239,7 @@ func NewDMAPIGetSourceListRequest(server string, params *DMAPIGetSourceListParam } } } + } queryURL.RawQuery = queryValues.Encode() @@ -1317,6 +1321,7 @@ func NewDMAPIDeleteSourceRequest(server string, sourceName string, params *DMAPI queryValues := queryURL.Query() if params.Force != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "force", runtime.ParamLocationQuery, *params.Force); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1328,6 +1333,7 @@ func NewDMAPIDeleteSourceRequest(server string, sourceName string, params *DMAPI } } } + } queryURL.RawQuery = queryValues.Encode() @@ -1369,6 +1375,7 @@ func NewDMAPIGetSourceRequest(server string, sourceName string, params *DMAPIGet queryValues := queryURL.Query() if params.WithStatus != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "with_status", runtime.ParamLocationQuery, *params.WithStatus); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1380,6 +1387,7 @@ func NewDMAPIGetSourceRequest(server string, sourceName string, params *DMAPIGet } } } + } queryURL.RawQuery = queryValues.Encode() @@ -1826,6 +1834,7 @@ func NewDMAPIGetTaskListRequest(server string, params *DMAPIGetTaskListParams) ( queryValues := queryURL.Query() if params.WithStatus != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "with_status", runtime.ParamLocationQuery, *params.WithStatus); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1837,9 +1846,11 @@ func NewDMAPIGetTaskListRequest(server string, params *DMAPIGetTaskListParams) ( } } } + } if params.Stage != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "stage", runtime.ParamLocationQuery, *params.Stage); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1851,9 +1862,11 @@ func NewDMAPIGetTaskListRequest(server string, params *DMAPIGetTaskListParams) ( } } } + } if params.SourceNameList != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "source_name_list", runtime.ParamLocationQuery, *params.SourceNameList); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1865,6 +1878,7 @@ func NewDMAPIGetTaskListRequest(server string, params *DMAPIGetTaskListParams) ( } } } + } queryURL.RawQuery = queryValues.Encode() @@ -2195,6 +2209,7 @@ func NewDMAPIDeleteTaskRequest(server string, taskName string, params *DMAPIDele queryValues := queryURL.Query() if params.Force != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "force", runtime.ParamLocationQuery, *params.Force); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -2206,6 +2221,7 @@ func NewDMAPIDeleteTaskRequest(server string, taskName string, params *DMAPIDele } } } + } queryURL.RawQuery = queryValues.Encode() @@ -2247,6 +2263,7 @@ func NewDMAPIGetTaskRequest(server string, taskName string, params *DMAPIGetTask queryValues := queryURL.Query() if params.WithStatus != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "with_status", runtime.ParamLocationQuery, *params.WithStatus); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -2258,6 +2275,7 @@ func NewDMAPIGetTaskRequest(server string, taskName string, params *DMAPIGetTask } } } + } queryURL.RawQuery = queryValues.Encode() @@ -2353,6 +2371,7 @@ func NewDMAPIGetTaskMigrateTargetsRequest(server string, taskName string, source queryValues := queryURL.Query() if params.SchemaPattern != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "schema_pattern", runtime.ParamLocationQuery, *params.SchemaPattern); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -2364,9 +2383,11 @@ func NewDMAPIGetTaskMigrateTargetsRequest(server string, taskName string, source } } } + } if params.TablePattern != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "table_pattern", runtime.ParamLocationQuery, *params.TablePattern); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -2378,6 +2399,7 @@ func NewDMAPIGetTaskMigrateTargetsRequest(server string, taskName string, source } } } + } queryURL.RawQuery = queryValues.Encode() @@ -2733,6 +2755,7 @@ func NewDMAPIGetTaskStatusRequest(server string, taskName string, params *DMAPIG queryValues := queryURL.Query() if params.SourceNameList != nil { + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "source_name_list", runtime.ParamLocationQuery, *params.SourceNameList); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -2744,6 +2767,7 @@ func NewDMAPIGetTaskStatusRequest(server string, taskName string, params *DMAPIG } } } + } queryURL.RawQuery = queryValues.Encode() @@ -4498,6 +4522,7 @@ func ParseDMAPIGetClusterInfoResponse(rsp *http.Response) (*DMAPIGetClusterInfoR return nil, err } response.JSON200 = &dest + } return response, nil @@ -4523,6 +4548,7 @@ func ParseDMAPIUpdateClusterInfoResponse(rsp *http.Response) (*DMAPIUpdateCluste return nil, err } response.JSON200 = &dest + } return response, nil @@ -4581,6 +4607,7 @@ func ParseDMAPIOfflineMasterNodeResponse(rsp *http.Response) (*DMAPIOfflineMaste return nil, err } response.JSON400 = &dest + } return response, nil @@ -4639,6 +4666,7 @@ func ParseDMAPIOfflineWorkerNodeResponse(rsp *http.Response) (*DMAPIOfflineWorke return nil, err } response.JSON400 = &dest + } return response, nil @@ -4696,6 +4724,7 @@ func ParseDMAPIGetSourceListResponse(rsp *http.Response) (*DMAPIGetSourceListRes return nil, err } response.JSON200 = &dest + } return response, nil @@ -4754,6 +4783,7 @@ func ParseDMAPIDeleteSourceResponse(rsp *http.Response) (*DMAPIDeleteSourceRespo return nil, err } response.JSON400 = &dest + } return response, nil @@ -4779,6 +4809,7 @@ func ParseDMAPIGetSourceResponse(rsp *http.Response) (*DMAPIGetSourceResponse, e return nil, err } response.JSON200 = &dest + } return response, nil @@ -4837,6 +4868,7 @@ func ParseDMAPIDisableSourceResponse(rsp *http.Response) (*DMAPIDisableSourceRes return nil, err } response.JSON400 = &dest + } return response, nil @@ -4862,6 +4894,7 @@ func ParseDMAPIEnableSourceResponse(rsp *http.Response) (*DMAPIEnableSourceRespo return nil, err } response.JSON400 = &dest + } return response, nil @@ -4887,6 +4920,7 @@ func ParseDMAPIDisableRelayResponse(rsp *http.Response) (*DMAPIDisableRelayRespo return nil, err } response.JSON400 = &dest + } return response, nil @@ -4912,6 +4946,7 @@ func ParseDMAPIEnableRelayResponse(rsp *http.Response) (*DMAPIEnableRelayRespons return nil, err } response.JSON400 = &dest + } return response, nil @@ -4937,6 +4972,7 @@ func ParseDMAPIPurgeRelayResponse(rsp *http.Response) (*DMAPIPurgeRelayResponse, return nil, err } response.JSON400 = &dest + } return response, nil @@ -5061,6 +5097,7 @@ func ParseDMAPITransferSourceResponse(rsp *http.Response) (*DMAPITransferSourceR return nil, err } response.JSON400 = &dest + } return response, nil @@ -5284,6 +5321,7 @@ func ParseDMAPIDeleteTaskTemplateResponse(rsp *http.Response) (*DMAPIDeleteTaskT return nil, err } response.JSON400 = &dest + } return response, nil @@ -5375,6 +5413,7 @@ func ParseDMAPIDeleteTaskResponse(rsp *http.Response) (*DMAPIDeleteTaskResponse, return nil, err } response.JSON400 = &dest + } return response, nil @@ -5400,6 +5439,7 @@ func ParseDMAPIGetTaskResponse(rsp *http.Response) (*DMAPIGetTaskResponse, error return nil, err } response.JSON200 = &dest + } return response, nil @@ -5557,6 +5597,7 @@ func ParseDMAPIDeleteTableStructureResponse(rsp *http.Response) (*DMAPIDeleteTab return nil, err } response.JSON400 = &dest + } return response, nil @@ -5615,6 +5656,7 @@ func ParseDMAPIOperateTableStructureResponse(rsp *http.Response) (*DMAPIOperateT return nil, err } response.JSON400 = &dest + } return response, nil @@ -5640,6 +5682,7 @@ func ParseDMAPIStartTaskResponse(rsp *http.Response) (*DMAPIStartTaskResponse, e return nil, err } response.JSON400 = &dest + } return response, nil @@ -5698,6 +5741,7 @@ func ParseDMAPIStopTaskResponse(rsp *http.Response) (*DMAPIStopTaskResponse, err return nil, err } response.JSON400 = &dest + } return response, nil diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index 5b130c5ab65..30eddb48369 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -161,6 +161,7 @@ type MiddlewareFunc func(c *gin.Context) // DMAPIGetClusterInfo operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetClusterInfo(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -170,6 +171,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetClusterInfo(c *gin.Context) { // DMAPIUpdateClusterInfo operation middleware func (siw *ServerInterfaceWrapper) DMAPIUpdateClusterInfo(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -179,6 +181,7 @@ func (siw *ServerInterfaceWrapper) DMAPIUpdateClusterInfo(c *gin.Context) { // DMAPIGetClusterMasterList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetClusterMasterList(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -188,6 +191,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetClusterMasterList(c *gin.Context) { // DMAPIOfflineMasterNode operation middleware func (siw *ServerInterfaceWrapper) DMAPIOfflineMasterNode(c *gin.Context) { + var err error // ------------- Path parameter "master-name" ------------- @@ -208,6 +212,7 @@ func (siw *ServerInterfaceWrapper) DMAPIOfflineMasterNode(c *gin.Context) { // DMAPIGetClusterWorkerList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetClusterWorkerList(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -217,6 +222,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetClusterWorkerList(c *gin.Context) { // DMAPIOfflineWorkerNode operation middleware func (siw *ServerInterfaceWrapper) DMAPIOfflineWorkerNode(c *gin.Context) { + var err error // ------------- Path parameter "worker-name" ------------- @@ -237,6 +243,7 @@ func (siw *ServerInterfaceWrapper) DMAPIOfflineWorkerNode(c *gin.Context) { // GetDocJSON operation middleware func (siw *ServerInterfaceWrapper) GetDocJSON(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -246,6 +253,7 @@ func (siw *ServerInterfaceWrapper) GetDocJSON(c *gin.Context) { // GetDocHTML operation middleware func (siw *ServerInterfaceWrapper) GetDocHTML(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -255,6 +263,7 @@ func (siw *ServerInterfaceWrapper) GetDocHTML(c *gin.Context) { // DMAPIGetSourceList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSourceList(c *gin.Context) { + var err error // Parameter object where we will unmarshal all parameters from the context @@ -262,6 +271,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceList(c *gin.Context) { // ------------- Optional query parameter "with_status" ------------- if paramValue := c.Query("with_status"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "with_status", c.Request.URL.Query(), ¶ms.WithStatus) @@ -272,6 +282,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceList(c *gin.Context) { // ------------- Optional query parameter "enable_relay" ------------- if paramValue := c.Query("enable_relay"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "enable_relay", c.Request.URL.Query(), ¶ms.EnableRelay) @@ -289,6 +300,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceList(c *gin.Context) { // DMAPICreateSource operation middleware func (siw *ServerInterfaceWrapper) DMAPICreateSource(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -298,6 +310,7 @@ func (siw *ServerInterfaceWrapper) DMAPICreateSource(c *gin.Context) { // DMAPIDeleteSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIDeleteSource(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -314,6 +327,7 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteSource(c *gin.Context) { // ------------- Optional query parameter "force" ------------- if paramValue := c.Query("force"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "force", c.Request.URL.Query(), ¶ms.Force) @@ -331,6 +345,7 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteSource(c *gin.Context) { // DMAPIGetSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSource(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -347,6 +362,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSource(c *gin.Context) { // ------------- Optional query parameter "with_status" ------------- if paramValue := c.Query("with_status"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "with_status", c.Request.URL.Query(), ¶ms.WithStatus) @@ -364,6 +380,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSource(c *gin.Context) { // DMAPIUpdateSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIUpdateSource(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -384,6 +401,7 @@ func (siw *ServerInterfaceWrapper) DMAPIUpdateSource(c *gin.Context) { // DMAPIDisableSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIDisableSource(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -404,6 +422,7 @@ func (siw *ServerInterfaceWrapper) DMAPIDisableSource(c *gin.Context) { // DMAPIEnableSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIEnableSource(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -424,6 +443,7 @@ func (siw *ServerInterfaceWrapper) DMAPIEnableSource(c *gin.Context) { // DMAPIDisableRelay operation middleware func (siw *ServerInterfaceWrapper) DMAPIDisableRelay(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -444,6 +464,7 @@ func (siw *ServerInterfaceWrapper) DMAPIDisableRelay(c *gin.Context) { // DMAPIEnableRelay operation middleware func (siw *ServerInterfaceWrapper) DMAPIEnableRelay(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -464,6 +485,7 @@ func (siw *ServerInterfaceWrapper) DMAPIEnableRelay(c *gin.Context) { // DMAPIPurgeRelay operation middleware func (siw *ServerInterfaceWrapper) DMAPIPurgeRelay(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -484,6 +506,7 @@ func (siw *ServerInterfaceWrapper) DMAPIPurgeRelay(c *gin.Context) { // DMAPIGetSourceSchemaList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSourceSchemaList(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -504,6 +527,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceSchemaList(c *gin.Context) { // DMAPIGetSourceTableList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSourceTableList(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -533,6 +557,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceTableList(c *gin.Context) { // DMAPIGetSourceStatus operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSourceStatus(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -553,6 +578,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceStatus(c *gin.Context) { // DMAPITransferSource operation middleware func (siw *ServerInterfaceWrapper) DMAPITransferSource(c *gin.Context) { + var err error // ------------- Path parameter "source-name" ------------- @@ -573,6 +599,7 @@ func (siw *ServerInterfaceWrapper) DMAPITransferSource(c *gin.Context) { // DMAPIGetTaskList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTaskList(c *gin.Context) { + var err error // Parameter object where we will unmarshal all parameters from the context @@ -580,6 +607,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskList(c *gin.Context) { // ------------- Optional query parameter "with_status" ------------- if paramValue := c.Query("with_status"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "with_status", c.Request.URL.Query(), ¶ms.WithStatus) @@ -590,6 +618,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskList(c *gin.Context) { // ------------- Optional query parameter "stage" ------------- if paramValue := c.Query("stage"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "stage", c.Request.URL.Query(), ¶ms.Stage) @@ -600,6 +629,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskList(c *gin.Context) { // ------------- Optional query parameter "source_name_list" ------------- if paramValue := c.Query("source_name_list"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "source_name_list", c.Request.URL.Query(), ¶ms.SourceNameList) @@ -617,6 +647,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskList(c *gin.Context) { // DMAPICreateTask operation middleware func (siw *ServerInterfaceWrapper) DMAPICreateTask(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -626,6 +657,7 @@ func (siw *ServerInterfaceWrapper) DMAPICreateTask(c *gin.Context) { // DMAPIConvertTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIConvertTask(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -635,6 +667,7 @@ func (siw *ServerInterfaceWrapper) DMAPIConvertTask(c *gin.Context) { // DMAPIGetTaskTemplateList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTaskTemplateList(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -644,6 +677,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskTemplateList(c *gin.Context) { // DMAPICreateTaskTemplate operation middleware func (siw *ServerInterfaceWrapper) DMAPICreateTaskTemplate(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -653,6 +687,7 @@ func (siw *ServerInterfaceWrapper) DMAPICreateTaskTemplate(c *gin.Context) { // DMAPIImportTaskTemplate operation middleware func (siw *ServerInterfaceWrapper) DMAPIImportTaskTemplate(c *gin.Context) { + for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -662,6 +697,7 @@ func (siw *ServerInterfaceWrapper) DMAPIImportTaskTemplate(c *gin.Context) { // DMAPIDeleteTaskTemplate operation middleware func (siw *ServerInterfaceWrapper) DMAPIDeleteTaskTemplate(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -682,6 +718,7 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteTaskTemplate(c *gin.Context) { // DMAPIGetTaskTemplate operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTaskTemplate(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -702,6 +739,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskTemplate(c *gin.Context) { // DMAPUpdateTaskTemplate operation middleware func (siw *ServerInterfaceWrapper) DMAPUpdateTaskTemplate(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -722,6 +760,7 @@ func (siw *ServerInterfaceWrapper) DMAPUpdateTaskTemplate(c *gin.Context) { // DMAPIDeleteTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIDeleteTask(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -738,6 +777,7 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteTask(c *gin.Context) { // ------------- Optional query parameter "force" ------------- if paramValue := c.Query("force"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "force", c.Request.URL.Query(), ¶ms.Force) @@ -755,6 +795,7 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteTask(c *gin.Context) { // DMAPIGetTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTask(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -771,6 +812,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTask(c *gin.Context) { // ------------- Optional query parameter "with_status" ------------- if paramValue := c.Query("with_status"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "with_status", c.Request.URL.Query(), ¶ms.WithStatus) @@ -788,6 +830,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTask(c *gin.Context) { // DMAPIUpdateTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIUpdateTask(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -808,6 +851,7 @@ func (siw *ServerInterfaceWrapper) DMAPIUpdateTask(c *gin.Context) { // DMAPIGetTaskMigrateTargets operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTaskMigrateTargets(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -833,6 +877,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskMigrateTargets(c *gin.Context) { // ------------- Optional query parameter "schema_pattern" ------------- if paramValue := c.Query("schema_pattern"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "schema_pattern", c.Request.URL.Query(), ¶ms.SchemaPattern) @@ -843,6 +888,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskMigrateTargets(c *gin.Context) { // ------------- Optional query parameter "table_pattern" ------------- if paramValue := c.Query("table_pattern"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "table_pattern", c.Request.URL.Query(), ¶ms.TablePattern) @@ -860,6 +906,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskMigrateTargets(c *gin.Context) { // DMAPIGetSchemaListByTaskAndSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSchemaListByTaskAndSource(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -889,6 +936,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSchemaListByTaskAndSource(c *gin.Cont // DMAPIGetTableListByTaskAndSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTableListByTaskAndSource(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -927,6 +975,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTableListByTaskAndSource(c *gin.Conte // DMAPIDeleteTableStructure operation middleware func (siw *ServerInterfaceWrapper) DMAPIDeleteTableStructure(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -974,6 +1023,7 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteTableStructure(c *gin.Context) { // DMAPIGetTableStructure operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTableStructure(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -1021,6 +1071,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTableStructure(c *gin.Context) { // DMAPIOperateTableStructure operation middleware func (siw *ServerInterfaceWrapper) DMAPIOperateTableStructure(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -1068,6 +1119,7 @@ func (siw *ServerInterfaceWrapper) DMAPIOperateTableStructure(c *gin.Context) { // DMAPIStartTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIStartTask(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -1088,6 +1140,7 @@ func (siw *ServerInterfaceWrapper) DMAPIStartTask(c *gin.Context) { // DMAPIGetTaskStatus operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTaskStatus(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -1104,6 +1157,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskStatus(c *gin.Context) { // ------------- Optional query parameter "source_name_list" ------------- if paramValue := c.Query("source_name_list"); paramValue != "" { + } err = runtime.BindQueryParameter("form", true, false, "source_name_list", c.Request.URL.Query(), ¶ms.SourceNameList) @@ -1121,6 +1175,7 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskStatus(c *gin.Context) { // DMAPIStopTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIStopTask(c *gin.Context) { + var err error // ------------- Path parameter "task-name" ------------- @@ -1248,6 +1303,7 @@ func RegisterHandlersWithOptions(router *gin.Engine, si ServerInterface, options // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ + "H4sIAAAAAAAC/+x9bXPbOJLwX8Gj5z7sTEmWZDtO4qv9kMSerO+cl4o9tbe1lWMgEpSwJgEGAO3Rpvzf", "r/BCEiQBkrItx5pkP+w4Igh0N/odjea3UUjTjBJEBB8dfxvxcIVSqP58lSAm3kECl4hd0owmdLmWv2eM", "ZogJjNSoFeVC/hf9AdMsQaPj0Xz/+d5sb7Y3H41HYp3Jn7hgmCxHt+NRRll9+MvZy4NyHCYCLREb3d6O", @@ -1298,64 +1354,6 @@ var swaggerSpec = []string{ "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", } // GetSwagger returns the content of the embedded swagger specification file @@ -1390,7 +1388,7 @@ func decodeSpecCached() func() ([]byte, error) { // Constructs a synthetic filesystem for resolving external references when loading openapi specifications. func PathToRawSpec(pathToFile string) map[string]func() ([]byte, error) { - res := make(map[string]func() ([]byte, error)) + var res = make(map[string]func() ([]byte, error)) if len(pathToFile) > 0 { res[pathToFile] = rawSpec } @@ -1404,12 +1402,12 @@ func PathToRawSpec(pathToFile string) map[string]func() ([]byte, error) { // Externally referenced files must be embedded in the corresponding golang packages. // Urls can be supported but this task was out of the scope. func GetSwagger() (swagger *openapi3.T, err error) { - resolvePath := PathToRawSpec("") + var resolvePath = PathToRawSpec("") loader := openapi3.NewLoader() loader.IsExternalRefsAllowed = true loader.ReadFromURIFunc = func(loader *openapi3.Loader, url *url.URL) ([]byte, error) { - pathToFile := url.String() + var pathToFile = url.String() pathToFile = path.Clean(pathToFile) getSpec, ok := resolvePath[pathToFile] if !ok { diff --git a/dm/openapi/gen.types.go b/dm/openapi/gen.types.go index c54a75b2a83..b1e8ec319cd 100644 --- a/dm/openapi/gen.types.go +++ b/dm/openapi/gen.types.go @@ -33,6 +33,8 @@ const ( TaskTaskModeFull TaskTaskMode = "full" TaskTaskModeIncremental TaskTaskMode = "incremental" + + TaskTaskModeLoad TaskTaskMode = "load" ) // Defines values for TaskFullMigrateConfAnalyze. diff --git a/dm/openapi/spec/dm.yaml b/dm/openapi/spec/dm.yaml index 525698f563a..eed97b0f984 100644 --- a/dm/openapi/spec/dm.yaml +++ b/dm/openapi/spec/dm.yaml @@ -1834,6 +1834,7 @@ components: - "incremental" - "all" - "dump" + - "load" shard_mode: type: string description: the way to coordinate DDL From 442b867858acf3105d4b3c453b58e4a625a06012 Mon Sep 17 00:00:00 2001 From: OliverS929 <182192954+OliverS929@users.noreply.github.com> Date: Thu, 14 Nov 2024 20:51:13 +0800 Subject: [PATCH 20/50] Rewrite load testing based on what we have already with dump. --- dm/tests/openapi/client/openapi_task_check | 52 +++++++++++++++++ dm/tests/openapi/run.sh | 67 ++++++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index 3fbf9a67249..6b2650980d8 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -4,6 +4,7 @@ import sys import requests SHARD_TASK_NAME = "test-shard" +LOAD_TASK_NAME = "test-load" ILLEGAL_CHAR_TASK_NAME = "t-Ë!s`t" SOURCE1_NAME = "mysql-01" SOURCE2_NAME = "mysql-02" @@ -308,6 +309,56 @@ def create_dump_task_success(): print("create_dump_task_success resp=", resp.json()) assert resp.status_code == 201 +def create_load_task_success(): + task = { + "name": LOAD_TASK_NAME, + "task_mode": "load", + "meta_schema": "dm-meta", + "enhance_online_schema_change": True, + "on_duplicate": "error", + "target_config": { + "host": "127.0.0.1", + "port": 4000, + "user": "root", + "password": "", + }, + "table_migrate_rule": [ + { + "source": { + "source_name": SOURCE1_NAME, + "schema": "openapi", + "table": "*", + }, + "target": {"schema": "openapi", "table": "t"}, + "binlog_filter_rule": ["rule-1"], + }, + { + "source": { + "source_name": SOURCE2_NAME, + "schema": "openapi", + "table": "*", + }, + "target": {"schema": "openapi", "table": "t"}, + "binlog_filter_rule": ["rule-2"], + }, + ], + "source_config": { + "full_migrate_conf": { + "export_threads": 4, + "import_threads": 16, + "data_dir": "./exported_data", + "consistency": "auto", + }, + "source_conf": [ + {"source_name": SOURCE1_NAME}, + {"source_name": SOURCE2_NAME}, + ], + }, + } + resp = requests.post(url=API_ENDPOINT, json={"task": task}) + print("create_shard_task_success resp=", resp.json()) + assert resp.status_code == 201 + def start_task_success(task_name, source_name): url = API_ENDPOINT + "/" + task_name + "/start" req = {} @@ -743,6 +794,7 @@ if __name__ == "__main__": "create_noshard_task_success": create_noshard_task_success, "create_shard_task_success": create_shard_task_success, "create_dump_task_success": create_dump_task_success, + "create_load_task_success": create_load_task_success, "create_incremental_task_with_gtid_success": create_incremental_task_with_gtid_success, "delete_task_failed": delete_task_failed, "delete_task_success": delete_task_success, diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index aceae7c16b2..5d7352f4769 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -228,6 +228,72 @@ function test_dump_task() { } +function test_load_task() { + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: dump & load TASK" + prepare_database + + task_name_dump="test-dump" + task_name_load="test-load" + + # create source successfully + openapi_source_check "create_source1_success" + # get source list success + openapi_source_check "list_source_success" 1 + + # create source successfully + openapi_source_check "create_source2_success" + # get source list success + openapi_source_check "list_source_success" 2 + + # get source status success + openapi_source_check "get_source_status_success" "mysql-01" + + # create task success: not valid task create request + openapi_task_check "create_task_failed" + + # create dump task success + openapi_task_check "create_dump_task_success" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_dump" \ + "\"stage\": \"Stopped\"" 1 + + init_dump_data + + # start dump task success + openapi_task_check "start_task_success" $task_name_dump "" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_dump" \ + "\"stage\": \"Running\"" 1 + + # wait dump task finish + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_dump" 100 \ + "\"stage\": \"Finished\"" 1 + + # create load task success + openapi_task_check "create_load_task_success" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_load" \ + "\"stage\": \"Stopped\"" 1 + + # use the data from the same dir of dump task + + # start load task success + openapi_task_check "start_task_success" $task_name_load "" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_load" \ + "\"stage\": \"Running\"" 1 + + # wait load task finish + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name_load" 100 \ + "\"stage\": \"Finished\"" 1 + + clean_cluster_sources_and_tasks + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TEST OPENAPI: dump & load TASK" + +} + function test_shard_task() { echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: SHARD TASK" prepare_database @@ -1093,6 +1159,7 @@ function run() { test_multi_tasks test_noshard_task test_dump_task + test_load_task test_task_templates test_noshard_task_dump_status test_complex_operations_of_source_and_task From 1f5ca3f025101326d59261c0851799d51d781343 Mon Sep 17 00:00:00 2001 From: OliverS929 <182192954+OliverS929@users.noreply.github.com> Date: Thu, 14 Nov 2024 21:04:25 +0800 Subject: [PATCH 21/50] Fix fmt issue with gen.go's. --- dm/openapi/gen.client.go | 44 ---------------------------- dm/openapi/gen.server.go | 62 ++-------------------------------------- 2 files changed, 3 insertions(+), 103 deletions(-) diff --git a/dm/openapi/gen.client.go b/dm/openapi/gen.client.go index 30d24e9369f..6ec5ed95191 100644 --- a/dm/openapi/gen.client.go +++ b/dm/openapi/gen.client.go @@ -1211,7 +1211,6 @@ func NewDMAPIGetSourceListRequest(server string, params *DMAPIGetSourceListParam queryValues := queryURL.Query() if params.WithStatus != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "with_status", runtime.ParamLocationQuery, *params.WithStatus); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1223,11 +1222,9 @@ func NewDMAPIGetSourceListRequest(server string, params *DMAPIGetSourceListParam } } } - } if params.EnableRelay != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "enable_relay", runtime.ParamLocationQuery, *params.EnableRelay); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1239,7 +1236,6 @@ func NewDMAPIGetSourceListRequest(server string, params *DMAPIGetSourceListParam } } } - } queryURL.RawQuery = queryValues.Encode() @@ -1321,7 +1317,6 @@ func NewDMAPIDeleteSourceRequest(server string, sourceName string, params *DMAPI queryValues := queryURL.Query() if params.Force != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "force", runtime.ParamLocationQuery, *params.Force); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1333,7 +1328,6 @@ func NewDMAPIDeleteSourceRequest(server string, sourceName string, params *DMAPI } } } - } queryURL.RawQuery = queryValues.Encode() @@ -1375,7 +1369,6 @@ func NewDMAPIGetSourceRequest(server string, sourceName string, params *DMAPIGet queryValues := queryURL.Query() if params.WithStatus != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "with_status", runtime.ParamLocationQuery, *params.WithStatus); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1387,7 +1380,6 @@ func NewDMAPIGetSourceRequest(server string, sourceName string, params *DMAPIGet } } } - } queryURL.RawQuery = queryValues.Encode() @@ -1834,7 +1826,6 @@ func NewDMAPIGetTaskListRequest(server string, params *DMAPIGetTaskListParams) ( queryValues := queryURL.Query() if params.WithStatus != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "with_status", runtime.ParamLocationQuery, *params.WithStatus); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1846,11 +1837,9 @@ func NewDMAPIGetTaskListRequest(server string, params *DMAPIGetTaskListParams) ( } } } - } if params.Stage != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "stage", runtime.ParamLocationQuery, *params.Stage); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1862,11 +1851,9 @@ func NewDMAPIGetTaskListRequest(server string, params *DMAPIGetTaskListParams) ( } } } - } if params.SourceNameList != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "source_name_list", runtime.ParamLocationQuery, *params.SourceNameList); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -1878,7 +1865,6 @@ func NewDMAPIGetTaskListRequest(server string, params *DMAPIGetTaskListParams) ( } } } - } queryURL.RawQuery = queryValues.Encode() @@ -2209,7 +2195,6 @@ func NewDMAPIDeleteTaskRequest(server string, taskName string, params *DMAPIDele queryValues := queryURL.Query() if params.Force != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "force", runtime.ParamLocationQuery, *params.Force); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -2221,7 +2206,6 @@ func NewDMAPIDeleteTaskRequest(server string, taskName string, params *DMAPIDele } } } - } queryURL.RawQuery = queryValues.Encode() @@ -2263,7 +2247,6 @@ func NewDMAPIGetTaskRequest(server string, taskName string, params *DMAPIGetTask queryValues := queryURL.Query() if params.WithStatus != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "with_status", runtime.ParamLocationQuery, *params.WithStatus); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -2275,7 +2258,6 @@ func NewDMAPIGetTaskRequest(server string, taskName string, params *DMAPIGetTask } } } - } queryURL.RawQuery = queryValues.Encode() @@ -2371,7 +2353,6 @@ func NewDMAPIGetTaskMigrateTargetsRequest(server string, taskName string, source queryValues := queryURL.Query() if params.SchemaPattern != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "schema_pattern", runtime.ParamLocationQuery, *params.SchemaPattern); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -2383,11 +2364,9 @@ func NewDMAPIGetTaskMigrateTargetsRequest(server string, taskName string, source } } } - } if params.TablePattern != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "table_pattern", runtime.ParamLocationQuery, *params.TablePattern); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -2399,7 +2378,6 @@ func NewDMAPIGetTaskMigrateTargetsRequest(server string, taskName string, source } } } - } queryURL.RawQuery = queryValues.Encode() @@ -2755,7 +2733,6 @@ func NewDMAPIGetTaskStatusRequest(server string, taskName string, params *DMAPIG queryValues := queryURL.Query() if params.SourceNameList != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "source_name_list", runtime.ParamLocationQuery, *params.SourceNameList); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { @@ -2767,7 +2744,6 @@ func NewDMAPIGetTaskStatusRequest(server string, taskName string, params *DMAPIG } } } - } queryURL.RawQuery = queryValues.Encode() @@ -4522,7 +4498,6 @@ func ParseDMAPIGetClusterInfoResponse(rsp *http.Response) (*DMAPIGetClusterInfoR return nil, err } response.JSON200 = &dest - } return response, nil @@ -4548,7 +4523,6 @@ func ParseDMAPIUpdateClusterInfoResponse(rsp *http.Response) (*DMAPIUpdateCluste return nil, err } response.JSON200 = &dest - } return response, nil @@ -4607,7 +4581,6 @@ func ParseDMAPIOfflineMasterNodeResponse(rsp *http.Response) (*DMAPIOfflineMaste return nil, err } response.JSON400 = &dest - } return response, nil @@ -4666,7 +4639,6 @@ func ParseDMAPIOfflineWorkerNodeResponse(rsp *http.Response) (*DMAPIOfflineWorke return nil, err } response.JSON400 = &dest - } return response, nil @@ -4724,7 +4696,6 @@ func ParseDMAPIGetSourceListResponse(rsp *http.Response) (*DMAPIGetSourceListRes return nil, err } response.JSON200 = &dest - } return response, nil @@ -4783,7 +4754,6 @@ func ParseDMAPIDeleteSourceResponse(rsp *http.Response) (*DMAPIDeleteSourceRespo return nil, err } response.JSON400 = &dest - } return response, nil @@ -4809,7 +4779,6 @@ func ParseDMAPIGetSourceResponse(rsp *http.Response) (*DMAPIGetSourceResponse, e return nil, err } response.JSON200 = &dest - } return response, nil @@ -4868,7 +4837,6 @@ func ParseDMAPIDisableSourceResponse(rsp *http.Response) (*DMAPIDisableSourceRes return nil, err } response.JSON400 = &dest - } return response, nil @@ -4894,7 +4862,6 @@ func ParseDMAPIEnableSourceResponse(rsp *http.Response) (*DMAPIEnableSourceRespo return nil, err } response.JSON400 = &dest - } return response, nil @@ -4920,7 +4887,6 @@ func ParseDMAPIDisableRelayResponse(rsp *http.Response) (*DMAPIDisableRelayRespo return nil, err } response.JSON400 = &dest - } return response, nil @@ -4946,7 +4912,6 @@ func ParseDMAPIEnableRelayResponse(rsp *http.Response) (*DMAPIEnableRelayRespons return nil, err } response.JSON400 = &dest - } return response, nil @@ -4972,7 +4937,6 @@ func ParseDMAPIPurgeRelayResponse(rsp *http.Response) (*DMAPIPurgeRelayResponse, return nil, err } response.JSON400 = &dest - } return response, nil @@ -5097,7 +5061,6 @@ func ParseDMAPITransferSourceResponse(rsp *http.Response) (*DMAPITransferSourceR return nil, err } response.JSON400 = &dest - } return response, nil @@ -5321,7 +5284,6 @@ func ParseDMAPIDeleteTaskTemplateResponse(rsp *http.Response) (*DMAPIDeleteTaskT return nil, err } response.JSON400 = &dest - } return response, nil @@ -5413,7 +5375,6 @@ func ParseDMAPIDeleteTaskResponse(rsp *http.Response) (*DMAPIDeleteTaskResponse, return nil, err } response.JSON400 = &dest - } return response, nil @@ -5439,7 +5400,6 @@ func ParseDMAPIGetTaskResponse(rsp *http.Response) (*DMAPIGetTaskResponse, error return nil, err } response.JSON200 = &dest - } return response, nil @@ -5597,7 +5557,6 @@ func ParseDMAPIDeleteTableStructureResponse(rsp *http.Response) (*DMAPIDeleteTab return nil, err } response.JSON400 = &dest - } return response, nil @@ -5656,7 +5615,6 @@ func ParseDMAPIOperateTableStructureResponse(rsp *http.Response) (*DMAPIOperateT return nil, err } response.JSON400 = &dest - } return response, nil @@ -5682,7 +5640,6 @@ func ParseDMAPIStartTaskResponse(rsp *http.Response) (*DMAPIStartTaskResponse, e return nil, err } response.JSON400 = &dest - } return response, nil @@ -5741,7 +5698,6 @@ func ParseDMAPIStopTaskResponse(rsp *http.Response) (*DMAPIStopTaskResponse, err return nil, err } response.JSON400 = &dest - } return response, nil diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index 30eddb48369..9d3b8e9c841 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -161,7 +161,6 @@ type MiddlewareFunc func(c *gin.Context) // DMAPIGetClusterInfo operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetClusterInfo(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -171,7 +170,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetClusterInfo(c *gin.Context) { // DMAPIUpdateClusterInfo operation middleware func (siw *ServerInterfaceWrapper) DMAPIUpdateClusterInfo(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -181,7 +179,6 @@ func (siw *ServerInterfaceWrapper) DMAPIUpdateClusterInfo(c *gin.Context) { // DMAPIGetClusterMasterList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetClusterMasterList(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -191,7 +188,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetClusterMasterList(c *gin.Context) { // DMAPIOfflineMasterNode operation middleware func (siw *ServerInterfaceWrapper) DMAPIOfflineMasterNode(c *gin.Context) { - var err error // ------------- Path parameter "master-name" ------------- @@ -212,7 +208,6 @@ func (siw *ServerInterfaceWrapper) DMAPIOfflineMasterNode(c *gin.Context) { // DMAPIGetClusterWorkerList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetClusterWorkerList(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -222,7 +217,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetClusterWorkerList(c *gin.Context) { // DMAPIOfflineWorkerNode operation middleware func (siw *ServerInterfaceWrapper) DMAPIOfflineWorkerNode(c *gin.Context) { - var err error // ------------- Path parameter "worker-name" ------------- @@ -243,7 +237,6 @@ func (siw *ServerInterfaceWrapper) DMAPIOfflineWorkerNode(c *gin.Context) { // GetDocJSON operation middleware func (siw *ServerInterfaceWrapper) GetDocJSON(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -253,7 +246,6 @@ func (siw *ServerInterfaceWrapper) GetDocJSON(c *gin.Context) { // GetDocHTML operation middleware func (siw *ServerInterfaceWrapper) GetDocHTML(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -263,7 +255,6 @@ func (siw *ServerInterfaceWrapper) GetDocHTML(c *gin.Context) { // DMAPIGetSourceList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSourceList(c *gin.Context) { - var err error // Parameter object where we will unmarshal all parameters from the context @@ -271,7 +262,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceList(c *gin.Context) { // ------------- Optional query parameter "with_status" ------------- if paramValue := c.Query("with_status"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "with_status", c.Request.URL.Query(), ¶ms.WithStatus) @@ -282,7 +272,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceList(c *gin.Context) { // ------------- Optional query parameter "enable_relay" ------------- if paramValue := c.Query("enable_relay"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "enable_relay", c.Request.URL.Query(), ¶ms.EnableRelay) @@ -300,7 +289,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceList(c *gin.Context) { // DMAPICreateSource operation middleware func (siw *ServerInterfaceWrapper) DMAPICreateSource(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -310,7 +298,6 @@ func (siw *ServerInterfaceWrapper) DMAPICreateSource(c *gin.Context) { // DMAPIDeleteSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIDeleteSource(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -327,7 +314,6 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteSource(c *gin.Context) { // ------------- Optional query parameter "force" ------------- if paramValue := c.Query("force"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "force", c.Request.URL.Query(), ¶ms.Force) @@ -345,7 +331,6 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteSource(c *gin.Context) { // DMAPIGetSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSource(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -362,7 +347,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSource(c *gin.Context) { // ------------- Optional query parameter "with_status" ------------- if paramValue := c.Query("with_status"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "with_status", c.Request.URL.Query(), ¶ms.WithStatus) @@ -380,7 +364,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSource(c *gin.Context) { // DMAPIUpdateSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIUpdateSource(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -401,7 +384,6 @@ func (siw *ServerInterfaceWrapper) DMAPIUpdateSource(c *gin.Context) { // DMAPIDisableSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIDisableSource(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -422,7 +404,6 @@ func (siw *ServerInterfaceWrapper) DMAPIDisableSource(c *gin.Context) { // DMAPIEnableSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIEnableSource(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -443,7 +424,6 @@ func (siw *ServerInterfaceWrapper) DMAPIEnableSource(c *gin.Context) { // DMAPIDisableRelay operation middleware func (siw *ServerInterfaceWrapper) DMAPIDisableRelay(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -464,7 +444,6 @@ func (siw *ServerInterfaceWrapper) DMAPIDisableRelay(c *gin.Context) { // DMAPIEnableRelay operation middleware func (siw *ServerInterfaceWrapper) DMAPIEnableRelay(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -485,7 +464,6 @@ func (siw *ServerInterfaceWrapper) DMAPIEnableRelay(c *gin.Context) { // DMAPIPurgeRelay operation middleware func (siw *ServerInterfaceWrapper) DMAPIPurgeRelay(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -506,7 +484,6 @@ func (siw *ServerInterfaceWrapper) DMAPIPurgeRelay(c *gin.Context) { // DMAPIGetSourceSchemaList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSourceSchemaList(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -527,7 +504,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceSchemaList(c *gin.Context) { // DMAPIGetSourceTableList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSourceTableList(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -557,7 +533,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceTableList(c *gin.Context) { // DMAPIGetSourceStatus operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSourceStatus(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -578,7 +553,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSourceStatus(c *gin.Context) { // DMAPITransferSource operation middleware func (siw *ServerInterfaceWrapper) DMAPITransferSource(c *gin.Context) { - var err error // ------------- Path parameter "source-name" ------------- @@ -599,7 +573,6 @@ func (siw *ServerInterfaceWrapper) DMAPITransferSource(c *gin.Context) { // DMAPIGetTaskList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTaskList(c *gin.Context) { - var err error // Parameter object where we will unmarshal all parameters from the context @@ -607,7 +580,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskList(c *gin.Context) { // ------------- Optional query parameter "with_status" ------------- if paramValue := c.Query("with_status"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "with_status", c.Request.URL.Query(), ¶ms.WithStatus) @@ -618,7 +590,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskList(c *gin.Context) { // ------------- Optional query parameter "stage" ------------- if paramValue := c.Query("stage"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "stage", c.Request.URL.Query(), ¶ms.Stage) @@ -629,7 +600,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskList(c *gin.Context) { // ------------- Optional query parameter "source_name_list" ------------- if paramValue := c.Query("source_name_list"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "source_name_list", c.Request.URL.Query(), ¶ms.SourceNameList) @@ -647,7 +617,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskList(c *gin.Context) { // DMAPICreateTask operation middleware func (siw *ServerInterfaceWrapper) DMAPICreateTask(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -657,7 +626,6 @@ func (siw *ServerInterfaceWrapper) DMAPICreateTask(c *gin.Context) { // DMAPIConvertTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIConvertTask(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -667,7 +635,6 @@ func (siw *ServerInterfaceWrapper) DMAPIConvertTask(c *gin.Context) { // DMAPIGetTaskTemplateList operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTaskTemplateList(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -677,7 +644,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskTemplateList(c *gin.Context) { // DMAPICreateTaskTemplate operation middleware func (siw *ServerInterfaceWrapper) DMAPICreateTaskTemplate(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -687,7 +653,6 @@ func (siw *ServerInterfaceWrapper) DMAPICreateTaskTemplate(c *gin.Context) { // DMAPIImportTaskTemplate operation middleware func (siw *ServerInterfaceWrapper) DMAPIImportTaskTemplate(c *gin.Context) { - for _, middleware := range siw.HandlerMiddlewares { middleware(c) } @@ -697,7 +662,6 @@ func (siw *ServerInterfaceWrapper) DMAPIImportTaskTemplate(c *gin.Context) { // DMAPIDeleteTaskTemplate operation middleware func (siw *ServerInterfaceWrapper) DMAPIDeleteTaskTemplate(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -718,7 +682,6 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteTaskTemplate(c *gin.Context) { // DMAPIGetTaskTemplate operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTaskTemplate(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -739,7 +702,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskTemplate(c *gin.Context) { // DMAPUpdateTaskTemplate operation middleware func (siw *ServerInterfaceWrapper) DMAPUpdateTaskTemplate(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -760,7 +722,6 @@ func (siw *ServerInterfaceWrapper) DMAPUpdateTaskTemplate(c *gin.Context) { // DMAPIDeleteTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIDeleteTask(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -777,7 +738,6 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteTask(c *gin.Context) { // ------------- Optional query parameter "force" ------------- if paramValue := c.Query("force"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "force", c.Request.URL.Query(), ¶ms.Force) @@ -795,7 +755,6 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteTask(c *gin.Context) { // DMAPIGetTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTask(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -812,7 +771,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTask(c *gin.Context) { // ------------- Optional query parameter "with_status" ------------- if paramValue := c.Query("with_status"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "with_status", c.Request.URL.Query(), ¶ms.WithStatus) @@ -830,7 +788,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTask(c *gin.Context) { // DMAPIUpdateTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIUpdateTask(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -851,7 +808,6 @@ func (siw *ServerInterfaceWrapper) DMAPIUpdateTask(c *gin.Context) { // DMAPIGetTaskMigrateTargets operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTaskMigrateTargets(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -877,7 +833,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskMigrateTargets(c *gin.Context) { // ------------- Optional query parameter "schema_pattern" ------------- if paramValue := c.Query("schema_pattern"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "schema_pattern", c.Request.URL.Query(), ¶ms.SchemaPattern) @@ -888,7 +843,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskMigrateTargets(c *gin.Context) { // ------------- Optional query parameter "table_pattern" ------------- if paramValue := c.Query("table_pattern"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "table_pattern", c.Request.URL.Query(), ¶ms.TablePattern) @@ -906,7 +860,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskMigrateTargets(c *gin.Context) { // DMAPIGetSchemaListByTaskAndSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetSchemaListByTaskAndSource(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -936,7 +889,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetSchemaListByTaskAndSource(c *gin.Cont // DMAPIGetTableListByTaskAndSource operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTableListByTaskAndSource(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -975,7 +927,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTableListByTaskAndSource(c *gin.Conte // DMAPIDeleteTableStructure operation middleware func (siw *ServerInterfaceWrapper) DMAPIDeleteTableStructure(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -1023,7 +974,6 @@ func (siw *ServerInterfaceWrapper) DMAPIDeleteTableStructure(c *gin.Context) { // DMAPIGetTableStructure operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTableStructure(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -1071,7 +1021,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTableStructure(c *gin.Context) { // DMAPIOperateTableStructure operation middleware func (siw *ServerInterfaceWrapper) DMAPIOperateTableStructure(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -1119,7 +1068,6 @@ func (siw *ServerInterfaceWrapper) DMAPIOperateTableStructure(c *gin.Context) { // DMAPIStartTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIStartTask(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -1140,7 +1088,6 @@ func (siw *ServerInterfaceWrapper) DMAPIStartTask(c *gin.Context) { // DMAPIGetTaskStatus operation middleware func (siw *ServerInterfaceWrapper) DMAPIGetTaskStatus(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -1157,7 +1104,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskStatus(c *gin.Context) { // ------------- Optional query parameter "source_name_list" ------------- if paramValue := c.Query("source_name_list"); paramValue != "" { - } err = runtime.BindQueryParameter("form", true, false, "source_name_list", c.Request.URL.Query(), ¶ms.SourceNameList) @@ -1175,7 +1121,6 @@ func (siw *ServerInterfaceWrapper) DMAPIGetTaskStatus(c *gin.Context) { // DMAPIStopTask operation middleware func (siw *ServerInterfaceWrapper) DMAPIStopTask(c *gin.Context) { - var err error // ------------- Path parameter "task-name" ------------- @@ -1303,7 +1248,6 @@ func RegisterHandlersWithOptions(router *gin.Engine, si ServerInterface, options // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+x9bXPbOJLwX8Gj5z7sTEmWZDtO4qv9kMSerO+cl4o9tbe1lWMgEpSwJgEGAO3Rpvzf", "r/BCEiQBkrItx5pkP+w4Igh0N/odjea3UUjTjBJEBB8dfxvxcIVSqP58lSAm3kECl4hd0owmdLmWv2eM", "ZogJjNSoFeVC/hf9AdMsQaPj0Xz/+d5sb7Y3H41HYp3Jn7hgmCxHt+NRRll9+MvZy4NyHCYCLREb3d6O", @@ -1388,7 +1332,7 @@ func decodeSpecCached() func() ([]byte, error) { // Constructs a synthetic filesystem for resolving external references when loading openapi specifications. func PathToRawSpec(pathToFile string) map[string]func() ([]byte, error) { - var res = make(map[string]func() ([]byte, error)) + res := make(map[string]func() ([]byte, error)) if len(pathToFile) > 0 { res[pathToFile] = rawSpec } @@ -1402,12 +1346,12 @@ func PathToRawSpec(pathToFile string) map[string]func() ([]byte, error) { // Externally referenced files must be embedded in the corresponding golang packages. // Urls can be supported but this task was out of the scope. func GetSwagger() (swagger *openapi3.T, err error) { - var resolvePath = PathToRawSpec("") + resolvePath := PathToRawSpec("") loader := openapi3.NewLoader() loader.IsExternalRefsAllowed = true loader.ReadFromURIFunc = func(loader *openapi3.Loader, url *url.URL) ([]byte, error) { - var pathToFile = url.String() + pathToFile := url.String() pathToFile = path.Clean(pathToFile) getSpec, ok := resolvePath[pathToFile] if !ok { From 35b5f850703108f01e1d17fe269456939104d5b3 Mon Sep 17 00:00:00 2001 From: OliverS929 <182192954+OliverS929@users.noreply.github.com> Date: Thu, 14 Nov 2024 21:51:47 +0800 Subject: [PATCH 22/50] Fix openapi test case. --- dm/tests/openapi/client/openapi_task_check | 2 -- 1 file changed, 2 deletions(-) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index 6b2650980d8..f4dd2b843e9 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -330,7 +330,6 @@ def create_load_task_success(): "table": "*", }, "target": {"schema": "openapi", "table": "t"}, - "binlog_filter_rule": ["rule-1"], }, { "source": { @@ -339,7 +338,6 @@ def create_load_task_success(): "table": "*", }, "target": {"schema": "openapi", "table": "t"}, - "binlog_filter_rule": ["rule-2"], }, ], "source_config": { From ec72abbaf24a547a3dc3067a4eb54c69bb20ce6c Mon Sep 17 00:00:00 2001 From: OliverS929 <182192954+OliverS929@users.noreply.github.com> Date: Thu, 14 Nov 2024 21:57:16 +0800 Subject: [PATCH 23/50] Typo fix. --- dm/tests/openapi/client/openapi_task_check | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index f4dd2b843e9..b180a62f139 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -354,7 +354,7 @@ def create_load_task_success(): }, } resp = requests.post(url=API_ENDPOINT, json={"task": task}) - print("create_shard_task_success resp=", resp.json()) + print("create_load_task_success resp=", resp.json()) assert resp.status_code == 201 def start_task_success(task_name, source_name): From 86595f3f192f08698ced953caa31ffce4a37e431 Mon Sep 17 00:00:00 2001 From: OliverS929 <182192954+OliverS929@users.noreply.github.com> Date: Thu, 14 Nov 2024 23:05:57 +0800 Subject: [PATCH 24/50] One source for openapi test is enough. --- dm/tests/openapi/client/openapi_task_check | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index b180a62f139..4137fedd03e 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -330,15 +330,7 @@ def create_load_task_success(): "table": "*", }, "target": {"schema": "openapi", "table": "t"}, - }, - { - "source": { - "source_name": SOURCE2_NAME, - "schema": "openapi", - "table": "*", - }, - "target": {"schema": "openapi", "table": "t"}, - }, + } ], "source_config": { "full_migrate_conf": { @@ -348,8 +340,7 @@ def create_load_task_success(): "consistency": "auto", }, "source_conf": [ - {"source_name": SOURCE1_NAME}, - {"source_name": SOURCE2_NAME}, + {"source_name": SOURCE1_NAME} ], }, } From d6d6eace54d3918db552c9d2ef0f3c5478bc2a57 Mon Sep 17 00:00:00 2001 From: OliverS929 <182192954+OliverS929@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:40:20 +0800 Subject: [PATCH 25/50] Regen the openapi. --- dm/openapi/gen.server.go | 58 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index 9d3b8e9c841..c3eb60f14b1 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -1298,6 +1298,64 @@ var swaggerSpec = []string{ "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", } // GetSwagger returns the content of the embedded swagger specification file From a4d5ba2f44fd7da8ea5a8a5e309c315d2298e5b1 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:51:35 +0800 Subject: [PATCH 26/50] add comment --- dm/config/subtask.go | 8 +- dm/pb/dmworker.pb.go | 294 ++++++++++++++++++++-------------------- dm/proto/dmworker.proto | 4 +- 3 files changed, 154 insertions(+), 152 deletions(-) diff --git a/dm/config/subtask.go b/dm/config/subtask.go index fd6057169a8..004450b7a78 100644 --- a/dm/config/subtask.go +++ b/dm/config/subtask.go @@ -178,14 +178,16 @@ type SubTaskConfig struct { ExtStorage extstorage.ExternalStorage `toml:"-" json:"-"` MetricsFactory promutil.Factory `toml:"-" json:"-"` FrameworkLogger *zap.Logger `toml:"-" json:"-"` - // members below are injected by dataflow engine, UUID should be unique in - // one go runtime. + // members below are injected by dataflow engine + // UUID should be unique in one go runtime. // IOTotalBytes is used build TCPConnWithIOCounter and UUID is used to as a // key to let MySQL driver to find the right TCPConnWithIOCounter. + // It will meter TCP io usage to downstream of the subtask UUID string `toml:"uuid" json:"-"` IOTotalBytes *atomic.Uint64 `toml:"io-total-bytes" json:"io-total-bytes"` - // meter network usage from upstream + // DumpUUID as same as UUID + // DumpIOTotalBytes meter TCP io usage from upstream of the subtask, other same as IOTotalBytes // e.g., pulling binlog DumpUUID string `toml:"dump-uuid" json:"-"` DumpIOTotalBytes *atomic.Uint64 `toml:"dump-io-total-bytes" json:"dump-io-total-bytes"` diff --git a/dm/pb/dmworker.pb.go b/dm/pb/dmworker.pb.go index f538436a4ba..3edecd7a2b1 100644 --- a/dm/pb/dmworker.pb.go +++ b/dm/pb/dmworker.pb.go @@ -961,7 +961,7 @@ type SyncStatus struct { TotalRows int64 `protobuf:"varint,15,opt,name=totalRows,proto3" json:"totalRows,omitempty"` TotalRps int64 `protobuf:"varint,16,opt,name=totalRps,proto3" json:"totalRps,omitempty"` RecentRps int64 `protobuf:"varint,17,opt,name=recentRps,proto3" json:"recentRps,omitempty"` - IOTotalBytes uint64 `protobuf:"varint,18,opt,name=iOTotalBytes,proto3" json:"iOTotalBytes,omitempty"` + IoTotalBytes uint64 `protobuf:"varint,18,opt,name=ioTotalBytes,proto3" json:"ioTotalBytes,omitempty"` DumpIOTotalBytes uint64 `protobuf:"varint,19,opt,name=dumpIOTotalBytes,proto3" json:"dumpIOTotalBytes,omitempty"` } @@ -1117,9 +1117,9 @@ func (m *SyncStatus) GetRecentRps() int64 { return 0 } -func (m *SyncStatus) GetIOTotalBytes() uint64 { +func (m *SyncStatus) GetIoTotalBytes() uint64 { if m != nil { - return m.IOTotalBytes + return m.IoTotalBytes } return 0 } @@ -3653,7 +3653,7 @@ func init() { func init() { proto.RegisterFile("dmworker.proto", fileDescriptor_51a1b9e17fd67b10) } var fileDescriptor_51a1b9e17fd67b10 = []byte{ - // 2971 bytes of a gzipped FileDescriptorProto + // 2972 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x6f, 0xdc, 0xd6, 0xb5, 0x43, 0x72, 0x3e, 0xcf, 0x8c, 0x24, 0xea, 0x4a, 0xf6, 0x9b, 0x28, 0xf6, 0x44, 0xa1, 0x83, 0x3c, 0x45, 0xc8, 0x13, 0x12, 0xbd, 0x3c, 0xe4, 0x21, 0x40, 0x9b, 0xc4, 0x92, 0x23, 0x3b, 0x95, @@ -3704,142 +3704,142 @@ var fileDescriptor_51a1b9e17fd67b10 = []byte{ 0x47, 0xc2, 0x88, 0x21, 0xc5, 0xf7, 0xf7, 0x0f, 0x8f, 0xae, 0x22, 0x9e, 0xf6, 0x97, 0x44, 0xc4, 0x54, 0x90, 0xe8, 0x6e, 0x3f, 0x8e, 0xce, 0xc2, 0xc0, 0xcf, 0x1f, 0x67, 0xa3, 0xfe, 0x32, 0xf1, 0xe8, 0x28, 0x74, 0x69, 0x5e, 0xa4, 0xf5, 0x8a, 0x70, 0x69, 0x81, 0x28, 0x82, 0xc1, 0x4d, 0xb2, - 0xbe, 0xad, 0x05, 0x83, 0xab, 0x07, 0x03, 0x12, 0x57, 0xf5, 0x60, 0x70, 0x45, 0x30, 0x04, 0x47, - 0x27, 0x65, 0x9e, 0xb2, 0x4d, 0x63, 0xab, 0xee, 0x56, 0x70, 0xe8, 0xbc, 0xe1, 0x64, 0x9c, 0x3c, - 0xd2, 0xf9, 0xd6, 0x88, 0x6f, 0x06, 0xef, 0xfc, 0xca, 0x80, 0x9e, 0xde, 0x2b, 0xb4, 0x2e, 0x66, - 0x2c, 0xe8, 0x62, 0xa6, 0xde, 0xc5, 0xd8, 0x5b, 0x45, 0xb7, 0x12, 0xdd, 0x87, 0xfc, 0xf9, 0x24, - 0x8d, 0xb1, 0xac, 0xbb, 0x44, 0x28, 0x1a, 0xd8, 0xbb, 0xd0, 0x4d, 0x79, 0xe8, 0x5d, 0x17, 0x6d, - 0x07, 0xf9, 0x57, 0x90, 0xdf, 0x2d, 0xd1, 0xae, 0xce, 0xe3, 0xfc, 0xd9, 0x84, 0xae, 0x46, 0x9c, - 0xc9, 0x05, 0xe3, 0x1b, 0xe6, 0x82, 0xb9, 0x20, 0x17, 0x36, 0x95, 0x4a, 0x93, 0xd3, 0xfd, 0x20, - 0x95, 0xe5, 0x41, 0x47, 0x15, 0x1c, 0x95, 0xe4, 0xd3, 0x51, 0xd8, 0x3d, 0x34, 0x50, 0x4b, 0xbd, - 0x69, 0x34, 0xdb, 0x01, 0x46, 0xa8, 0x3d, 0x2f, 0xf7, 0xcf, 0x3f, 0x4f, 0x64, 0x34, 0x36, 0x29, - 0xa4, 0xe7, 0x50, 0xd8, 0x6b, 0xd0, 0xc8, 0x72, 0x6f, 0xc4, 0x29, 0xf5, 0x96, 0x77, 0x3b, 0x94, - 0x2a, 0x88, 0x70, 0x05, 0x5e, 0x33, 0x7e, 0xfb, 0x05, 0xc6, 0x77, 0x7e, 0x6f, 0xc1, 0x52, 0xa5, - 0xbb, 0xcf, 0x9b, 0x82, 0xca, 0x1b, 0xcd, 0x05, 0x37, 0x6e, 0x42, 0x7d, 0x12, 0x05, 0xc2, 0xd9, - 0xcb, 0xbb, 0x3d, 0xa4, 0x7f, 0x1e, 0x05, 0x39, 0x66, 0x9b, 0x4b, 0x14, 0x4d, 0xa7, 0xfa, 0x8b, - 0x02, 0xe2, 0x1d, 0x58, 0x2b, 0x53, 0x7d, 0x7f, 0xff, 0xf0, 0x30, 0xf6, 0x2f, 0x8a, 0xde, 0x30, - 0x8f, 0xc4, 0x98, 0x98, 0x81, 0xa8, 0x64, 0x3d, 0xac, 0x89, 0x29, 0xe8, 0xbf, 0xa1, 0xe1, 0xe3, - 0x54, 0x42, 0x56, 0x92, 0x01, 0xa5, 0x8d, 0x29, 0x0f, 0x6b, 0xae, 0xa0, 0xb3, 0x37, 0xa0, 0x8e, - 0xf1, 0x2f, 0x6d, 0xb5, 0x8c, 0x7c, 0xe5, 0x98, 0xf0, 0xb0, 0xe6, 0x12, 0x15, 0xb9, 0xc2, 0xd8, - 0x1b, 0xf6, 0x3b, 0x25, 0x57, 0xd9, 0x4b, 0x91, 0x0b, 0xa9, 0xc8, 0x85, 0x35, 0x88, 0xea, 0x91, - 0xe4, 0x2a, 0xdb, 0x01, 0x72, 0x21, 0x95, 0xbd, 0x07, 0x70, 0xe9, 0x85, 0xc1, 0x50, 0x34, 0x9f, - 0x2e, 0xf1, 0xae, 0x23, 0xef, 0xb3, 0x02, 0x2b, 0xa3, 0x5e, 0xe3, 0xbb, 0xdf, 0x86, 0x66, 0x26, - 0xc2, 0xff, 0xdb, 0xb0, 0x5a, 0xf1, 0xd9, 0x61, 0x90, 0x91, 0x81, 0x05, 0xb9, 0x6f, 0x2c, 0x1a, - 0xdc, 0xd4, 0xf9, 0x01, 0x00, 0x59, 0xe2, 0x41, 0x9a, 0xc6, 0xa9, 0x1a, 0x20, 0x8d, 0x62, 0x80, - 0x74, 0xee, 0x42, 0x07, 0x2d, 0x70, 0x03, 0x19, 0x5f, 0x7d, 0x11, 0x39, 0x81, 0x1e, 0xbd, 0xf3, - 0xd3, 0xc3, 0x05, 0x1c, 0x6c, 0x17, 0xd6, 0xc5, 0x14, 0x27, 0x92, 0xe0, 0x49, 0x9c, 0x05, 0x64, - 0x09, 0x91, 0x8e, 0x73, 0x69, 0x58, 0x1b, 0x39, 0x8a, 0x3b, 0x7e, 0x7a, 0xa8, 0xe6, 0x0c, 0x05, - 0x3b, 0xff, 0x07, 0x1d, 0xbc, 0x51, 0x5c, 0xb7, 0x05, 0x4d, 0x22, 0x28, 0x3b, 0xd8, 0x85, 0x13, - 0xa4, 0x42, 0xae, 0xa4, 0x3b, 0x3f, 0x31, 0xa0, 0x2b, 0x8a, 0x9c, 0x38, 0xf9, 0xb2, 0x35, 0x6e, - 0xb3, 0x72, 0x5c, 0x55, 0x09, 0x5d, 0xe2, 0x0e, 0x00, 0x95, 0x29, 0xc1, 0x50, 0x2f, 0x83, 0xa2, - 0xc4, 0xba, 0x1a, 0x07, 0x3a, 0xa6, 0x84, 0xe6, 0x98, 0xf6, 0x17, 0x26, 0xf4, 0xa4, 0x4b, 0x05, - 0xcb, 0x7f, 0x28, 0x59, 0x65, 0x3e, 0xd5, 0xf5, 0x7c, 0x7a, 0x53, 0xe5, 0x53, 0xa3, 0x7c, 0x8d, - 0x32, 0x8a, 0xca, 0x74, 0xba, 0x27, 0xd3, 0xa9, 0x49, 0x6c, 0x4b, 0x2a, 0x9d, 0x14, 0x97, 0xc8, - 0xa6, 0x7b, 0x32, 0x9b, 0x5a, 0x25, 0x53, 0x11, 0x52, 0x45, 0x32, 0xdd, 0x93, 0xc9, 0xd4, 0x2e, - 0x99, 0x0a, 0x37, 0xab, 0x5c, 0xba, 0xdf, 0x82, 0x06, 0xb9, 0xd3, 0xf9, 0x00, 0x6c, 0xdd, 0x34, - 0x94, 0x13, 0x6f, 0x4a, 0x62, 0x25, 0x14, 0x34, 0x26, 0x57, 0x9e, 0x7d, 0x0e, 0x4b, 0x95, 0x52, - 0x84, 0x13, 0x44, 0x90, 0xed, 0x79, 0x91, 0xcf, 0xc3, 0x62, 0x8f, 0xd1, 0x30, 0x5a, 0x90, 0x99, - 0xa5, 0x64, 0x29, 0xa2, 0x12, 0x64, 0xda, 0x36, 0x62, 0x55, 0xb6, 0x91, 0xbf, 0x18, 0xd0, 0xd3, - 0x0f, 0xe0, 0x42, 0xf3, 0x20, 0x4d, 0xf7, 0xe2, 0xa1, 0xf0, 0x66, 0xc3, 0x55, 0x20, 0x86, 0x3e, - 0x3e, 0x86, 0x5e, 0x96, 0xc9, 0x08, 0x2c, 0x60, 0x49, 0x3b, 0xf6, 0xe3, 0x44, 0xed, 0x97, 0x05, - 0x2c, 0x69, 0x87, 0xfc, 0x92, 0x87, 0xb2, 0x41, 0x15, 0x30, 0xde, 0xf6, 0x98, 0x67, 0x19, 0x86, - 0x89, 0xa8, 0xab, 0x0a, 0xc4, 0x53, 0xae, 0x77, 0xb5, 0xe7, 0x4d, 0x32, 0x2e, 0x67, 0xc0, 0x02, - 0x46, 0xb3, 0xe0, 0x1e, 0xec, 0xa5, 0xf1, 0x24, 0x52, 0x93, 0x9f, 0x86, 0x71, 0xae, 0x60, 0xf5, - 0xc9, 0x24, 0x1d, 0x71, 0x0a, 0x62, 0xb5, 0x56, 0x6f, 0x40, 0x3b, 0x88, 0x3c, 0x3f, 0x0f, 0x2e, - 0xb9, 0xb4, 0x64, 0x01, 0x63, 0xfc, 0xe6, 0xc1, 0x98, 0xcb, 0xd1, 0x97, 0x9e, 0x91, 0xff, 0x2c, - 0x08, 0x39, 0xc5, 0xb5, 0x7c, 0x25, 0x05, 0x53, 0x8a, 0x8a, 0x9e, 0x2c, 0x97, 0x66, 0x01, 0x39, - 0xbf, 0x34, 0x61, 0xe3, 0x28, 0xe1, 0xa9, 0x97, 0x73, 0xb1, 0xa8, 0x1f, 0xfb, 0xe7, 0x7c, 0xec, - 0x29, 0x15, 0xee, 0x80, 0x19, 0x27, 0x74, 0xb9, 0x8c, 0x77, 0x41, 0x3e, 0x4a, 0x5c, 0x33, 0x4e, - 0x48, 0x09, 0x2f, 0xbb, 0x90, 0xb6, 0xa5, 0xe7, 0x85, 0x5b, 0xfb, 0x06, 0xb4, 0x87, 0x5e, 0xee, - 0x9d, 0x7a, 0x19, 0x57, 0x36, 0x55, 0x30, 0x2d, 0xb8, 0xb8, 0x0f, 0x4a, 0x8b, 0x0a, 0x80, 0x24, - 0xd1, 0x6d, 0xd2, 0x9a, 0x12, 0x42, 0xee, 0xb3, 0x70, 0x92, 0x9d, 0x93, 0x19, 0xdb, 0xae, 0x00, - 0x50, 0x97, 0x22, 0xe6, 0xdb, 0xb2, 0x5d, 0x0c, 0x00, 0xce, 0xd2, 0x78, 0x2c, 0x0a, 0x0b, 0x35, - 0xa0, 0xb6, 0xab, 0x61, 0x14, 0xfd, 0x44, 0xac, 0x3f, 0x50, 0xd2, 0x05, 0xc6, 0xc9, 0x61, 0xe9, - 0xd9, 0xbb, 0x32, 0xec, 0x1f, 0xf3, 0xdc, 0x63, 0x1b, 0x9a, 0x39, 0x00, 0xcd, 0x81, 0x14, 0x69, - 0x8c, 0x17, 0x56, 0x0f, 0x55, 0x72, 0x2c, 0xad, 0xe4, 0x28, 0x0b, 0xd6, 0x29, 0xc4, 0xe9, 0xd9, - 0x79, 0x0f, 0xd6, 0xa5, 0x47, 0x9e, 0xbd, 0x8b, 0xb7, 0x2e, 0xf4, 0x85, 0x20, 0x8b, 0xeb, 0x9d, - 0x3f, 0x19, 0x70, 0x6b, 0xea, 0xd8, 0x4b, 0x7f, 0xff, 0x78, 0x1f, 0xea, 0xb8, 0x40, 0xf6, 0x2d, - 0x4a, 0xcd, 0x7b, 0x78, 0xc7, 0x5c, 0x91, 0x3b, 0x08, 0x3c, 0x88, 0xf2, 0xf4, 0xda, 0xa5, 0x03, - 0x1b, 0x9f, 0x42, 0xa7, 0x40, 0xa1, 0xdc, 0x0b, 0x7e, 0xad, 0xaa, 0xef, 0x05, 0xbf, 0xc6, 0x89, - 0xe2, 0xd2, 0x0b, 0x27, 0xc2, 0x34, 0xb2, 0xc1, 0x56, 0x0c, 0xeb, 0x0a, 0xfa, 0x07, 0xe6, 0xff, - 0x1b, 0xce, 0x0f, 0xa1, 0xff, 0xd0, 0x8b, 0x86, 0xa1, 0x8c, 0x47, 0x51, 0x14, 0xa4, 0x09, 0x5e, - 0xd5, 0x4c, 0xd0, 0x45, 0x29, 0x44, 0xbd, 0x21, 0x1a, 0xef, 0x40, 0xe7, 0x54, 0xb5, 0x43, 0x69, - 0xf8, 0x12, 0x41, 0x31, 0xf3, 0x3c, 0xcc, 0xe4, 0x9a, 0x4a, 0xcf, 0xce, 0x2d, 0x58, 0x3b, 0xe0, - 0xb9, 0xb8, 0x7b, 0xef, 0x6c, 0x24, 0x6f, 0x76, 0xb6, 0x60, 0xbd, 0x8a, 0x96, 0xc6, 0xb5, 0xc1, - 0xf2, 0xcf, 0x8a, 0x56, 0xe3, 0x9f, 0x8d, 0x9c, 0x63, 0xb8, 0x2b, 0xa6, 0xa5, 0xc9, 0x29, 0xaa, - 0x80, 0xa5, 0xef, 0xf3, 0x64, 0xe8, 0xe5, 0x5c, 0xbd, 0xc4, 0x2e, 0xac, 0x67, 0x82, 0xb6, 0x77, - 0x36, 0x3a, 0x89, 0xc7, 0xe1, 0x71, 0x9e, 0x06, 0x91, 0x92, 0x31, 0x97, 0xe6, 0x1c, 0xc2, 0x60, - 0x91, 0x50, 0xa9, 0x48, 0x1f, 0x5a, 0xf2, 0xe3, 0x8f, 0x74, 0xb3, 0x02, 0x67, 0xfd, 0xec, 0x8c, - 0x60, 0xe3, 0x80, 0xe7, 0x33, 0x33, 0x53, 0x59, 0x76, 0xf0, 0x8e, 0xcf, 0xca, 0xf6, 0x58, 0xc0, - 0xec, 0x7f, 0xa0, 0x77, 0x16, 0x84, 0x39, 0x4f, 0xe5, 0xce, 0x31, 0x13, 0xeb, 0x15, 0xb2, 0xf3, - 0x37, 0x0b, 0xec, 0xe9, 0x6b, 0x0a, 0x3f, 0x19, 0x73, 0xab, 0x86, 0x59, 0xa9, 0x1a, 0x0c, 0xea, - 0x63, 0x2c, 0xec, 0x32, 0x67, 0xf0, 0xb9, 0x4c, 0xb4, 0xfa, 0x82, 0x44, 0xdb, 0x82, 0x15, 0x39, - 0xfd, 0xc5, 0x6a, 0xaf, 0x91, 0x0b, 0xc4, 0x14, 0x1a, 0x07, 0xe6, 0x29, 0x14, 0xad, 0x1b, 0xa2, - 0xde, 0xcc, 0x23, 0x69, 0xd3, 0x78, 0xeb, 0x1b, 0x4c, 0xe3, 0x89, 0x20, 0x88, 0x4f, 0x54, 0xd2, - 0x64, 0x6d, 0x21, 0x7c, 0x0e, 0x89, 0xbd, 0x0d, 0xab, 0x09, 0x8f, 0x70, 0x71, 0xd7, 0xf8, 0x3b, - 0xc4, 0x3f, 0x4b, 0xc0, 0xd7, 0xa4, 0x56, 0xa9, 0xf1, 0x82, 0x78, 0xcd, 0x29, 0x34, 0x6e, 0x70, - 0xfe, 0x24, 0x8f, 0x2f, 0xd5, 0xaa, 0x86, 0xc9, 0x20, 0x96, 0xfb, 0x19, 0x3c, 0xea, 0x50, 0xc1, - 0x91, 0x41, 0x7a, 0x42, 0x87, 0x19, 0x82, 0xf3, 0x1b, 0x03, 0x6e, 0x95, 0x0e, 0xa6, 0x8f, 0x7a, - 0x2f, 0xd8, 0x7b, 0x37, 0xa0, 0x9d, 0xa5, 0x3e, 0x71, 0xaa, 0x9e, 0xac, 0x60, 0xea, 0x11, 0x59, - 0x2e, 0x68, 0xb2, 0x81, 0x29, 0xf8, 0xc5, 0x5e, 0xef, 0x43, 0x6b, 0x5c, 0x6d, 0xcc, 0x12, 0x74, - 0xfe, 0x60, 0xc0, 0xab, 0x73, 0xe3, 0xfd, 0xdf, 0xf8, 0x40, 0x0c, 0x45, 0x50, 0x64, 0xb2, 0x4c, - 0xde, 0xbc, 0x7f, 0xe0, 0x24, 0xf3, 0x21, 0x2c, 0xe5, 0xa5, 0x65, 0xb8, 0xfa, 0x40, 0xfc, 0x4a, - 0xf5, 0xa0, 0x66, 0x3c, 0xb7, 0xca, 0xef, 0x5c, 0xc0, 0x2b, 0x15, 0xfd, 0x2b, 0x35, 0x71, 0x97, - 0xe6, 0x7b, 0xe4, 0xe5, 0xb2, 0x32, 0xde, 0xd6, 0x04, 0x8b, 0x79, 0x9a, 0xa8, 0x6e, 0xc1, 0x57, - 0x49, 0x71, 0xb3, 0x9a, 0xe2, 0xce, 0xaf, 0x4d, 0x58, 0x99, 0xba, 0x8a, 0x2d, 0x83, 0x19, 0x0c, - 0xa5, 0x23, 0xcd, 0x60, 0xb8, 0x30, 0x5d, 0x75, 0xe7, 0x5a, 0x53, 0xce, 0xc5, 0x02, 0x95, 0xfa, - 0xfb, 0x5e, 0xee, 0xc9, 0xfe, 0xaf, 0xc0, 0x8a, 0xdb, 0x1b, 0x53, 0x6e, 0xef, 0x43, 0x6b, 0x98, - 0xe5, 0x74, 0x4a, 0x64, 0xa5, 0x02, 0xb1, 0xb4, 0x53, 0x9c, 0xd3, 0xa7, 0x2a, 0x31, 0x51, 0x95, - 0x08, 0xb6, 0x53, 0x2c, 0x75, 0xed, 0x1b, 0x6d, 0x22, 0xb9, 0x8a, 0x79, 0xaa, 0x23, 0x8b, 0x12, - 0xce, 0x53, 0x5a, 0x44, 0x41, 0x35, 0xa2, 0x9e, 0x4f, 0x15, 0x50, 0xe9, 0x90, 0x97, 0x8e, 0xa7, - 0xb7, 0xd4, 0x98, 0x2d, 0x42, 0x69, 0xad, 0x1a, 0x11, 0x95, 0x49, 0xfb, 0xe7, 0x06, 0xdc, 0x55, - 0xcd, 0x78, 0x7e, 0x20, 0xdc, 0xd3, 0x9a, 0xe3, 0xac, 0x24, 0xd9, 0x24, 0x69, 0x3e, 0xff, 0x38, - 0x0c, 0xc5, 0x62, 0x65, 0xaa, 0xf9, 0x5c, 0x61, 0x2a, 0x91, 0x61, 0x4d, 0x15, 0xff, 0x75, 0xd2, - 0xf6, 0x91, 0xf8, 0x41, 0xa1, 0xee, 0x0a, 0xc0, 0xf9, 0x14, 0x06, 0x8b, 0xf4, 0x7a, 0x59, 0x7b, - 0x38, 0xd7, 0x70, 0x57, 0xb4, 0xb5, 0x52, 0x94, 0xfa, 0xf9, 0xe8, 0xc5, 0xbd, 0xa9, 0xd2, 0xeb, - 0xcd, 0xe9, 0x5e, 0x5f, 0x7c, 0xda, 0xa4, 0xcf, 0xe5, 0x96, 0xfe, 0x69, 0x13, 0x31, 0xdb, 0x17, - 0xd0, 0x14, 0xc3, 0x1c, 0x5b, 0x82, 0xce, 0xa3, 0x88, 0xd2, 0xf7, 0x28, 0xb1, 0x6b, 0xac, 0x0d, - 0xf5, 0xe3, 0x3c, 0x4e, 0x6c, 0x83, 0x75, 0xa0, 0xf1, 0x04, 0xa7, 0x79, 0xdb, 0x64, 0x00, 0x4d, - 0xac, 0xf6, 0x63, 0x6e, 0x5b, 0x88, 0x3e, 0xce, 0xbd, 0x34, 0xb7, 0xeb, 0x88, 0x16, 0xfa, 0xdb, - 0x0d, 0xb6, 0x0c, 0xf0, 0xf1, 0x24, 0x8f, 0x25, 0x5b, 0x13, 0x69, 0xfb, 0x3c, 0xe4, 0x39, 0xb7, - 0x5b, 0xdb, 0x3f, 0xa2, 0x23, 0x23, 0x1c, 0x1f, 0x7a, 0xf2, 0x2e, 0x82, 0xed, 0x1a, 0x6b, 0x81, - 0xf5, 0x19, 0xbf, 0xb2, 0x0d, 0xd6, 0x85, 0x96, 0x3b, 0x89, 0xa2, 0x20, 0x1a, 0x89, 0xfb, 0xe8, - 0xea, 0xa1, 0x6d, 0x21, 0x01, 0x15, 0x4a, 0xf8, 0xd0, 0xae, 0xb3, 0x1e, 0xb4, 0x3f, 0x91, 0x3f, - 0x3b, 0xd8, 0x0d, 0x24, 0x21, 0x1b, 0x9e, 0x69, 0x22, 0x89, 0x2e, 0x47, 0xa8, 0x85, 0x10, 0x9d, - 0x42, 0xa8, 0xbd, 0x7d, 0x04, 0x6d, 0xb5, 0xb9, 0xb2, 0x15, 0xe8, 0x4a, 0x1d, 0x10, 0x65, 0xd7, - 0xf0, 0x85, 0x68, 0xd8, 0xb0, 0x0d, 0x7c, 0x79, 0xdc, 0x41, 0x6d, 0x13, 0x9f, 0x70, 0xd1, 0xb4, - 0x2d, 0x32, 0xc8, 0x75, 0xe4, 0xdb, 0x75, 0x64, 0xa4, 0x85, 0xc5, 0x1e, 0x6e, 0x3f, 0x86, 0x16, - 0x3d, 0x1e, 0xe1, 0x1c, 0xb6, 0x2c, 0xe5, 0x49, 0x8c, 0x5d, 0x43, 0x9b, 0xe2, 0xed, 0x82, 0xdb, - 0x40, 0xdb, 0xd0, 0xeb, 0x08, 0xd8, 0x44, 0x15, 0x84, 0x9d, 0x04, 0xc2, 0xda, 0xfe, 0xb1, 0x01, - 0x6d, 0xb5, 0x6a, 0xb0, 0x35, 0x58, 0x51, 0x46, 0x92, 0x28, 0x21, 0xf1, 0x80, 0xe7, 0x02, 0x61, - 0x1b, 0x74, 0x41, 0x01, 0x9a, 0x68, 0x57, 0x97, 0x8f, 0xe3, 0x4b, 0x2e, 0x31, 0x16, 0x5e, 0x89, - 0x9b, 0xad, 0x84, 0xeb, 0x78, 0x00, 0x61, 0xaa, 0x32, 0x76, 0x83, 0xdd, 0x06, 0x86, 0xe0, 0xe3, - 0x60, 0x84, 0x91, 0x2c, 0xe6, 0xff, 0xcc, 0x6e, 0x6e, 0x7f, 0x04, 0x6d, 0x35, 0x66, 0x6b, 0x7a, - 0x28, 0x54, 0xa1, 0x87, 0x40, 0xd8, 0x46, 0x79, 0xb1, 0xc4, 0x98, 0xdb, 0xcf, 0x68, 0x3d, 0xc5, - 0x29, 0x55, 0xb3, 0x8c, 0xc4, 0xc8, 0xf0, 0xba, 0x08, 0x12, 0xe9, 0x70, 0x9e, 0x84, 0x9e, 0x5f, - 0x04, 0xd8, 0x25, 0x4f, 0x73, 0xdb, 0xc2, 0xe7, 0x47, 0xd1, 0x0f, 0xb8, 0x8f, 0x11, 0x86, 0x6e, - 0x08, 0xb2, 0xdc, 0x6e, 0x6c, 0x1f, 0x42, 0xf7, 0x99, 0xea, 0x31, 0x47, 0x09, 0xbe, 0x80, 0x52, - 0xae, 0xc4, 0xda, 0x35, 0xbc, 0x93, 0xa2, 0xb3, 0xc0, 0xda, 0x06, 0x5b, 0x85, 0x25, 0xf4, 0x46, - 0x89, 0x32, 0xb7, 0x9f, 0x02, 0x9b, 0xad, 0x8e, 0x68, 0xb4, 0x52, 0x61, 0xbb, 0x86, 0x9a, 0x7c, - 0xc6, 0xaf, 0xf0, 0x99, 0x7c, 0xf8, 0x68, 0x14, 0xc5, 0x29, 0x27, 0x9a, 0xf2, 0x21, 0x7d, 0x5f, - 0x44, 0x84, 0xb5, 0xfd, 0x6c, 0xaa, 0x8f, 0x1c, 0x25, 0x5a, 0xb8, 0x13, 0x6c, 0xd7, 0x28, 0xf8, - 0x48, 0x8a, 0x40, 0x48, 0x03, 0x92, 0x18, 0x81, 0x31, 0xf1, 0xa2, 0xbd, 0x90, 0x7b, 0xa9, 0x80, - 0xad, 0xdd, 0x7f, 0x34, 0xa1, 0x29, 0xaa, 0x02, 0xfb, 0x08, 0xba, 0xda, 0x2f, 0xbe, 0x8c, 0x8a, - 0xfc, 0xec, 0xef, 0xd3, 0x1b, 0xff, 0x35, 0x83, 0x17, 0x95, 0xc9, 0xa9, 0xb1, 0x0f, 0x01, 0xca, - 0xc5, 0x9b, 0xdd, 0xa2, 0x69, 0x6e, 0x7a, 0x11, 0xdf, 0xe8, 0xd3, 0x27, 0x9b, 0x39, 0xbf, 0x66, - 0x3b, 0x35, 0xf6, 0x1d, 0x58, 0x92, 0xe5, 0x4f, 0x84, 0x16, 0x1b, 0x68, 0x6b, 0xd3, 0x9c, 0x95, - 0xfa, 0x46, 0x61, 0x9f, 0x14, 0xc2, 0x44, 0xf8, 0xb0, 0xfe, 0x9c, 0x1d, 0x4c, 0x88, 0x79, 0x65, - 0xe1, 0x76, 0xe6, 0xd4, 0xd8, 0x01, 0x74, 0xc5, 0x0e, 0x25, 0x8a, 0xfa, 0x1d, 0xe4, 0x5d, 0xb4, - 0x54, 0xdd, 0xa8, 0xd0, 0x1e, 0xf4, 0xf4, 0xb5, 0x87, 0x91, 0x25, 0xe7, 0xec, 0x47, 0x42, 0xc8, - 0xbc, 0x0d, 0xc9, 0xa9, 0x31, 0x0f, 0x6e, 0xcf, 0x5f, 0x5e, 0xd8, 0xeb, 0xe5, 0xb7, 0xe5, 0x05, - 0xdb, 0xd2, 0x86, 0x73, 0x13, 0x4b, 0x71, 0xc5, 0xf7, 0xa0, 0x5f, 0x5c, 0x5e, 0x84, 0xb5, 0x8c, - 0x8a, 0x81, 0x54, 0x6d, 0xc1, 0xbe, 0xb3, 0xf1, 0xda, 0x42, 0x7a, 0x21, 0xfe, 0x04, 0x56, 0x4b, - 0x86, 0x58, 0x98, 0x8f, 0xdd, 0x9d, 0x39, 0x57, 0x31, 0xeb, 0x60, 0x11, 0xb9, 0x90, 0xfa, 0xfd, - 0x72, 0x63, 0xaf, 0x4a, 0x7e, 0x5d, 0xf7, 0xed, 0x7c, 0xe9, 0xce, 0x4d, 0x2c, 0xc5, 0x0d, 0x4f, - 0x60, 0xa5, 0xd2, 0x4f, 0x95, 0xec, 0x1b, 0x9b, 0xec, 0x4d, 0x01, 0x71, 0xbf, 0xff, 0xc5, 0x57, - 0x03, 0xe3, 0xcb, 0xaf, 0x06, 0xc6, 0xdf, 0xbf, 0x1a, 0x18, 0x3f, 0xfd, 0x7a, 0x50, 0xfb, 0xf2, - 0xeb, 0x41, 0xed, 0xaf, 0x5f, 0x0f, 0x6a, 0xa7, 0x4d, 0xfa, 0x97, 0xc8, 0xff, 0xfe, 0x2b, 0x00, - 0x00, 0xff, 0xff, 0xec, 0x69, 0xc8, 0x38, 0x37, 0x22, 0x00, 0x00, + 0xbe, 0xad, 0x05, 0x83, 0xab, 0x07, 0x03, 0x12, 0x57, 0xf5, 0x60, 0x70, 0x45, 0x30, 0x04, 0xf1, + 0x49, 0x99, 0xa7, 0x6c, 0xd3, 0xd8, 0xaa, 0xbb, 0x15, 0x1c, 0x3a, 0x6f, 0x38, 0x19, 0x27, 0x8f, + 0x8e, 0x34, 0xbe, 0x35, 0xe2, 0x9b, 0xc1, 0x3b, 0xbf, 0x32, 0xa0, 0xa7, 0xf7, 0x0a, 0xad, 0x8b, + 0x19, 0x0b, 0xba, 0x98, 0xa9, 0x77, 0x31, 0xf6, 0x56, 0xd1, 0xad, 0x44, 0xf7, 0x21, 0x7f, 0x3e, + 0x49, 0x63, 0x2c, 0xeb, 0x2e, 0x11, 0x8a, 0x06, 0xf6, 0x2e, 0x74, 0x53, 0x1e, 0x7a, 0xd7, 0x45, + 0xdb, 0x41, 0xfe, 0x15, 0xe4, 0x77, 0x4b, 0xb4, 0xab, 0xf3, 0x38, 0x7f, 0x36, 0xa1, 0xab, 0x11, + 0x67, 0x72, 0xc1, 0xf8, 0x86, 0xb9, 0x60, 0x2e, 0xc8, 0x85, 0x4d, 0xa5, 0xd2, 0xe4, 0x74, 0x3f, + 0x48, 0x65, 0x79, 0xd0, 0x51, 0x05, 0x47, 0x25, 0xf9, 0x74, 0x14, 0x76, 0x0f, 0x0d, 0xd4, 0x52, + 0x6f, 0x1a, 0xcd, 0x76, 0x80, 0x11, 0x6a, 0xcf, 0xcb, 0xfd, 0xf3, 0xcf, 0x13, 0x19, 0x8d, 0x4d, + 0x0a, 0xe9, 0x39, 0x14, 0xf6, 0x1a, 0x34, 0xb2, 0xdc, 0x1b, 0x71, 0x4a, 0xbd, 0xe5, 0xdd, 0x0e, + 0xa5, 0x0a, 0x22, 0x5c, 0x81, 0xd7, 0x8c, 0xdf, 0x7e, 0x81, 0xf1, 0x9d, 0xdf, 0x5b, 0xb0, 0x54, + 0xe9, 0xee, 0xf3, 0xa6, 0xa0, 0xf2, 0x46, 0x73, 0xc1, 0x8d, 0x9b, 0x50, 0x9f, 0x44, 0x81, 0x70, + 0xf6, 0xf2, 0x6e, 0x0f, 0xe9, 0x9f, 0x47, 0x41, 0x8e, 0xd9, 0xe6, 0x12, 0x45, 0xd3, 0xa9, 0xfe, + 0xa2, 0x80, 0x78, 0x07, 0xd6, 0xca, 0x54, 0xdf, 0xdf, 0x3f, 0x3c, 0x8c, 0xfd, 0x8b, 0xa2, 0x37, + 0xcc, 0x23, 0x31, 0x26, 0x66, 0x20, 0x2a, 0x59, 0x0f, 0x6b, 0x62, 0x0a, 0xfa, 0x6f, 0x68, 0xf8, + 0x38, 0x95, 0x90, 0x95, 0x64, 0x40, 0x69, 0x63, 0xca, 0xc3, 0x9a, 0x2b, 0xe8, 0xec, 0x0d, 0xa8, + 0x63, 0xfc, 0x4b, 0x5b, 0x2d, 0x23, 0x5f, 0x39, 0x26, 0x3c, 0xac, 0xb9, 0x44, 0x45, 0xae, 0x30, + 0xf6, 0x86, 0xfd, 0x4e, 0xc9, 0x55, 0xf6, 0x52, 0xe4, 0x42, 0x2a, 0x72, 0x61, 0x0d, 0xa2, 0x7a, + 0x24, 0xb9, 0xca, 0x76, 0x80, 0x5c, 0x48, 0x65, 0xef, 0x01, 0x5c, 0x7a, 0x61, 0x30, 0x14, 0xcd, + 0xa7, 0x4b, 0xbc, 0xeb, 0xc8, 0xfb, 0xac, 0xc0, 0xca, 0xa8, 0xd7, 0xf8, 0xee, 0xb7, 0xa1, 0x99, + 0x89, 0xf0, 0xff, 0x36, 0xac, 0x56, 0x7c, 0x76, 0x18, 0x64, 0x64, 0x60, 0x41, 0xee, 0x1b, 0x8b, + 0x06, 0x37, 0x75, 0x7e, 0x00, 0x40, 0x96, 0x78, 0x90, 0xa6, 0x71, 0xaa, 0x06, 0x48, 0xa3, 0x18, + 0x20, 0x9d, 0xbb, 0xd0, 0x41, 0x0b, 0xdc, 0x40, 0xc6, 0x57, 0x5f, 0x44, 0x4e, 0xa0, 0x47, 0xef, + 0xfc, 0xf4, 0x70, 0x01, 0x07, 0xdb, 0x85, 0x75, 0x31, 0xc5, 0x89, 0x24, 0x78, 0x12, 0x67, 0x01, + 0x59, 0x42, 0xa4, 0xe3, 0x5c, 0x1a, 0xd6, 0x46, 0x8e, 0xe2, 0x8e, 0x9f, 0x1e, 0xaa, 0x39, 0x43, + 0xc1, 0xce, 0xff, 0x41, 0x07, 0x6f, 0x14, 0xd7, 0x6d, 0x41, 0x93, 0x08, 0xca, 0x0e, 0x76, 0xe1, + 0x04, 0xa9, 0x90, 0x2b, 0xe9, 0xce, 0x4f, 0x0c, 0xe8, 0x8a, 0x22, 0x27, 0x4e, 0xbe, 0x6c, 0x8d, + 0xdb, 0xac, 0x1c, 0x57, 0x55, 0x42, 0x97, 0xb8, 0x03, 0x40, 0x65, 0x4a, 0x30, 0xd4, 0xcb, 0xa0, + 0x28, 0xb1, 0xae, 0xc6, 0x81, 0x8e, 0x29, 0xa1, 0x39, 0xa6, 0xfd, 0x85, 0x09, 0x3d, 0xe9, 0x52, + 0xc1, 0xf2, 0x1f, 0x4a, 0x56, 0x99, 0x4f, 0x75, 0x3d, 0x9f, 0xde, 0x54, 0xf9, 0xd4, 0x28, 0x5f, + 0xa3, 0x8c, 0xa2, 0x32, 0x9d, 0xee, 0xc9, 0x74, 0x6a, 0x12, 0xdb, 0x92, 0x4a, 0x27, 0xc5, 0x25, + 0xb2, 0xe9, 0x9e, 0xcc, 0xa6, 0x56, 0xc9, 0x54, 0x84, 0x54, 0x91, 0x4c, 0xf7, 0x64, 0x32, 0xb5, + 0x4b, 0xa6, 0xc2, 0xcd, 0x2a, 0x97, 0xee, 0xb7, 0xa0, 0x41, 0xee, 0x74, 0x3e, 0x00, 0x5b, 0x37, + 0x0d, 0xe5, 0xc4, 0x9b, 0x92, 0x58, 0x09, 0x05, 0x8d, 0xc9, 0x95, 0x67, 0x9f, 0xc3, 0x52, 0xa5, + 0x14, 0xe1, 0x04, 0x11, 0x64, 0x7b, 0x5e, 0xe4, 0xf3, 0xb0, 0xd8, 0x63, 0x34, 0x8c, 0x16, 0x64, + 0x66, 0x29, 0x59, 0x8a, 0xa8, 0x04, 0x99, 0xb6, 0x8d, 0x58, 0x95, 0x6d, 0xe4, 0x2f, 0x06, 0xf4, + 0xf4, 0x03, 0xb8, 0xd0, 0x3c, 0x48, 0xd3, 0xbd, 0x78, 0x28, 0xbc, 0xd9, 0x70, 0x15, 0x88, 0xa1, + 0x8f, 0x8f, 0xa1, 0x97, 0x65, 0x32, 0x02, 0x0b, 0x58, 0xd2, 0x8e, 0xfd, 0x38, 0x51, 0xfb, 0x65, + 0x01, 0x4b, 0xda, 0x21, 0xbf, 0xe4, 0xa1, 0x6c, 0x50, 0x05, 0x8c, 0xb7, 0x3d, 0xe6, 0x59, 0x86, + 0x61, 0x22, 0xea, 0xaa, 0x02, 0xf1, 0x94, 0xeb, 0x5d, 0xed, 0x79, 0x93, 0x8c, 0xcb, 0x19, 0xb0, + 0x80, 0xd1, 0x2c, 0xb8, 0x07, 0x7b, 0x69, 0x3c, 0x89, 0xd4, 0xe4, 0xa7, 0x61, 0x9c, 0x2b, 0x58, + 0x7d, 0x32, 0x49, 0x47, 0x9c, 0x82, 0x58, 0xad, 0xd5, 0x1b, 0xd0, 0x0e, 0x22, 0xcf, 0xcf, 0x83, + 0x4b, 0x2e, 0x2d, 0x59, 0xc0, 0x18, 0xbf, 0x79, 0x30, 0xe6, 0x72, 0xf4, 0xa5, 0x67, 0xe4, 0x3f, + 0x0b, 0x42, 0x4e, 0x71, 0x2d, 0x5f, 0x49, 0xc1, 0x94, 0xa2, 0xa2, 0x27, 0xcb, 0xa5, 0x59, 0x40, + 0xce, 0x2f, 0x4d, 0xd8, 0x38, 0x4a, 0x78, 0xea, 0xe5, 0x5c, 0x2c, 0xea, 0xc7, 0xfe, 0x39, 0x1f, + 0x7b, 0x4a, 0x85, 0x3b, 0x60, 0xc6, 0x09, 0x5d, 0x2e, 0xe3, 0x5d, 0x90, 0x8f, 0x12, 0xd7, 0x8c, + 0x13, 0x52, 0xc2, 0xcb, 0x2e, 0xa4, 0x6d, 0xe9, 0x79, 0xe1, 0xd6, 0xbe, 0x01, 0xed, 0xa1, 0x97, + 0x7b, 0xa7, 0x5e, 0xc6, 0x95, 0x4d, 0x15, 0x4c, 0x0b, 0x2e, 0xee, 0x83, 0xd2, 0xa2, 0x02, 0x20, + 0x49, 0x74, 0x9b, 0xb4, 0xa6, 0x84, 0x90, 0xfb, 0x2c, 0x9c, 0x64, 0xe7, 0x64, 0xc6, 0xb6, 0x2b, + 0x00, 0xd4, 0xa5, 0x88, 0xf9, 0xb6, 0x6c, 0x17, 0x03, 0x80, 0xb3, 0x34, 0x1e, 0x8b, 0xc2, 0x42, + 0x0d, 0xa8, 0xed, 0x6a, 0x18, 0x45, 0x3f, 0x11, 0xeb, 0x0f, 0x94, 0x74, 0x81, 0x71, 0x72, 0x58, + 0x7a, 0xf6, 0xae, 0x0c, 0xfb, 0xc7, 0x3c, 0xf7, 0xd8, 0x86, 0x66, 0x0e, 0x40, 0x73, 0x20, 0x45, + 0x1a, 0xe3, 0x85, 0xd5, 0x43, 0x95, 0x1c, 0x4b, 0x2b, 0x39, 0xca, 0x82, 0x75, 0x0a, 0x71, 0x7a, + 0x76, 0xde, 0x83, 0x75, 0xe9, 0x91, 0x67, 0xef, 0xe2, 0xad, 0x0b, 0x7d, 0x21, 0xc8, 0xe2, 0x7a, + 0xe7, 0x4f, 0x06, 0xdc, 0x9a, 0x3a, 0xf6, 0xd2, 0xdf, 0x3f, 0xde, 0x87, 0x3a, 0x2e, 0x90, 0x7d, + 0x8b, 0x52, 0xf3, 0x1e, 0xde, 0x31, 0x57, 0xe4, 0x0e, 0x02, 0x0f, 0xa2, 0x3c, 0xbd, 0x76, 0xe9, + 0xc0, 0xc6, 0xa7, 0xd0, 0x29, 0x50, 0x28, 0xf7, 0x82, 0x5f, 0xab, 0xea, 0x7b, 0xc1, 0xaf, 0x71, + 0xa2, 0xb8, 0xf4, 0xc2, 0x89, 0x30, 0x8d, 0x6c, 0xb0, 0x15, 0xc3, 0xba, 0x82, 0xfe, 0x81, 0xf9, + 0xff, 0x86, 0xf3, 0x43, 0xe8, 0x3f, 0xf4, 0xa2, 0x61, 0x28, 0xe3, 0x51, 0x14, 0x05, 0x69, 0x82, + 0x57, 0x35, 0x13, 0x74, 0x51, 0x0a, 0x51, 0x6f, 0x88, 0xc6, 0x3b, 0xd0, 0x39, 0x55, 0xed, 0x50, + 0x1a, 0xbe, 0x44, 0x50, 0xcc, 0x3c, 0x0f, 0x33, 0xb9, 0xa6, 0xd2, 0xb3, 0x73, 0x0b, 0xd6, 0x0e, + 0x78, 0x2e, 0xee, 0xde, 0x3b, 0x1b, 0xc9, 0x9b, 0x9d, 0x2d, 0x58, 0xaf, 0xa2, 0xa5, 0x71, 0x6d, + 0xb0, 0xfc, 0xb3, 0xa2, 0xd5, 0xf8, 0x67, 0x23, 0xe7, 0x18, 0xee, 0x8a, 0x69, 0x69, 0x72, 0x8a, + 0x2a, 0x60, 0xe9, 0xfb, 0x3c, 0x19, 0x7a, 0x39, 0x57, 0x2f, 0xb1, 0x0b, 0xeb, 0x99, 0xa0, 0xed, + 0x9d, 0x8d, 0x4e, 0xe2, 0x71, 0x78, 0x9c, 0xa7, 0x41, 0xa4, 0x64, 0xcc, 0xa5, 0x39, 0x87, 0x30, + 0x58, 0x24, 0x54, 0x2a, 0xd2, 0x87, 0x96, 0xfc, 0xf8, 0x23, 0xdd, 0xac, 0xc0, 0x59, 0x3f, 0x3b, + 0x23, 0xd8, 0x38, 0xe0, 0xf9, 0xcc, 0xcc, 0x54, 0x96, 0x1d, 0xbc, 0xe3, 0xb3, 0xb2, 0x3d, 0x16, + 0x30, 0xfb, 0x1f, 0xe8, 0x9d, 0x05, 0x61, 0xce, 0x53, 0xb9, 0x73, 0xcc, 0xc4, 0x7a, 0x85, 0xec, + 0xfc, 0xcd, 0x02, 0x7b, 0xfa, 0x9a, 0xc2, 0x4f, 0xc6, 0xdc, 0xaa, 0x61, 0x56, 0xaa, 0x06, 0x83, + 0xfa, 0x18, 0x0b, 0xbb, 0xcc, 0x19, 0x7c, 0x2e, 0x13, 0xad, 0xbe, 0x20, 0xd1, 0xb6, 0x60, 0x45, + 0x4e, 0x7f, 0xb1, 0xda, 0x6b, 0xe4, 0x02, 0x31, 0x85, 0xc6, 0x81, 0x79, 0x0a, 0x45, 0xeb, 0x86, + 0xa8, 0x37, 0xf3, 0x48, 0xda, 0x34, 0xde, 0xfa, 0x06, 0xd3, 0x78, 0x22, 0x08, 0xe2, 0x13, 0x95, + 0x34, 0x59, 0x5b, 0x08, 0x9f, 0x43, 0x62, 0x6f, 0xc3, 0x6a, 0xc2, 0x23, 0x5c, 0xdc, 0x35, 0xfe, + 0x0e, 0xf1, 0xcf, 0x12, 0xf0, 0x35, 0xa9, 0x55, 0x6a, 0xbc, 0x20, 0x5e, 0x73, 0x0a, 0x8d, 0x1b, + 0x9c, 0x3f, 0xc9, 0xe3, 0x4b, 0xb5, 0xaa, 0x61, 0x32, 0x88, 0xe5, 0x7e, 0x06, 0x8f, 0x3a, 0x54, + 0x70, 0x64, 0x90, 0x9e, 0xd0, 0x61, 0x86, 0xe0, 0xfc, 0xc6, 0x80, 0x5b, 0xa5, 0x83, 0xe9, 0xa3, + 0xde, 0x0b, 0xf6, 0xde, 0x0d, 0x68, 0x67, 0xa9, 0x4f, 0x9c, 0xaa, 0x27, 0x2b, 0x98, 0x7a, 0x44, + 0x96, 0x0b, 0x9a, 0x6c, 0x60, 0x0a, 0x7e, 0xb1, 0xd7, 0xfb, 0xd0, 0x1a, 0x57, 0x1b, 0xb3, 0x04, + 0x9d, 0x3f, 0x18, 0xf0, 0xea, 0xdc, 0x78, 0xff, 0x37, 0x3e, 0x10, 0x43, 0x11, 0x14, 0x99, 0x2c, + 0x93, 0x37, 0xef, 0x1f, 0x38, 0xc9, 0x7c, 0x08, 0x4b, 0x79, 0x69, 0x19, 0xae, 0x3e, 0x10, 0xbf, + 0x52, 0x3d, 0xa8, 0x19, 0xcf, 0xad, 0xf2, 0x3b, 0x17, 0xf0, 0x4a, 0x45, 0xff, 0x4a, 0x4d, 0xdc, + 0xa5, 0xf9, 0x1e, 0x79, 0xb9, 0xac, 0x8c, 0xb7, 0x35, 0xc1, 0x62, 0x9e, 0x26, 0xaa, 0x5b, 0xf0, + 0x55, 0x52, 0xdc, 0xac, 0xa6, 0xb8, 0xf3, 0x6b, 0x13, 0x56, 0xa6, 0xae, 0x62, 0xcb, 0x60, 0x06, + 0x43, 0xe9, 0x48, 0x33, 0x18, 0x2e, 0x4c, 0x57, 0xdd, 0xb9, 0xd6, 0x94, 0x73, 0xb1, 0x40, 0xa5, + 0xfe, 0xbe, 0x97, 0x7b, 0xb2, 0xff, 0x2b, 0xb0, 0xe2, 0xf6, 0xc6, 0x94, 0xdb, 0xfb, 0xd0, 0x1a, + 0x66, 0x39, 0x9d, 0x12, 0x59, 0xa9, 0x40, 0x2c, 0xed, 0x14, 0xe7, 0xf4, 0xa9, 0x4a, 0x4c, 0x54, + 0x25, 0x82, 0xed, 0x14, 0x4b, 0x5d, 0xfb, 0x46, 0x9b, 0x48, 0xae, 0x62, 0x9e, 0xea, 0xc8, 0xa2, + 0x84, 0xf3, 0x94, 0x16, 0x51, 0x50, 0x8d, 0xa8, 0xe7, 0x53, 0x05, 0x54, 0x3a, 0xe4, 0xa5, 0xe3, + 0xe9, 0x2d, 0x35, 0x66, 0x8b, 0x50, 0x5a, 0xab, 0x46, 0x44, 0x65, 0xd2, 0xfe, 0xb9, 0x01, 0x77, + 0x55, 0x33, 0x9e, 0x1f, 0x08, 0xf7, 0xb4, 0xe6, 0x38, 0x2b, 0x49, 0x36, 0x49, 0x9a, 0xcf, 0x3f, + 0x0e, 0x43, 0xb1, 0x58, 0x99, 0x6a, 0x3e, 0x57, 0x98, 0x4a, 0x64, 0x58, 0x53, 0xc5, 0x7f, 0x9d, + 0xb4, 0x7d, 0x24, 0x7e, 0x50, 0xa8, 0xbb, 0x02, 0x70, 0x3e, 0x85, 0xc1, 0x22, 0xbd, 0x5e, 0xd6, + 0x1e, 0xce, 0x35, 0xdc, 0x15, 0x6d, 0xad, 0x14, 0xa5, 0x7e, 0x3e, 0x7a, 0x71, 0x6f, 0xaa, 0xf4, + 0x7a, 0x73, 0xba, 0xd7, 0x17, 0x9f, 0x36, 0xe9, 0x73, 0xb9, 0xa5, 0x7f, 0xda, 0x44, 0xcc, 0xf6, + 0x05, 0x34, 0xc5, 0x30, 0xc7, 0x96, 0xa0, 0xf3, 0x28, 0xa2, 0xf4, 0x3d, 0x4a, 0xec, 0x1a, 0x6b, + 0x43, 0xfd, 0x38, 0x8f, 0x13, 0xdb, 0x60, 0x1d, 0x68, 0x3c, 0xc1, 0x69, 0xde, 0x36, 0x19, 0x40, + 0x13, 0xab, 0xfd, 0x98, 0xdb, 0x16, 0xa2, 0x8f, 0x73, 0x2f, 0xcd, 0xed, 0x3a, 0xa2, 0x85, 0xfe, + 0x76, 0x83, 0x2d, 0x03, 0x7c, 0x3c, 0xc9, 0x63, 0xc9, 0xd6, 0x44, 0xda, 0x3e, 0x0f, 0x79, 0xce, + 0xed, 0xd6, 0xf6, 0x8f, 0xe8, 0xc8, 0x08, 0xc7, 0x87, 0x9e, 0xbc, 0x8b, 0x60, 0xbb, 0xc6, 0x5a, + 0x60, 0x7d, 0xc6, 0xaf, 0x6c, 0x83, 0x75, 0xa1, 0xe5, 0x4e, 0xa2, 0x28, 0x88, 0x46, 0xe2, 0x3e, + 0xba, 0x7a, 0x68, 0x5b, 0x48, 0x40, 0x85, 0x12, 0x3e, 0xb4, 0xeb, 0xac, 0x07, 0xed, 0x4f, 0xe4, + 0xcf, 0x0e, 0x76, 0x03, 0x49, 0xc8, 0x86, 0x67, 0x9a, 0x48, 0xa2, 0xcb, 0x11, 0x6a, 0x21, 0x44, + 0xa7, 0x10, 0x6a, 0x6f, 0x1f, 0x41, 0x5b, 0x6d, 0xae, 0x6c, 0x05, 0xba, 0x52, 0x07, 0x44, 0xd9, + 0x35, 0x7c, 0x21, 0x1a, 0x36, 0x6c, 0x03, 0x5f, 0x1e, 0x77, 0x50, 0xdb, 0xc4, 0x27, 0x5c, 0x34, + 0x6d, 0x8b, 0x0c, 0x72, 0x1d, 0xf9, 0x76, 0x1d, 0x19, 0x69, 0x61, 0xb1, 0x87, 0xdb, 0x8f, 0xa1, + 0x45, 0x8f, 0x47, 0x38, 0x87, 0x2d, 0x4b, 0x79, 0x12, 0x63, 0xd7, 0xd0, 0xa6, 0x78, 0xbb, 0xe0, + 0x36, 0xd0, 0x36, 0xf4, 0x3a, 0x02, 0x36, 0x51, 0x05, 0x61, 0x27, 0x81, 0xb0, 0xb6, 0x7f, 0x6c, + 0x40, 0x5b, 0xad, 0x1a, 0x6c, 0x0d, 0x56, 0x94, 0x91, 0x24, 0x4a, 0x48, 0x3c, 0xe0, 0xb9, 0x40, + 0xd8, 0x06, 0x5d, 0x50, 0x80, 0x26, 0xda, 0xd5, 0xe5, 0xe3, 0xf8, 0x92, 0x4b, 0x8c, 0x85, 0x57, + 0xe2, 0x66, 0x2b, 0xe1, 0x3a, 0x1e, 0x40, 0x98, 0xaa, 0x8c, 0xdd, 0x60, 0xb7, 0x81, 0x21, 0xf8, + 0x38, 0x18, 0x61, 0x24, 0x8b, 0xf9, 0x3f, 0xb3, 0x9b, 0xdb, 0x1f, 0x41, 0x5b, 0x8d, 0xd9, 0x9a, + 0x1e, 0x0a, 0x55, 0xe8, 0x21, 0x10, 0xb6, 0x51, 0x5e, 0x2c, 0x31, 0xe6, 0xf6, 0x33, 0x5a, 0x4f, + 0x71, 0x4a, 0xd5, 0x2c, 0x23, 0x31, 0x32, 0xbc, 0x2e, 0x82, 0x44, 0x3a, 0x9c, 0x27, 0xa1, 0xe7, + 0x17, 0x01, 0x76, 0xc9, 0xd3, 0xdc, 0xb6, 0xf0, 0xf9, 0x51, 0xf4, 0x03, 0xee, 0x63, 0x84, 0xa1, + 0x1b, 0x82, 0x2c, 0xb7, 0x1b, 0xdb, 0x87, 0xd0, 0x7d, 0xa6, 0x7a, 0xcc, 0x51, 0x82, 0x2f, 0xa0, + 0x94, 0x2b, 0xb1, 0x76, 0x0d, 0xef, 0xa4, 0xe8, 0x2c, 0xb0, 0xb6, 0xc1, 0x56, 0x61, 0x09, 0xbd, + 0x51, 0xa2, 0xcc, 0xed, 0xa7, 0xc0, 0x66, 0xab, 0x23, 0x1a, 0xad, 0x54, 0xd8, 0xae, 0xa1, 0x26, + 0x9f, 0xf1, 0x2b, 0x7c, 0x26, 0x1f, 0x3e, 0x1a, 0x45, 0x71, 0xca, 0x89, 0xa6, 0x7c, 0x48, 0xdf, + 0x17, 0x11, 0x61, 0x6d, 0x3f, 0x9b, 0xea, 0x23, 0x47, 0x89, 0x16, 0xee, 0x04, 0xdb, 0x35, 0x0a, + 0x3e, 0x92, 0x22, 0x10, 0xd2, 0x80, 0x24, 0x46, 0x60, 0x4c, 0xbc, 0x68, 0x2f, 0xe4, 0x5e, 0x2a, + 0x60, 0x6b, 0xf7, 0x1f, 0x4d, 0x68, 0x8a, 0xaa, 0xc0, 0x3e, 0x82, 0xae, 0xf6, 0x8b, 0x2f, 0xa3, + 0x22, 0x3f, 0xfb, 0xfb, 0xf4, 0xc6, 0x7f, 0xcd, 0xe0, 0x45, 0x65, 0x72, 0x6a, 0xec, 0x43, 0x80, + 0x72, 0xf1, 0x66, 0xb7, 0x68, 0x9a, 0x9b, 0x5e, 0xc4, 0x37, 0xfa, 0xf4, 0xc9, 0x66, 0xce, 0xaf, + 0xd9, 0x4e, 0x8d, 0x7d, 0x07, 0x96, 0x64, 0xf9, 0x13, 0xa1, 0xc5, 0x06, 0xda, 0xda, 0x34, 0x67, + 0xa5, 0xbe, 0x51, 0xd8, 0x27, 0x85, 0x30, 0x11, 0x3e, 0xac, 0x3f, 0x67, 0x07, 0x13, 0x62, 0x5e, + 0x59, 0xb8, 0x9d, 0x39, 0x35, 0x76, 0x00, 0x5d, 0xb1, 0x43, 0x89, 0xa2, 0x7e, 0x07, 0x79, 0x17, + 0x2d, 0x55, 0x37, 0x2a, 0xb4, 0x07, 0x3d, 0x7d, 0xed, 0x61, 0x64, 0xc9, 0x39, 0xfb, 0x91, 0x10, + 0x32, 0x6f, 0x43, 0x72, 0x6a, 0xcc, 0x83, 0xdb, 0xf3, 0x97, 0x17, 0xf6, 0x7a, 0xf9, 0x6d, 0x79, + 0xc1, 0xb6, 0xb4, 0xe1, 0xdc, 0xc4, 0x52, 0x5c, 0xf1, 0x3d, 0xe8, 0x17, 0x97, 0x17, 0x61, 0x2d, + 0xa3, 0x62, 0x20, 0x55, 0x5b, 0xb0, 0xef, 0x6c, 0xbc, 0xb6, 0x90, 0x5e, 0x88, 0x3f, 0x81, 0xd5, + 0x92, 0x21, 0x16, 0xe6, 0x63, 0x77, 0x67, 0xce, 0x55, 0xcc, 0x3a, 0x58, 0x44, 0x2e, 0xa4, 0x7e, + 0xbf, 0xdc, 0xd8, 0xab, 0x92, 0x5f, 0xd7, 0x7d, 0x3b, 0x5f, 0xba, 0x73, 0x13, 0x4b, 0x71, 0xc3, + 0x13, 0x58, 0xa9, 0xf4, 0x53, 0x25, 0xfb, 0xc6, 0x26, 0x7b, 0x53, 0x40, 0xdc, 0xef, 0x7f, 0xf1, + 0xd5, 0xc0, 0xf8, 0xf2, 0xab, 0x81, 0xf1, 0xf7, 0xaf, 0x06, 0xc6, 0x4f, 0xbf, 0x1e, 0xd4, 0xbe, + 0xfc, 0x7a, 0x50, 0xfb, 0xeb, 0xd7, 0x83, 0xda, 0x69, 0x93, 0xfe, 0x25, 0xf2, 0xbf, 0xff, 0x0a, + 0x00, 0x00, 0xff, 0xff, 0x1d, 0x07, 0x2d, 0x0f, 0x37, 0x22, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4716,8 +4716,8 @@ func (m *SyncStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x98 } - if m.IOTotalBytes != 0 { - i = encodeVarintDmworker(dAtA, i, uint64(m.IOTotalBytes)) + if m.IoTotalBytes != 0 { + i = encodeVarintDmworker(dAtA, i, uint64(m.IoTotalBytes)) i-- dAtA[i] = 0x1 i-- @@ -7094,8 +7094,8 @@ func (m *SyncStatus) Size() (n int) { if m.RecentRps != 0 { n += 2 + sovDmworker(uint64(m.RecentRps)) } - if m.IOTotalBytes != 0 { - n += 2 + sovDmworker(uint64(m.IOTotalBytes)) + if m.IoTotalBytes != 0 { + n += 2 + sovDmworker(uint64(m.IoTotalBytes)) } if m.DumpIOTotalBytes != 0 { n += 2 + sovDmworker(uint64(m.DumpIOTotalBytes)) @@ -9678,9 +9678,9 @@ func (m *SyncStatus) Unmarshal(dAtA []byte) error { } case 18: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IOTotalBytes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IoTotalBytes", wireType) } - m.IOTotalBytes = 0 + m.IoTotalBytes = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowDmworker @@ -9690,7 +9690,7 @@ func (m *SyncStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.IOTotalBytes |= uint64(b&0x7F) << shift + m.IoTotalBytes |= uint64(b&0x7F) << shift if b < 0x80 { break } diff --git a/dm/proto/dmworker.proto b/dm/proto/dmworker.proto index c2701a31c17..152227c1836 100644 --- a/dm/proto/dmworker.proto +++ b/dm/proto/dmworker.proto @@ -166,8 +166,8 @@ message SyncStatus { int64 totalRows = 15; int64 totalRps = 16; int64 recentRps = 17; - uint64 iOTotalBytes = 18; - uint64 dumpIOTotalBytes = 19; + uint64 ioTotalBytes = 18; // meter TCP io to downstream of the subtask + uint64 dumpIOTotalBytes = 19; // meter TCP io from upstream of the subtask } // SourceStatus represents status for source runing on dm-worker From 95e21864b607f28a22cddf6b0764cf9799c896ca Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:52:49 +0800 Subject: [PATCH 27/50] fix test --- dm/config/subtask_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dm/config/subtask_test.go b/dm/config/subtask_test.go index 58039b0f63d..c750446ff30 100644 --- a/dm/config/subtask_test.go +++ b/dm/config/subtask_test.go @@ -416,6 +416,6 @@ func TestSubTaskConfigMarshalAtomic(t *testing.T) { } wg.Wait() - require.GreaterOrEqual(t, cfg.IOTotalBytes.Load(), uint64(100)) - require.GreaterOrEqual(t, cfg.DumpIOTotalBytes.Load(), uint64(200)) + require.Equal(t, cfg.IOTotalBytes.Load(), uint64(110)) + require.Equal(t, cfg.DumpIOTotalBytes.Load(), uint64(210)) } From 8a6dd8ca89af2bf3409fc2b6e7926751c64f2c5b Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 15 Nov 2024 18:00:09 +0800 Subject: [PATCH 28/50] abstract InitIOCounters --- dm/config/subtask.go | 9 +++++++++ dm/config/task_converters.go | 12 ++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/dm/config/subtask.go b/dm/config/subtask.go index 004450b7a78..87d836779f3 100644 --- a/dm/config/subtask.go +++ b/dm/config/subtask.go @@ -28,6 +28,7 @@ import ( "time" "github.com/BurntSushi/toml" + "github.com/google/uuid" extstorage "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/util/dbutil" "github.com/pingcap/tidb/pkg/util/filter" @@ -214,6 +215,14 @@ func (c *SubTaskConfig) SetFlagSet(flagSet *flag.FlagSet) { c.flagSet = flagSet } +// InitIOCounters init io counter and uuid for syncer. +func (c *SubTaskConfig) InitIOCounters() { + c.IOTotalBytes = atomic.NewUint64(0) + c.DumpIOTotalBytes = atomic.NewUint64(0) + c.UUID = uuid.NewString() + c.DumpUUID = uuid.NewString() +} + // String returns the config's json string. func (c *SubTaskConfig) String() string { cfg, err := json.Marshal(c) diff --git a/dm/config/task_converters.go b/dm/config/task_converters.go index b45dac542ac..98a9373e066 100644 --- a/dm/config/task_converters.go +++ b/dm/config/task_converters.go @@ -17,7 +17,6 @@ import ( "fmt" "strings" - "github.com/google/uuid" "github.com/pingcap/tidb/pkg/util/filter" router "github.com/pingcap/tidb/pkg/util/table-router" "github.com/pingcap/tiflow/dm/config/dbconfig" @@ -28,7 +27,6 @@ import ( "github.com/pingcap/tiflow/dm/pkg/terror" bf "github.com/pingcap/tiflow/pkg/binlog-filter" "github.com/pingcap/tiflow/pkg/column-mapping" - "go.uber.org/atomic" "go.uber.org/zap" ) @@ -103,10 +101,7 @@ func TaskConfigToSubTaskConfigs(c *TaskConfig, sources map[string]dbconfig.DBCon cfg.CleanDumpFile = c.CleanDumpFile - cfg.IOTotalBytes = atomic.NewUint64(0) - cfg.DumpIOTotalBytes = atomic.NewUint64(0) - cfg.UUID = uuid.NewString() - cfg.DumpUUID = uuid.NewString() + cfg.InitIOCounters() if err := cfg.Adjust(true); err != nil { return nil, terror.Annotatef(err, "source %s", inst.SourceID) @@ -316,10 +311,7 @@ func OpenAPITaskToSubTaskConfigs(task *openapi.Task, toDBCfg *dbconfig.DBConfig, subTaskCfg.IgnoreCheckingItems = *task.IgnoreCheckingItems } // set syncer IO total bytes counter - subTaskCfg.IOTotalBytes = atomic.NewUint64(0) - subTaskCfg.DumpIOTotalBytes = atomic.NewUint64(0) - subTaskCfg.UUID = uuid.NewString() - subTaskCfg.DumpUUID = uuid.NewString() + subTaskCfg.InitIOCounters() // adjust sub task config if err := subTaskCfg.Adjust(true); err != nil { return nil, terror.Annotatef(err, "source name %s", sourceCfg.SourceName) From 8a587dff769b4914cd919ba9561ddda14d3e3c5e Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 15 Nov 2024 18:06:31 +0800 Subject: [PATCH 29/50] fix --- dm/master/openapi_controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dm/master/openapi_controller.go b/dm/master/openapi_controller.go index fc57b1bfac0..e15a2f19899 100644 --- a/dm/master/openapi_controller.go +++ b/dm/master/openapi_controller.go @@ -584,7 +584,7 @@ func (s *Server) getTaskStatus(ctx context.Context, taskName string) ([]openapi. SyncerBinlogGtid: syncerS.SyncerBinlogGtid, TotalEvents: syncerS.TotalEvents, TotalTps: syncerS.TotalTps, - IoTotalBytes: syncerS.IOTotalBytes, + IoTotalBytes: syncerS.IoTotalBytes, DumpIoTotalBytes: syncerS.DumpIOTotalBytes, } if unResolvedGroups := syncerS.GetUnresolvedGroups(); len(unResolvedGroups) > 0 { From 2985a84b57e2ca04ab04289cff9b5224ae68c63b Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 15 Nov 2024 18:10:11 +0800 Subject: [PATCH 30/50] fix --- dm/syncer/status.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dm/syncer/status.go b/dm/syncer/status.go index 0e0e185d447..e2687ab7e42 100644 --- a/dm/syncer/status.go +++ b/dm/syncer/status.go @@ -40,7 +40,7 @@ func (s *Syncer) Status(sourceStatus *binlog.SourceStatus) interface{} { SecondsBehindMaster: s.secondsBehindMaster.Load(), } if s.cfg.IOTotalBytes != nil { - st.IOTotalBytes = s.cfg.IOTotalBytes.Load() + st.IoTotalBytes = s.cfg.IOTotalBytes.Load() } if s.cfg.DumpIOTotalBytes != nil { st.DumpIOTotalBytes = s.cfg.DumpIOTotalBytes.Load() From 2fc01107ab0c83219de42114bab781d50e02d862 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:36:58 +0800 Subject: [PATCH 31/50] fix proto comment and regenerate protobuf --- dm/pb/dmworker.pb.go | 6 ++++-- dm/proto/dmworker.proto | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/dm/pb/dmworker.pb.go b/dm/pb/dmworker.pb.go index 3edecd7a2b1..38d77a300a7 100644 --- a/dm/pb/dmworker.pb.go +++ b/dm/pb/dmworker.pb.go @@ -961,8 +961,10 @@ type SyncStatus struct { TotalRows int64 `protobuf:"varint,15,opt,name=totalRows,proto3" json:"totalRows,omitempty"` TotalRps int64 `protobuf:"varint,16,opt,name=totalRps,proto3" json:"totalRps,omitempty"` RecentRps int64 `protobuf:"varint,17,opt,name=recentRps,proto3" json:"recentRps,omitempty"` - IoTotalBytes uint64 `protobuf:"varint,18,opt,name=ioTotalBytes,proto3" json:"ioTotalBytes,omitempty"` - DumpIOTotalBytes uint64 `protobuf:"varint,19,opt,name=dumpIOTotalBytes,proto3" json:"dumpIOTotalBytes,omitempty"` + // meter TCP io to downstream of the subtask + IoTotalBytes uint64 `protobuf:"varint,18,opt,name=ioTotalBytes,proto3" json:"ioTotalBytes,omitempty"` + // meter TCP io from upstream of the subtask + DumpIOTotalBytes uint64 `protobuf:"varint,19,opt,name=dumpIOTotalBytes,proto3" json:"dumpIOTotalBytes,omitempty"` } func (m *SyncStatus) Reset() { *m = SyncStatus{} } diff --git a/dm/proto/dmworker.proto b/dm/proto/dmworker.proto index 152227c1836..4d92b336f96 100644 --- a/dm/proto/dmworker.proto +++ b/dm/proto/dmworker.proto @@ -166,8 +166,10 @@ message SyncStatus { int64 totalRows = 15; int64 totalRps = 16; int64 recentRps = 17; - uint64 ioTotalBytes = 18; // meter TCP io to downstream of the subtask - uint64 dumpIOTotalBytes = 19; // meter TCP io from upstream of the subtask + // meter TCP io to downstream of the subtask + uint64 ioTotalBytes = 18; + // meter TCP io from upstream of the subtask + uint64 dumpIOTotalBytes = 19; } // SourceStatus represents status for source runing on dm-worker From e9f348f07da921fdba8fef5dcc39ec3035de2dba Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:24:07 +0800 Subject: [PATCH 32/50] validate io counter fields in openapi --- dm/tests/openapi/client/openapi_task_check | 32 ++++++++++++++++++++++ dm/tests/openapi/run.sh | 7 +++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index 3fbf9a67249..b72ea1edd10 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -413,6 +413,37 @@ def get_task_status_success(task_name, total): print("get_task_status_success resp=", data) assert data["total"] == int(total) +def get_task_io_counter_success(task_name, total): + url = API_ENDPOINT + "/" + task_name + "/status" + resp = requests.get(url=url) + data = resp.json() + assert resp.status_code == 200 + print("get_task_io_counter_success resp=", data) + assert data["total"] == int(total) + + for item in data.get("data", []): + unit = item.get("unit") + sync_status = item.get("sync_status", {}) + + # Only validate I/O statistics if the unit is "Sync" + if unit == "Sync": + dump_io_total_bytes = sync_status.get("dump_io_total_bytes") + io_total_bytes = sync_status.get("io_total_bytes") + + if dump_io_total_bytes is None or io_total_bytes is None: + print(f"Validation failed for worker {item.get('worker_name')}: Missing I/O statistics.") + continue + + if dump_io_total_bytes < 0: + print(f"Validation failed for worker {item.get('worker_name')}: dump_io_total_bytes is negative: {dump_io_total_bytes}") + + if io_total_bytes < 0: + print(f"Validation failed for worker {item.get('worker_name')}: io_total_bytes is negative: {io_total_bytes}") + + print(f"Worker {item.get('worker_name')} - dump_io_total_bytes: {dump_io_total_bytes}, io_total_bytes: {io_total_bytes}") + else: + print(f"Skipping validation for worker {item.get('worker_name')} as unit is not 'Sync'.") + def get_task_status_success_but_worker_meet_error(task_name, total): url = API_ENDPOINT + "/" + task_name + "/status" @@ -758,6 +789,7 @@ if __name__ == "__main__": "get_illegal_char_task_status_failed": get_illegal_char_task_status_failed, "get_task_status_success": get_task_status_success, "get_task_status_success_but_worker_meet_error": get_task_status_success_but_worker_meet_error, + "get_task_io_counter_success": get_task_io_counter_success, "operate_schema_and_table_success": operate_schema_and_table_success, "create_task_template_success": create_task_template_success, "create_task_template_failed": create_task_template_failed, diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index aceae7c16b2..128e08a79ec 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -281,8 +281,9 @@ function test_shard_task() { # get illegal char task_status failed openapi_task_check get_illegal_char_task_status_failed - # get task status success + # get task status and io counter success openapi_task_check "get_task_status_success" "$task_name" 2 + openapi_task_check "get_task_io_counter_success" "$task_name" 2 # get task list openapi_task_check "get_task_list" 1 @@ -342,8 +343,9 @@ function test_noshard_task() { # get task status failed openapi_task_check "get_task_status_failed" "not a task name" - # get task status success + # get task status and io counter success openapi_task_check "get_task_status_success" "$task_name" 2 + openapi_task_check "get_task_io_counter_success" "$task_name" 2 # delete source with force openapi_source_check "delete_source_with_force_success" "mysql-01" @@ -405,6 +407,7 @@ function test_complex_operations_of_source_and_task() { init_noshard_data check_sync_diff $WORK_DIR $cur/conf/diff_config_no_shard.toml openapi_task_check "get_task_status_success" "$task_name" 2 + openapi_task_check "get_task_io_counter_success" "$task_name" 2 # do some complex operations openapi_task_check "do_complex_operations" "$task_name" From 50459c1342a589502b653cdd0a519226a0d84bf7 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Mon, 18 Nov 2024 14:00:01 +0800 Subject: [PATCH 33/50] fix test --- dm/tests/openapi/client/openapi_task_check | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index b72ea1edd10..b35f7ed090f 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -431,18 +431,19 @@ def get_task_io_counter_success(task_name, total): io_total_bytes = sync_status.get("io_total_bytes") if dump_io_total_bytes is None or io_total_bytes is None: - print(f"Validation failed for worker {item.get('worker_name')}: Missing I/O statistics.") + print("Validation failed for worker {}: Missing I/O statistics.".format(item.get('worker_name'))) continue if dump_io_total_bytes < 0: - print(f"Validation failed for worker {item.get('worker_name')}: dump_io_total_bytes is negative: {dump_io_total_bytes}") + print("Validation failed for worker {}: dump_io_total_bytes is negative: {}".format(item.get('worker_name'), dump_io_total_bytes)) if io_total_bytes < 0: - print(f"Validation failed for worker {item.get('worker_name')}: io_total_bytes is negative: {io_total_bytes}") + print("Validation failed for worker {}: io_total_bytes is negative: {}".format(item.get('worker_name'), io_total_bytes)) - print(f"Worker {item.get('worker_name')} - dump_io_total_bytes: {dump_io_total_bytes}, io_total_bytes: {io_total_bytes}") + # Optionally, you can add more validation logic here + print("Worker {} - dump_io_total_bytes: {}, io_total_bytes: {}".format(item.get('worker_name'), dump_io_total_bytes, io_total_bytes)) else: - print(f"Skipping validation for worker {item.get('worker_name')} as unit is not 'Sync'.") + print("Skipping validation for worker {} as unit is not 'Sync'.".format(item.get('worker_name'))) def get_task_status_success_but_worker_meet_error(task_name, total): From cb1721808d2c488bdc9e91add670481bd87ab9c5 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Mon, 18 Nov 2024 14:11:34 +0800 Subject: [PATCH 34/50] f --- dm/tests/openapi/client/openapi_task_check | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index b35f7ed090f..85d814ab72b 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -424,26 +424,14 @@ def get_task_io_counter_success(task_name, total): for item in data.get("data", []): unit = item.get("unit") sync_status = item.get("sync_status", {}) - # Only validate I/O statistics if the unit is "Sync" if unit == "Sync": dump_io_total_bytes = sync_status.get("dump_io_total_bytes") io_total_bytes = sync_status.get("io_total_bytes") - - if dump_io_total_bytes is None or io_total_bytes is None: - print("Validation failed for worker {}: Missing I/O statistics.".format(item.get('worker_name'))) - continue - - if dump_io_total_bytes < 0: - print("Validation failed for worker {}: dump_io_total_bytes is negative: {}".format(item.get('worker_name'), dump_io_total_bytes)) - - if io_total_bytes < 0: - print("Validation failed for worker {}: io_total_bytes is negative: {}".format(item.get('worker_name'), io_total_bytes)) - - # Optionally, you can add more validation logic here - print("Worker {} - dump_io_total_bytes: {}, io_total_bytes: {}".format(item.get('worker_name'), dump_io_total_bytes, io_total_bytes)) + assert dump_io_total_bytes is not None and io_total_bytes is not None + assert dump_io_total_bytes > 0 and io_total_bytes > 0 else: - print("Skipping validation for worker {} as unit is not 'Sync'.".format(item.get('worker_name'))) + print("Skipping validation for task stage is not 'Sync'.") def get_task_status_success_but_worker_meet_error(task_name, total): From b17f629b4a8e4b56a8f30efb7869fbd266f84cfa Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:52:42 +0800 Subject: [PATCH 35/50] expose all dump and load task status fileds --- dm/openapi/gen.server.go | 194 +++++++++++++++++++-------------------- dm/openapi/gen.types.go | 3 + dm/openapi/spec/dm.yaml | 10 ++ 3 files changed, 110 insertions(+), 97 deletions(-) diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index 5b130c5ab65..37b892d61b8 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -1259,103 +1259,103 @@ var swaggerSpec = []string{ "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/dm/openapi/gen.types.go b/dm/openapi/gen.types.go index c54a75b2a83..6a2c9edf93b 100644 --- a/dm/openapi/gen.types.go +++ b/dm/openapi/gen.types.go @@ -165,10 +165,12 @@ type DisableRelayRequest struct { // status of dump unit type DumpStatus struct { + Bps int64 `json:"bps"` CompletedTables float64 `json:"completed_tables"` EstimateTotalRows float64 `json:"estimate_total_rows"` FinishedBytes float64 `json:"finished_bytes"` FinishedRows float64 `json:"finished_rows"` + Progress string `json:"progress"` TotalTables int64 `json:"total_tables"` } @@ -260,6 +262,7 @@ type GrafanaTopology struct { // status of load unit type LoadStatus struct { + Bps *int64 `json:"bps,omitempty"` FinishedBytes int64 `json:"finished_bytes"` MetaBinlog string `json:"meta_binlog"` MetaBinlogGtid string `json:"meta_binlog_gtid"` diff --git a/dm/openapi/spec/dm.yaml b/dm/openapi/spec/dm.yaml index 525698f563a..2033d0440a5 100644 --- a/dm/openapi/spec/dm.yaml +++ b/dm/openapi/spec/dm.yaml @@ -1456,6 +1456,9 @@ components: type: string meta_binlog_gtid: type: string + bps: + type: integer + format: int64 required: - "finished_bytes" - "total_bytes" @@ -1540,12 +1543,19 @@ components: estimate_total_rows: type: number format: double + bps: + type: integer + format: int64 + progress: + type: string required: - "total_tables" - "completed_tables" - "finished_bytes" - "finished_rows" - "estimate_total_rows" + - "bps" + - "progress" SubTaskStatus: type: object properties: From b2966e24b58089eefe6219ffed59a2f4d4662106 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Tue, 19 Nov 2024 22:50:19 +0800 Subject: [PATCH 36/50] fix openapi spec and regenerate --- dm/master/openapi_controller.go | 3 + dm/openapi/gen.server.go | 169 ++++++++++++++++---------------- dm/openapi/gen.types.go | 2 +- dm/openapi/spec/dm.yaml | 1 + 4 files changed, 90 insertions(+), 85 deletions(-) diff --git a/dm/master/openapi_controller.go b/dm/master/openapi_controller.go index e15a2f19899..bb74026a8e2 100644 --- a/dm/master/openapi_controller.go +++ b/dm/master/openapi_controller.go @@ -563,6 +563,7 @@ func (s *Server) getTaskStatus(ctx context.Context, taskName string) ([]openapi. // add load status if loadS := subTaskStatus.GetLoad(); loadS != nil { openapiSubTaskStatus.LoadStatus = &openapi.LoadStatus{ + Bps: loadS.Bps, FinishedBytes: loadS.FinishedBytes, MetaBinlog: loadS.MetaBinlog, MetaBinlogGtid: loadS.MetaBinlogGTID, @@ -603,10 +604,12 @@ func (s *Server) getTaskStatus(ctx context.Context, taskName string) ([]openapi. // add dump status if dumpS := subTaskStatus.GetDump(); dumpS != nil { openapiSubTaskStatus.DumpStatus = &openapi.DumpStatus{ + Bps: dumpS.Bps, CompletedTables: dumpS.CompletedTables, EstimateTotalRows: dumpS.EstimateTotalRows, FinishedBytes: dumpS.FinishedBytes, FinishedRows: dumpS.FinishedRows, + Progress: dumpS.Progress, TotalTables: dumpS.TotalTables, } } diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index 37b892d61b8..2a7495f28db 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -1272,90 +1272,91 @@ var swaggerSpec = []string{ "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", + "AA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/dm/openapi/gen.types.go b/dm/openapi/gen.types.go index 6a2c9edf93b..cc202edd30e 100644 --- a/dm/openapi/gen.types.go +++ b/dm/openapi/gen.types.go @@ -262,7 +262,7 @@ type GrafanaTopology struct { // status of load unit type LoadStatus struct { - Bps *int64 `json:"bps,omitempty"` + Bps int64 `json:"bps"` FinishedBytes int64 `json:"finished_bytes"` MetaBinlog string `json:"meta_binlog"` MetaBinlogGtid string `json:"meta_binlog_gtid"` diff --git a/dm/openapi/spec/dm.yaml b/dm/openapi/spec/dm.yaml index 2033d0440a5..cb281c7ef36 100644 --- a/dm/openapi/spec/dm.yaml +++ b/dm/openapi/spec/dm.yaml @@ -1465,6 +1465,7 @@ components: - "progress" - "meta_binlog" - "meta_binlog_gtid" + - "bps" SyncStatus: type: object description: "status of sync unit" From 63bee24578c71a8c3c7de07c1c02f74f2107d63e Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:08:31 +0800 Subject: [PATCH 37/50] debug --- dm/master/openapi_view_test.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/dm/master/openapi_view_test.go b/dm/master/openapi_view_test.go index aa144edc169..14d8bf28aa0 100644 --- a/dm/master/openapi_view_test.go +++ b/dm/master/openapi_view_test.go @@ -1056,6 +1056,26 @@ func (s *OpenAPIViewSuite) TestTaskAPI() { s.Equal(float64(0), resultTaskStatus.Data[0].DumpStatus.CompletedTables) s.Equal(int64(1), resultTaskStatus.Data[0].DumpStatus.TotalTables) s.Equal(float64(10), resultTaskStatus.Data[0].DumpStatus.EstimateTotalRows) + fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedBytes) + fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedRows) + + result = testutil.NewRequest().Get(taskStatusURL).GoWithHTTPHandler(s.T(), s1.openapiHandles) + s.Equal(http.StatusOK, result.Code()) + s.NoError(result.UnmarshalBodyToObject(&resultTaskStatus)) + fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedBytes) + fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedRows) + + result = testutil.NewRequest().Get(taskStatusURL).GoWithHTTPHandler(s.T(), s1.openapiHandles) + s.Equal(http.StatusOK, result.Code()) + s.NoError(result.UnmarshalBodyToObject(&resultTaskStatus)) + fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedBytes) + fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedRows) + + result = testutil.NewRequest().Get(taskStatusURL).GoWithHTTPHandler(s.T(), s1.openapiHandles) + s.Equal(http.StatusOK, result.Code()) + s.NoError(result.UnmarshalBodyToObject(&resultTaskStatus)) + fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedBytes) + fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedRows) // get task status with source name taskStatusURL = fmt.Sprintf("%s/%s/status?source_name_list=%s", taskURL, task.Name, source1Name) From ae3c3f15a82b95c96c0adf143e493d7c5e38d275 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:56:13 +0800 Subject: [PATCH 38/50] add test validate dump status --- dm/master/openapi_view_test.go | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/dm/master/openapi_view_test.go b/dm/master/openapi_view_test.go index 14d8bf28aa0..e30b4416b32 100644 --- a/dm/master/openapi_view_test.go +++ b/dm/master/openapi_view_test.go @@ -1023,7 +1023,6 @@ func (s *OpenAPIViewSuite) TestTaskAPI() { s.NoError(result.UnmarshalBodyToObject(&updateResp)) s.EqualValues(updateResp.Task.SourceConfig.IncrMigrateConf.ReplBatch, clone.SourceConfig.IncrMigrateConf.ReplBatch) s.NoError(failpoint.Disable("github.com/pingcap/tiflow/dm/master/scheduler/operateCheckSubtasksCanUpdate")) - // list tasks result = testutil.NewRequest().Get(taskURL).GoWithHTTPHandler(s.T(), s1.openapiHandles) s.Equal(http.StatusOK, result.Code()) @@ -1056,26 +1055,9 @@ func (s *OpenAPIViewSuite) TestTaskAPI() { s.Equal(float64(0), resultTaskStatus.Data[0].DumpStatus.CompletedTables) s.Equal(int64(1), resultTaskStatus.Data[0].DumpStatus.TotalTables) s.Equal(float64(10), resultTaskStatus.Data[0].DumpStatus.EstimateTotalRows) - fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedBytes) - fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedRows) - - result = testutil.NewRequest().Get(taskStatusURL).GoWithHTTPHandler(s.T(), s1.openapiHandles) - s.Equal(http.StatusOK, result.Code()) - s.NoError(result.UnmarshalBodyToObject(&resultTaskStatus)) - fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedBytes) - fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedRows) - - result = testutil.NewRequest().Get(taskStatusURL).GoWithHTTPHandler(s.T(), s1.openapiHandles) - s.Equal(http.StatusOK, result.Code()) - s.NoError(result.UnmarshalBodyToObject(&resultTaskStatus)) - fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedBytes) - fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedRows) - - result = testutil.NewRequest().Get(taskStatusURL).GoWithHTTPHandler(s.T(), s1.openapiHandles) - s.Equal(http.StatusOK, result.Code()) - s.NoError(result.UnmarshalBodyToObject(&resultTaskStatus)) - fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedBytes) - fmt.Println(resultTaskStatus.Data[0].DumpStatus.FinishedRows) + s.Equal(int64(0), resultTaskStatus.Data[0].DumpStatus.Bps) + s.Equal(float64(0), resultTaskStatus.Data[0].DumpStatus.FinishedBytes) + s.Equal(float64(5), resultTaskStatus.Data[0].DumpStatus.FinishedRows) // get task status with source name taskStatusURL = fmt.Sprintf("%s/%s/status?source_name_list=%s", taskURL, task.Name, source1Name) From ab51fa9ea7e5b0d2b68f26f1cc9db57b1739cbd1 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Wed, 20 Nov 2024 18:08:08 +0800 Subject: [PATCH 39/50] f --- dm/master/openapi_view_test.go | 1 + dm/tests/openapi/client/openapi_task_check | 31 +++++++++++--------- dm/tests/openapi/run.sh | 34 +++++++++++----------- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/dm/master/openapi_view_test.go b/dm/master/openapi_view_test.go index e30b4416b32..aab897e28cc 100644 --- a/dm/master/openapi_view_test.go +++ b/dm/master/openapi_view_test.go @@ -1023,6 +1023,7 @@ func (s *OpenAPIViewSuite) TestTaskAPI() { s.NoError(result.UnmarshalBodyToObject(&updateResp)) s.EqualValues(updateResp.Task.SourceConfig.IncrMigrateConf.ReplBatch, clone.SourceConfig.IncrMigrateConf.ReplBatch) s.NoError(failpoint.Disable("github.com/pingcap/tiflow/dm/master/scheduler/operateCheckSubtasksCanUpdate")) + // list tasks result = testutil.NewRequest().Get(taskURL).GoWithHTTPHandler(s.T(), s1.openapiHandles) s.Equal(http.StatusOK, result.Code()) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index 85d814ab72b..265962344d9 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -410,29 +410,32 @@ def get_task_status_success(task_name, total): resp = requests.get(url=url) data = resp.json() assert resp.status_code == 200 - print("get_task_status_success resp=", data) + print("get_task_status_success resp=") assert data["total"] == int(total) -def get_task_io_counter_success(task_name, total): +def check_sync_task_status_success( + task_name, + min_dump_io_total_bytes=0, + max_dump_io_total_bytes=float('inf'), + min_io_total_bytes=0, + max_io_total_bytes=float('inf') +): url = API_ENDPOINT + "/" + task_name + "/status" resp = requests.get(url=url) data = resp.json() assert resp.status_code == 200 - print("get_task_io_counter_success resp=", data) - assert data["total"] == int(total) + print("check_sync_task_status_success resp=", data) for item in data.get("data", []): + # Only validate sync task status unit = item.get("unit") + assert unit == "Sync" sync_status = item.get("sync_status", {}) - # Only validate I/O statistics if the unit is "Sync" - if unit == "Sync": - dump_io_total_bytes = sync_status.get("dump_io_total_bytes") - io_total_bytes = sync_status.get("io_total_bytes") - assert dump_io_total_bytes is not None and io_total_bytes is not None - assert dump_io_total_bytes > 0 and io_total_bytes > 0 - else: - print("Skipping validation for task stage is not 'Sync'.") - + dump_io_total_bytes = sync_status.get("dump_io_total_bytes") + io_total_bytes = sync_status.get("io_total_bytes") + assert dump_io_total_bytes is not None and io_total_bytes is not None + assert dump_io_total_bytes > min_dump_io_total_bytes and io_total_bytes > min_io_total_bytes + assert dump_io_total_bytes < max_dump_io_total_bytes and io_total_bytes < max_io_total_bytes def get_task_status_success_but_worker_meet_error(task_name, total): url = API_ENDPOINT + "/" + task_name + "/status" @@ -778,7 +781,7 @@ if __name__ == "__main__": "get_illegal_char_task_status_failed": get_illegal_char_task_status_failed, "get_task_status_success": get_task_status_success, "get_task_status_success_but_worker_meet_error": get_task_status_success_but_worker_meet_error, - "get_task_io_counter_success": get_task_io_counter_success, + "check_sync_task_status_success": check_sync_task_status_success, "operate_schema_and_table_success": operate_schema_and_table_success, "create_task_template_success": create_task_template_success, "create_task_template_failed": create_task_template_failed, diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index 128e08a79ec..a14ae3fdd62 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -283,7 +283,7 @@ function test_shard_task() { # get task status and io counter success openapi_task_check "get_task_status_success" "$task_name" 2 - openapi_task_check "get_task_io_counter_success" "$task_name" 2 + openapi_task_check "check_sync_task_status_success" "$task_name" 3400 5000 20000 30000 # get task list openapi_task_check "get_task_list" 1 @@ -298,7 +298,7 @@ function test_shard_task() { # get task list openapi_task_check "get_task_list" 0 - + # delete source success clean_cluster_sources_and_tasks echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TEST OPENAPI: SHARD TASK SUCCESS" @@ -345,7 +345,7 @@ function test_noshard_task() { # get task status and io counter success openapi_task_check "get_task_status_success" "$task_name" 2 - openapi_task_check "get_task_io_counter_success" "$task_name" 2 + openapi_task_check "check_sync_task_status_success" "$task_name" # delete source with force openapi_source_check "delete_source_with_force_success" "mysql-01" @@ -407,7 +407,7 @@ function test_complex_operations_of_source_and_task() { init_noshard_data check_sync_diff $WORK_DIR $cur/conf/diff_config_no_shard.toml openapi_task_check "get_task_status_success" "$task_name" 2 - openapi_task_check "get_task_io_counter_success" "$task_name" 2 + openapi_task_check "check_sync_task_status_success" "$task_name" # do some complex operations openapi_task_check "do_complex_operations" "$task_name" @@ -1089,21 +1089,21 @@ function run() { run_dm_worker $WORK_DIR/worker2 $WORKER2_PORT $cur/conf/dm-worker2.toml check_rpc_alive $cur/../bin/check_worker_online 127.0.0.1:$WORKER2_PORT - test_relay - test_source + # test_relay + # test_source test_shard_task - test_multi_tasks - test_noshard_task - test_dump_task - test_task_templates - test_noshard_task_dump_status - test_complex_operations_of_source_and_task - test_task_with_ignore_check_items - test_delete_task_with_stopped_downstream - test_start_task_with_condition - test_stop_task_with_condition - test_reverse_https + # test_multi_tasks + # test_noshard_task + # test_dump_task + # test_task_templates + # test_noshard_task_dump_status + # test_complex_operations_of_source_and_task + # test_task_with_ignore_check_items + # test_delete_task_with_stopped_downstream + # test_start_task_with_condition + # test_stop_task_with_condition + # test_reverse_https # NOTE: this test case MUST running at last, because it will offline some members of cluster test_cluster From 6f2eddb05e9c437a4738a7c7a70f2712a059e9d4 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 21 Nov 2024 15:52:29 +0800 Subject: [PATCH 40/50] revert --- dm/tests/openapi/run.sh | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index a14ae3fdd62..a0eedc642c1 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -1089,21 +1089,21 @@ function run() { run_dm_worker $WORK_DIR/worker2 $WORKER2_PORT $cur/conf/dm-worker2.toml check_rpc_alive $cur/../bin/check_worker_online 127.0.0.1:$WORKER2_PORT - # test_relay - # test_source + test_relay + test_source test_shard_task - # test_multi_tasks - # test_noshard_task - # test_dump_task - # test_task_templates - # test_noshard_task_dump_status - # test_complex_operations_of_source_and_task - # test_task_with_ignore_check_items - # test_delete_task_with_stopped_downstream - # test_start_task_with_condition - # test_stop_task_with_condition - # test_reverse_https + test_multi_tasks + test_noshard_task + test_dump_task + test_task_templates + test_noshard_task_dump_status + test_complex_operations_of_source_and_task + test_task_with_ignore_check_items + test_delete_task_with_stopped_downstream + test_start_task_with_condition + test_stop_task_with_condition + test_reverse_https # NOTE: this test case MUST running at last, because it will offline some members of cluster test_cluster From c7a3a200a3c8384c17045b3d08682e49eef7a811 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 21 Nov 2024 17:45:02 +0800 Subject: [PATCH 41/50] fix type --- dm/tests/openapi/client/openapi_task_check | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index 265962344d9..cbdf90e8807 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -428,14 +428,13 @@ def check_sync_task_status_success( for item in data.get("data", []): # Only validate sync task status - unit = item.get("unit") - assert unit == "Sync" + assert item.get("unit") == "Sync" sync_status = item.get("sync_status", {}) dump_io_total_bytes = sync_status.get("dump_io_total_bytes") io_total_bytes = sync_status.get("io_total_bytes") assert dump_io_total_bytes is not None and io_total_bytes is not None - assert dump_io_total_bytes > min_dump_io_total_bytes and io_total_bytes > min_io_total_bytes - assert dump_io_total_bytes < max_dump_io_total_bytes and io_total_bytes < max_io_total_bytes + assert dump_io_total_bytes > int(min_dump_io_total_bytes) and io_total_bytes > int(min_io_total_bytes) + assert dump_io_total_bytes < int(max_dump_io_total_bytes) and io_total_bytes < int(max_io_total_bytes) def get_task_status_success_but_worker_meet_error(task_name, total): url = API_ENDPOINT + "/" + task_name + "/status" From 0a1f59f4ed056288577cff0e72a27628c15cc2f7 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Thu, 21 Nov 2024 17:47:44 +0800 Subject: [PATCH 42/50] fmt --- dm/tests/openapi/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index a0eedc642c1..85446d21135 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -298,7 +298,7 @@ function test_shard_task() { # get task list openapi_task_check "get_task_list" 0 - + # delete source success clean_cluster_sources_and_tasks echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TEST OPENAPI: SHARD TASK SUCCESS" From 2dcbb41b953a14fdfbff3271470ed115a32255df Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 22 Nov 2024 12:09:56 +0800 Subject: [PATCH 43/50] fix --- dm/tests/openapi/client/openapi_task_check | 8 ++++---- dm/tests/openapi/run.sh | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index cbdf90e8807..c95cd618ec2 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -410,15 +410,15 @@ def get_task_status_success(task_name, total): resp = requests.get(url=url) data = resp.json() assert resp.status_code == 200 - print("get_task_status_success resp=") + print("get_task_status_success resp=", data) assert data["total"] == int(total) def check_sync_task_status_success( task_name, min_dump_io_total_bytes=0, - max_dump_io_total_bytes=float('inf'), + max_dump_io_total_bytes=sys.maxsize, min_io_total_bytes=0, - max_io_total_bytes=float('inf') + max_io_total_bytes=sys.maxsize ): url = API_ENDPOINT + "/" + task_name + "/status" resp = requests.get(url=url) @@ -655,7 +655,7 @@ def check_noshard_task_dump_status_success(task_name, total): resp = requests.get(url=url) data = resp.json() assert resp.status_code == 200 - print("check_dump_status_success resp=", data) + print("check_noshard_task_dump_status_success resp=", data) assert data["data"][0]["dump_status"]["finished_bytes"] == int(total) diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index 85446d21135..c65aa6b1d4c 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -281,9 +281,9 @@ function test_shard_task() { # get illegal char task_status failed openapi_task_check get_illegal_char_task_status_failed - # get task status and io counter success + # get task status and check sync task status success openapi_task_check "get_task_status_success" "$task_name" 2 - openapi_task_check "check_sync_task_status_success" "$task_name" 3400 5000 20000 30000 + openapi_task_check "check_sync_task_status_success" "$task_name" 3000 5000 19000 30000 # get task list openapi_task_check "get_task_list" 1 @@ -343,9 +343,9 @@ function test_noshard_task() { # get task status failed openapi_task_check "get_task_status_failed" "not a task name" - # get task status and io counter success + # get task status and check sync task status success openapi_task_check "get_task_status_success" "$task_name" 2 - openapi_task_check "check_sync_task_status_success" "$task_name" + openapi_task_check "check_sync_task_status_success" "$task_name" 2500 4000 18000 30000 # delete source with force openapi_source_check "delete_source_with_force_success" "mysql-01" @@ -407,7 +407,7 @@ function test_complex_operations_of_source_and_task() { init_noshard_data check_sync_diff $WORK_DIR $cur/conf/diff_config_no_shard.toml openapi_task_check "get_task_status_success" "$task_name" 2 - openapi_task_check "check_sync_task_status_success" "$task_name" + openapi_task_check "check_sync_task_status_success" "$task_name" 2500 4000 18000 30000 # do some complex operations openapi_task_check "do_complex_operations" "$task_name" From fe5eaa66b6ea6551ddae5b62754ffac52031d0ba Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:26:32 +0800 Subject: [PATCH 44/50] add test --- dm/tests/_utils/run_downstream_cluster | 2 +- dm/tests/openapi/client/openapi_task_check | 35 +++++++++- dm/tests/openapi/run.sh | 76 +++++++++++++++++++++- 3 files changed, 108 insertions(+), 5 deletions(-) diff --git a/dm/tests/_utils/run_downstream_cluster b/dm/tests/_utils/run_downstream_cluster index 36038c74e07..7b3938a2f05 100755 --- a/dm/tests/_utils/run_downstream_cluster +++ b/dm/tests/_utils/run_downstream_cluster @@ -2,7 +2,7 @@ # tools to run a TiDB cluster # parameter 1: work directory set -eu -WORK_DIR=$1 +WORK_DIR=/tmp export PD_PEER_ADDR="127.0.0.1:2380" export PD_ADDR="127.0.0.1:2379" diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index c95cd618ec2..5e82cf613a8 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -105,10 +105,10 @@ def create_task_with_precheck(task_name, ignore_check, is_success, check_result) assert resp.status_code == 400 assert check_result in resp.json()["error_msg"] -def create_noshard_task_success(task_name, tartget_table_name=""): +def create_noshard_task_success(task_name, tartget_table_name="", task_mode="all"): task = { "name": task_name, - "task_mode": "all", + "task_mode": task_mode, "meta_schema": "dm-meta", "enhance_online_schema_change": True, "on_duplicate": "error", @@ -436,6 +436,33 @@ def check_sync_task_status_success( assert dump_io_total_bytes > int(min_dump_io_total_bytes) and io_total_bytes > int(min_io_total_bytes) assert dump_io_total_bytes < int(max_dump_io_total_bytes) and io_total_bytes < int(max_io_total_bytes) +def check_load_task_finished_status_success(task_name, finished_bytes, total_bytes): + url = API_ENDPOINT + "/" + task_name + "/status" + resp = requests.get(url=url) + data = resp.json() + assert resp.status_code == 200 + print("check_load_task_finished_status_success resp=", data) + + for item in data.get("data", []): + # Only validate load task status + assert item.get("unit") == "Load" + load_status = item.get("load_status", {}) + assert load_status.get("stage") == "Finished" + assert load_status.get("progress") == "100.00 %" + assert load_status.get("finished_bytes") == int(finished_bytes) + assert load_status.get("total_bytes") == int(total_bytes) + + +def check_task_stage_success(task_name, total, stage): + url = API_ENDPOINT + "/" + task_name + "/status" + resp = requests.get(url=url) + data = resp.json() + assert resp.status_code == 200 + print("check_task_stage_success resp=", data) + assert data["total"] == int(total) + for status in data["data"]: + assert status["stage"] == stage + def get_task_status_success_but_worker_meet_error(task_name, total): url = API_ENDPOINT + "/" + task_name + "/status" resp = requests.get(url=url) @@ -780,7 +807,6 @@ if __name__ == "__main__": "get_illegal_char_task_status_failed": get_illegal_char_task_status_failed, "get_task_status_success": get_task_status_success, "get_task_status_success_but_worker_meet_error": get_task_status_success_but_worker_meet_error, - "check_sync_task_status_success": check_sync_task_status_success, "operate_schema_and_table_success": operate_schema_and_table_success, "create_task_template_success": create_task_template_success, "create_task_template_failed": create_task_template_failed, @@ -792,6 +818,9 @@ if __name__ == "__main__": "check_noshard_task_dump_status_success": check_noshard_task_dump_status_success, "do_complex_operations": do_complex_operations, "create_task_with_precheck": create_task_with_precheck, + "check_sync_task_status_success": check_sync_task_status_success, + "check_load_task_finished_status_success": check_load_task_finished_status_success, + "check_task_stage_success": check_task_stage_success, } func = FUNC_MAP[sys.argv[1]] diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index c65aa6b1d4c..2bf70dcf55a 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -228,6 +228,79 @@ function test_dump_task() { } +function test_full_mode_task() { + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: FULL MODE TASK" + prepare_database + + task_name="test-no-shard" + target_table_name="" + + # create source successfully + openapi_source_check "create_source1_success" + openapi_source_check "list_source_success" 1 + + # get source status success + openapi_source_check "get_source_status_success" "mysql-01" + + # create source successfully + openapi_source_check "create_source2_success" + # get source list success + openapi_source_check "list_source_success" 2 + + # get source status success + openapi_source_check "get_source_status_success" "mysql-02" + + # create no shard task in full mode success + openapi_task_check "create_noshard_task_success" $task_name "" "full" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name" \ + "\"stage\": \"Stopped\"" 2 + openapi_task_check "check_task_stage_success" $task_name 2 "Stopped" + + init_noshard_data + + # start task success + openapi_task_check "start_task_success" $task_name "" + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name" \ + "\"stage\": \"Running\"" 2 + openapi_task_check "check_task_stage_success" $task_name 2 "Running" + + # get task status and load task status + openapi_task_check "get_task_status_success" "$task_name" 2 + + # wait full task finish + run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ + "query-status $task_name" 100 \ + "\"stage\": \"Finished\"" 2 + openapi_task_check "check_task_stage_success" $task_name 2 "Finished" + check_sync_diff $WORK_DIR $cur/conf/diff_config_no_shard.toml + + # check load task status + openapi_task_check "check_load_task_finished_status_success" "$task_name" 107 107 + + # delete source with force + openapi_source_check "delete_source_with_force_success" "mysql-01" + + # get task list + openapi_task_check "get_task_list" 1 + + # delete task success with force + openapi_task_check "delete_task_with_force_success" "$task_name" + + openapi_task_check "get_task_list" 0 + + # delete source success + openapi_source_check "delete_source_success" "mysql-02" + openapi_source_check "list_source_success" 0 + run_sql_tidb "DROP DATABASE if exists openapi;" + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TEST OPENAPI: FULL MODE TASK" +} + +function test_complex_operations_of_source_and_task() { + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: COMPLEX OPERATION" +} + function test_shard_task() { echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: SHARD TASK" prepare_database @@ -345,7 +418,7 @@ function test_noshard_task() { # get task status and check sync task status success openapi_task_check "get_task_status_success" "$task_name" 2 - openapi_task_check "check_sync_task_status_success" "$task_name" 2500 4000 18000 30000 + openapi_task_check "check_sync_task_status_success" "$task_name" 2500 4000 18000 42000 # delete source with force openapi_source_check "delete_source_with_force_success" "mysql-01" @@ -1104,6 +1177,7 @@ function run() { test_start_task_with_condition test_stop_task_with_condition test_reverse_https + test_full_mode_task # NOTE: this test case MUST running at last, because it will offline some members of cluster test_cluster From cc11fc09337c467f543a40abd2361a909e5578de Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:40:23 +0800 Subject: [PATCH 45/50] fix --- dm/tests/openapi/client/openapi_task_check | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index 5e82cf613a8..a89faa3b62c 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -446,8 +446,8 @@ def check_load_task_finished_status_success(task_name, finished_bytes, total_byt for item in data.get("data", []): # Only validate load task status assert item.get("unit") == "Load" + assert item.get("stage") == "Finished" load_status = item.get("load_status", {}) - assert load_status.get("stage") == "Finished" assert load_status.get("progress") == "100.00 %" assert load_status.get("finished_bytes") == int(finished_bytes) assert load_status.get("total_bytes") == int(total_bytes) From d6ce61d75ff226cad7f071ab139c258c8d78c2d6 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 22 Nov 2024 16:00:30 +0800 Subject: [PATCH 46/50] add test --- dm/openapi/gen.server.go | 76 +++++++++++----------- dm/openapi/gen.types.go | 2 + dm/openapi/spec/dm.yaml | 1 + dm/tests/openapi/client/openapi_task_check | 21 +++++- dm/tests/openapi/run.sh | 7 +- 5 files changed, 67 insertions(+), 40 deletions(-) diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index 2a7495f28db..74152c051bf 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -1319,44 +1319,44 @@ var swaggerSpec = []string{ "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", - "AA==", + "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", + "/8CxKAKNvQAA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/dm/openapi/gen.types.go b/dm/openapi/gen.types.go index cc202edd30e..507c18c2105 100644 --- a/dm/openapi/gen.types.go +++ b/dm/openapi/gen.types.go @@ -80,6 +80,8 @@ const ( const ( TaskStageFinished TaskStage = "Finished" + TaskStagePaused TaskStage = "Paused" + TaskStageRunning TaskStage = "Running" TaskStageStopped TaskStage = "Stopped" diff --git a/dm/openapi/spec/dm.yaml b/dm/openapi/spec/dm.yaml index cb281c7ef36..ae212570a82 100644 --- a/dm/openapi/spec/dm.yaml +++ b/dm/openapi/spec/dm.yaml @@ -1828,6 +1828,7 @@ components: - Stopped - Running - Finished + - Paused Task: description: "task" type: object diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index a89faa3b62c..2c4bcbfc9a4 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -452,6 +452,24 @@ def check_load_task_finished_status_success(task_name, finished_bytes, total_byt assert load_status.get("finished_bytes") == int(finished_bytes) assert load_status.get("total_bytes") == int(total_bytes) +def check_dump_task_finished_status_success(task_name, completed_tables, total_tables, estimate_total_rows,finished_rows,finished_bytes): + url = API_ENDPOINT + "/" + task_name + "/status" + resp = requests.get(url=url) + data = resp.json() + assert resp.status_code == 200 + print("check_dump_task_finished_status_success resp=", data) + + for item in data.get("data", []): + # Only validate dump task status + assert item.get("unit") == "Dump" + assert item.get("stage") == "Finished" + dump_status = item.get("dump_status", {}) + assert dump_status.get("progress") == "100.00 %" + assert dump_status.get("completed_tables") == int(completed_tables) + assert dump_status.get("total_tables") == int(total_tables) + assert dump_status.get("estimate_total_rows") == int(estimate_total_rows) + assert dump_status.get("finished_rows") == int(finished_rows) + assert dump_status.get("finished_bytes") == int(finished_bytes) def check_task_stage_success(task_name, total, stage): url = API_ENDPOINT + "/" + task_name + "/status" @@ -818,9 +836,10 @@ if __name__ == "__main__": "check_noshard_task_dump_status_success": check_noshard_task_dump_status_success, "do_complex_operations": do_complex_operations, "create_task_with_precheck": create_task_with_precheck, + "check_task_stage_success": check_task_stage_success, "check_sync_task_status_success": check_sync_task_status_success, "check_load_task_finished_status_success": check_load_task_finished_status_success, - "check_task_stage_success": check_task_stage_success, + "check_dump_task_finished_status_success": check_dump_task_finished_status_success, } func = FUNC_MAP[sys.argv[1]] diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index 2bf70dcf55a..c5382cd212c 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -28,6 +28,9 @@ function init_dump_data() { run_sql_source1 "CREATE TABLE openapi.t1(i TINYINT, j INT UNIQUE KEY);" run_sql_source1 "INSERT INTO openapi.t1(i,j) VALUES (1, 2),(3,4);" + + run_sql_source1 "CREATE TABLE openapi.t2(i TINYINT, j INT UNIQUE KEY);" + run_sql_source1 "INSERT INTO openapi.t2(i,j) VALUES (1, 2),(3,4);" } function init_shard_data() { @@ -209,6 +212,7 @@ function test_dump_task() { run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ "query-status $task_name" \ "\"stage\": \"Stopped\"" 1 + openapi_task_check "check_task_stage_success" $task_name 1 "Stopped" init_dump_data @@ -222,6 +226,7 @@ function test_dump_task() { run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ "query-status $task_name" 100 \ "\"stage\": \"Finished\"" 1 + openapi_task_check "check_dump_task_finished_status_success" $task_name 2 2 4 4 228 clean_cluster_sources_and_tasks echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TEST OPENAPI: dump TASK" @@ -258,7 +263,7 @@ function test_full_mode_task() { openapi_task_check "check_task_stage_success" $task_name 2 "Stopped" init_noshard_data - + # start task success openapi_task_check "start_task_success" $task_name "" run_dm_ctl_with_retry $WORK_DIR "127.0.0.1:$MASTER_PORT" \ From f8464d764e1d4efeec15f25362b98e13fea3cc37 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 22 Nov 2024 16:29:39 +0800 Subject: [PATCH 47/50] fix --- dm/tests/openapi/run.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index c5382cd212c..4ed49ec234d 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -302,10 +302,6 @@ function test_full_mode_task() { echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TEST OPENAPI: FULL MODE TASK" } -function test_complex_operations_of_source_and_task() { - echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: COMPLEX OPERATION" -} - function test_shard_task() { echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>START TEST OPENAPI: SHARD TASK" prepare_database From 41e7f231ac009f9dcb77c13b35a1cb5dd5ebe245 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 22 Nov 2024 16:32:16 +0800 Subject: [PATCH 48/50] fix --- dm/tests/_utils/run_downstream_cluster | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dm/tests/_utils/run_downstream_cluster b/dm/tests/_utils/run_downstream_cluster index 7b3938a2f05..36038c74e07 100755 --- a/dm/tests/_utils/run_downstream_cluster +++ b/dm/tests/_utils/run_downstream_cluster @@ -2,7 +2,7 @@ # tools to run a TiDB cluster # parameter 1: work directory set -eu -WORK_DIR=/tmp +WORK_DIR=$1 export PD_PEER_ADDR="127.0.0.1:2380" export PD_ADDR="127.0.0.1:2379" From 5e4c7d2daea7158365d9fe94a318944d4ad81d49 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 22 Nov 2024 17:18:29 +0800 Subject: [PATCH 49/50] fix test --- dm/tests/openapi/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index 4ed49ec234d..31532bcec73 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -357,7 +357,7 @@ function test_shard_task() { # get task status and check sync task status success openapi_task_check "get_task_status_success" "$task_name" 2 - openapi_task_check "check_sync_task_status_success" "$task_name" 3000 5000 19000 30000 + openapi_task_check "check_sync_task_status_success" "$task_name" 3000 7000 19000 30000 # get task list openapi_task_check "get_task_list" 1 From b68cc41ba1548a4c6c1c8aa57fcd14d774dbdb90 Mon Sep 17 00:00:00 2001 From: Jiaqiang Huang <96465211+River2000i@users.noreply.github.com> Date: Fri, 22 Nov 2024 17:31:30 +0800 Subject: [PATCH 50/50] regenerate openapi --- dm/openapi/gen.server.go | 195 ++++++++++++++++++++------------------- 1 file changed, 98 insertions(+), 97 deletions(-) diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index 5b130c5ab65..8e3c3258821 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -1259,103 +1259,104 @@ var swaggerSpec = []string{ "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", + "AAD//3gHYjaUvQAA", } // GetSwagger returns the content of the embedded swagger specification file