diff --git a/Makefile b/Makefile index d48c9b9a622..5c3bd946860 100644 --- a/Makefile +++ b/Makefile @@ -299,7 +299,7 @@ dm_integration_test: check_third_party_binary_for_dm install_test_python_dep @which bin/dm-master.test @which bin/dm-worker.test @which bin/dm-syncer.test - ln -srf bin dm/ + cd dm && ln -sf ../bin . cd dm && ./tests/run.sh $(CASE) dm_compatibility_test: check_third_party_binary_for_dm diff --git a/dm/_utils/terror_gen/errors_release.txt b/dm/_utils/terror_gen/errors_release.txt index aa049b59f54..660eef46495 100644 --- a/dm/_utils/terror_gen/errors_release.txt +++ b/dm/_utils/terror_gen/errors_release.txt @@ -486,6 +486,9 @@ ErrSchemaTrackerCannotCreateTable,[code=44003:class=schema-tracker:scope=interna ErrSchemaTrackerCannotSerialize,[code=44004:class=schema-tracker:scope=internal:level=high], "Message: failed to serialize table info for `%s`.`%s`" ErrSchemaTrackerCannotGetTable,[code=44005:class=schema-tracker:scope=internal:level=high], "Message: cannot get table info for %v from schema tracker" ErrSchemaTrackerCannotExecDDL,[code=44006:class=schema-tracker:scope=internal:level=high], "Message: cannot track DDL: %s" +ErrSchemaTrackerMarshalJSON,[code=44013:class=schema-tracker:scope=downstream:level=high], "Message: can not marshal struct maybe `%v` is unable to serialize" +ErrSchemaTrackerUnMarshalJSON,[code=44014:class=schema-tracker:scope=downstream:level=high], "Message: can not unmarshal json maybe `%s` is not proper JSON" +ErrSchemaTrackerUnSchemaNotExist,[code=44015:class=schema-tracker:scope=downstream:level=high], "Message: can not find `%s` in tracker" ErrSchemaTrackerCannotFetchDownstreamTable,[code=44007:class=schema-tracker:scope=downstream:level=medium], "Message: cannot fetch downstream table schema of %v to initialize upstream schema %v in schema tracker" ErrSchemaTrackerCannotParseDownstreamTable,[code=44008:class=schema-tracker:scope=internal:level=high], "Message: cannot parse downstream table schema of %v to initialize upstream schema %v in schema tracker" ErrSchemaTrackerInvalidCreateTableStmt,[code=44009:class=schema-tracker:scope=internal:level=medium], "Message: %s is not a valid `CREATE TABLE` statement" diff --git a/dm/dm/master/openapi.go b/dm/dm/master/openapi.go index 1e1b6be9d5e..4cbb3290a55 100644 --- a/dm/dm/master/openapi.go +++ b/dm/dm/master/openapi.go @@ -17,6 +17,7 @@ package master import ( "context" + "encoding/json" "fmt" "net/http" @@ -29,6 +30,7 @@ import ( "github.com/pingcap/ticdc/dm/dm/config" "github.com/pingcap/ticdc/dm/dm/ctl/common" "github.com/pingcap/ticdc/dm/dm/master/scheduler" + "github.com/pingcap/ticdc/dm/dm/master/workerrpc" "github.com/pingcap/ticdc/dm/dm/pb" "github.com/pingcap/ticdc/dm/openapi" "github.com/pingcap/ticdc/dm/pkg/conn" @@ -479,9 +481,13 @@ func (s *Server) DMAPIGetTaskList(ctx echo.Context) error { // DMAPIGetTaskStatus url is:(GET /api/v1/tasks/{task-name}/status). func (s *Server) DMAPIGetTaskStatus(ctx echo.Context, taskName string, params openapi.DMAPIGetTaskStatusParams) error { - // todo support params // 1. get task source list from scheduler - sourceList := s.getTaskResources(taskName) + var sourceList []string + if params.SourceNameList == nil { + sourceList = s.getTaskResources(taskName) + } else { + sourceList = *params.SourceNameList + } if len(sourceList) == 0 { return terror.ErrSchedulerTaskNotExist.Generate(taskName) } @@ -557,43 +563,183 @@ func (s *Server) DMAPIGetTaskStatus(ctx echo.Context, taskName string, params op return ctx.JSON(http.StatusOK, resp) } -// DMAPPauseTask pause task url is: (POST /api/v1/tasks/{task-name}/pause). -func (s *Server) DMAPPauseTask(ctx echo.Context, taskName string) error { - return nil +// DMAPIPauseTask pause task url is: (POST /api/v1/tasks/{task-name}/pause). +func (s *Server) DMAPIPauseTask(ctx echo.Context, taskName string) error { + var sourceName openapi.SchemaNameList + if err := ctx.Bind(&sourceName); err != nil { + return err + } + if len(sourceName) == 0 { + sourceName = s.getTaskResources(taskName) + } + return s.scheduler.UpdateExpectSubTaskStage(pb.Stage_Paused, taskName, sourceName...) } // DMAPIResumeTask resume task url is: (POST /api/v1/tasks/{task-name}/resume). func (s *Server) DMAPIResumeTask(ctx echo.Context, taskName string) error { - return nil -} - -// DMAPIGetTaskSourceSchemaList get task source schema list url is: (GET /api/v1/tasks/{task-name}/sources/{source-name}/schemas). -func (s *Server) DMAPIGetTaskSourceSchemaList(ctx echo.Context, taskName string, sourceName string) error { - return nil + var sourceName openapi.SchemaNameList + if err := ctx.Bind(&sourceName); err != nil { + return err + } + if len(sourceName) == 0 { + sourceName = s.getTaskResources(taskName) + } + return s.scheduler.UpdateExpectSubTaskStage(pb.Stage_Running, taskName, sourceName...) } -// DMAPIGetTaskSchemaStructure get task source schema structure url is: (GET /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}). -func (s *Server) DMAPIGetTaskSchemaStructure(ctx echo.Context, taskName string, sourceName string, schemaName string) error { - return nil +// DMAPIGetSchemaListByTaskAndSource get task source schema list url is: (GET /api/v1/tasks/{task-name}/sources/{source-name}/schemas). +func (s *Server) DMAPIGetSchemaListByTaskAndSource(ctx echo.Context, taskName string, sourceName string) error { + worker := s.scheduler.GetWorkerBySource(sourceName) + if worker == nil { + return terror.ErrWorkerNoStart + } + workerReq := workerrpc.Request{ + Type: workerrpc.CmdOperateSchema, + OperateSchema: &pb.OperateWorkerSchemaRequest{ + Op: pb.SchemaOp_ListSchema, + Task: taskName, + Source: sourceName, + }, + } + newCtx := ctx.Request().Context() + resp, err := worker.SendRequest(newCtx, &workerReq, s.cfg.RPCTimeout) + if err != nil { + return err + } + if !resp.OperateSchema.Result { + return terror.ErrOpenAPICommonError.New(resp.OperateSchema.Msg) + } + schemaList := openapi.SchemaNameList{} + if err := json.Unmarshal([]byte(resp.OperateSchema.Msg), &schemaList); err != nil { + return terror.ErrSchemaTrackerUnMarshalJSON.Delegate(err, resp.OperateSchema.Msg) + } + return ctx.JSON(http.StatusOK, schemaList) } -// DMAPIGetTaskSourceTableList get task source table list url is: (GET /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}). -func (s *Server) DMAPIGetTaskSourceTableList(ctx echo.Context, taskName string, sourceName string, schemaName string) error { - return nil +// DMAPIGetTableListByTaskAndSource get task source table list url is: (GET /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}). +func (s *Server) DMAPIGetTableListByTaskAndSource(ctx echo.Context, taskName string, sourceName string, schemaName string) error { + worker := s.scheduler.GetWorkerBySource(sourceName) + if worker == nil { + return terror.ErrWorkerNoStart + } + workerReq := workerrpc.Request{ + Type: workerrpc.CmdOperateSchema, + OperateSchema: &pb.OperateWorkerSchemaRequest{ + Op: pb.SchemaOp_ListTable, + Task: taskName, + Source: sourceName, + Database: schemaName, + }, + } + newCtx := ctx.Request().Context() + resp, err := worker.SendRequest(newCtx, &workerReq, s.cfg.RPCTimeout) + if err != nil { + return err + } + if !resp.OperateSchema.Result { + return terror.ErrOpenAPICommonError.New(resp.OperateSchema.Msg) + } + tableList := openapi.TableNameList{} + if err := json.Unmarshal([]byte(resp.OperateSchema.Msg), &tableList); err != nil { + return terror.ErrSchemaTrackerUnMarshalJSON.Delegate(err, resp.OperateSchema.Msg) + } + return ctx.JSON(http.StatusOK, tableList) } -// DMAPIDeleteTaskSourceTableStructure delete task source table structure url is: (DELETE /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}/{table-name}). -func (s *Server) DMAPIDeleteTaskSourceTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error { - return nil +// DMAPIGetTableStructure get task source table structure url is: (GET /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}/{table-name}). +func (s *Server) DMAPIGetTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error { + worker := s.scheduler.GetWorkerBySource(sourceName) + if worker == nil { + return terror.ErrWorkerNoStart + } + workerReq := workerrpc.Request{ + Type: workerrpc.CmdOperateSchema, + OperateSchema: &pb.OperateWorkerSchemaRequest{ + Op: pb.SchemaOp_GetSchema, + Task: taskName, + Source: sourceName, + Database: schemaName, + Table: tableName, + }, + } + newCtx := ctx.Request().Context() + resp, err := worker.SendRequest(newCtx, &workerReq, s.cfg.RPCTimeout) + if err != nil { + return err + } + if !resp.OperateSchema.Result { + return terror.ErrOpenAPICommonError.New(resp.OperateSchema.Msg) + } + taskTableStruct := openapi.GetTaskTableStructureResponse{ + SchemaCreateSql: &resp.OperateSchema.Msg, + SchemaName: &schemaName, + TableName: tableName, + } + return ctx.JSON(http.StatusOK, taskTableStruct) } -// DMAPIGetTaskSourceTableStructure get task source table structure url is: (GET /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}/{table-name}). -func (s *Server) DMAPIGetTaskSourceTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error { - return nil +// DMAPIDeleteTableStructure delete task source table structure url is: (DELETE /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}/{table-name}). +func (s *Server) DMAPIDeleteTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error { + worker := s.scheduler.GetWorkerBySource(sourceName) + if worker == nil { + return terror.ErrWorkerNoStart + } + workerReq := workerrpc.Request{ + Type: workerrpc.CmdOperateSchema, + OperateSchema: &pb.OperateWorkerSchemaRequest{ + Op: pb.SchemaOp_RemoveSchema, + Task: taskName, + Source: sourceName, + Database: schemaName, + Table: tableName, + }, + } + newCtx := ctx.Request().Context() + resp, err := worker.SendRequest(newCtx, &workerReq, s.cfg.RPCTimeout) + if err != nil { + return err + } + if !resp.OperateSchema.Result { + return terror.ErrOpenAPICommonError.New(resp.OperateSchema.Msg) + } + return ctx.NoContent(http.StatusNoContent) } -// DMAPIOperateTaskSourceTableStructure operate task source table structure url is: (PUT /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}/{table-name}). -func (s *Server) DMAPIOperateTaskSourceTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error { +// DMAPIOperateTableStructure operate task source table structure url is: (PUT /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}/{table-name}). +func (s *Server) DMAPIOperateTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error { + var req openapi.OperateTaskTableStructureRequest + if err := ctx.Bind(&req); err != nil { + return err + } + worker := s.scheduler.GetWorkerBySource(sourceName) + if worker == nil { + return terror.ErrWorkerNoStart + } + opReq := &pb.OperateWorkerSchemaRequest{ + Op: pb.SchemaOp_SetSchema, + Task: taskName, + Source: sourceName, + Database: schemaName, + Table: tableName, + Schema: req.SqlContent, + Sync: *req.Sync, + Flush: *req.Flush, + } + if req.Sync != nil { + opReq.Sync = *req.Sync + } + if req.Flush != nil { + opReq.Flush = *req.Flush + } + workerReq := workerrpc.Request{Type: workerrpc.CmdOperateSchema, OperateSchema: opReq} + newCtx := ctx.Request().Context() + resp, err := worker.SendRequest(newCtx, &workerReq, s.cfg.RPCTimeout) + if err != nil { + return err + } + if !resp.OperateSchema.Result { + return terror.ErrOpenAPICommonError.New(resp.OperateSchema.Msg) + } return nil } diff --git a/dm/dm/master/openapi_test.go b/dm/dm/master/openapi_test.go index 816ad8f3af8..419c0531da4 100644 --- a/dm/dm/master/openapi_test.go +++ b/dm/dm/master/openapi_test.go @@ -452,10 +452,10 @@ func (t *openAPISuite) TestTaskAPI(c *check.C) { task.TargetConfig.Password = dbCfg.Password createTaskReq := openapi.CreateTaskRequest{RemoveMeta: false, Task: task} - result2 := testutil.NewRequest().Post(taskURL).WithJsonBody(createTaskReq).Go(t.testT, s.echo) - c.Assert(result2.Code(), check.Equals, http.StatusCreated) + result = testutil.NewRequest().Post(taskURL).WithJsonBody(createTaskReq).Go(t.testT, s.echo) + c.Assert(result.Code(), check.Equals, http.StatusCreated) var createTaskResp openapi.Task - err = result2.UnmarshalBodyToObject(&createTaskResp) + err = result.UnmarshalBodyToObject(&createTaskResp) c.Assert(err, check.IsNil) c.Assert(task.Name, check.Equals, createTaskResp.Name) subTaskM := s.scheduler.GetSubTaskCfgsByTask(task.Name) @@ -463,41 +463,61 @@ func (t *openAPISuite) TestTaskAPI(c *check.C) { c.Assert(subTaskM[source1Name].Name, check.Equals, task.Name) // list tasks - result3 := testutil.NewRequest().Get(taskURL).Go(t.testT, s.echo) - c.Assert(result3.Code(), check.Equals, http.StatusOK) + result = testutil.NewRequest().Get(taskURL).Go(t.testT, s.echo) + c.Assert(result.Code(), check.Equals, http.StatusOK) var resultTaskList openapi.GetTaskListResponse - err = result3.UnmarshalBodyToObject(&resultTaskList) + err = result.UnmarshalBodyToObject(&resultTaskList) c.Assert(err, check.IsNil) c.Assert(resultTaskList.Total, check.Equals, 1) c.Assert(resultTaskList.Data[0].Name, check.Equals, task.Name) + // pause and resume task + pauseTaskURL := fmt.Sprintf("%s/%s/pause", taskURL, task.Name) + result = testutil.NewRequest().Post(pauseTaskURL).Go(t.testT, s.echo) + c.Assert(result.Code(), check.Equals, http.StatusOK) + c.Assert(s.scheduler.GetExpectSubTaskStage(task.Name, source1Name).Expect, check.Equals, pb.Stage_Paused) + + resumeTaskURL := fmt.Sprintf("%s/%s/resume", taskURL, task.Name) + result = testutil.NewRequest().Post(resumeTaskURL).Go(t.testT, s.echo) + c.Assert(result.Code(), check.Equals, http.StatusOK) + c.Assert(s.scheduler.GetExpectSubTaskStage(task.Name, source1Name).Expect, check.Equals, pb.Stage_Running) + // get task status mockWorkerClient := pbmock.NewMockWorkerClient(ctrl) mockTaskQueryStatus(mockWorkerClient, task.Name, source1.SourceName, workerName1) s.scheduler.SetWorkerClientForTest(workerName1, newMockRPCClient(mockWorkerClient)) taskStatusURL := fmt.Sprintf("%s/%s/status", taskURL, task.Name) - result4 := testutil.NewRequest().Get(taskStatusURL).Go(t.testT, s.echo) - c.Assert(result4.Code(), check.Equals, http.StatusOK) + result = testutil.NewRequest().Get(taskStatusURL).Go(t.testT, s.echo) + c.Assert(result.Code(), check.Equals, http.StatusOK) var resultTaskStatus openapi.GetTaskStatusResponse - err = result4.UnmarshalBodyToObject(&resultTaskStatus) + err = result.UnmarshalBodyToObject(&resultTaskStatus) c.Assert(err, check.IsNil) c.Assert(resultTaskStatus.Total, check.Equals, 1) // only 1 subtask c.Assert(resultTaskStatus.Data[0].Name, check.Equals, task.Name) c.Assert(resultTaskStatus.Data[0].Stage, check.Equals, pb.Stage_Running.String()) c.Assert(resultTaskStatus.Data[0].WorkerName, check.Equals, workerName1) + // get task status with source name + taskStatusURL = fmt.Sprintf("%s/%s/status?source_name_list=%s", taskURL, task.Name, source1Name) + result = testutil.NewRequest().Get(taskStatusURL).Go(t.testT, s.echo) + c.Assert(result.Code(), check.Equals, http.StatusOK) + var resultTaskStatusWithStatus openapi.GetTaskStatusResponse + err = result.UnmarshalBodyToObject(&resultTaskStatusWithStatus) + c.Assert(err, check.IsNil) + c.Assert(resultTaskStatusWithStatus, check.DeepEquals, resultTaskStatus) + // stop task - result5 := testutil.NewRequest().Delete(fmt.Sprintf("%s/%s", taskURL, task.Name)).Go(t.testT, s.echo) - c.Assert(result5.Code(), check.Equals, http.StatusNoContent) + result = testutil.NewRequest().Delete(fmt.Sprintf("%s/%s", taskURL, task.Name)).Go(t.testT, s.echo) + c.Assert(result.Code(), check.Equals, http.StatusNoContent) subTaskM = s.scheduler.GetSubTaskCfgsByTask(task.Name) c.Assert(len(subTaskM) == 0, check.IsTrue) c.Assert(failpoint.Disable("github.com/pingcap/ticdc/dm/dm/master/MockSkipAdjustTargetDB"), check.IsNil) // list tasks - result6 := testutil.NewRequest().Get(taskURL).Go(t.testT, s.echo) - c.Assert(result6.Code(), check.Equals, http.StatusOK) + result = testutil.NewRequest().Get(taskURL).Go(t.testT, s.echo) + c.Assert(result.Code(), check.Equals, http.StatusOK) var resultTaskList2 openapi.GetTaskListResponse - err = result6.UnmarshalBodyToObject(&resultTaskList2) + err = result.UnmarshalBodyToObject(&resultTaskList2) c.Assert(err, check.IsNil) c.Assert(resultTaskList2.Total, check.Equals, 0) } diff --git a/dm/dm/pb/dmworker.pb.go b/dm/dm/pb/dmworker.pb.go index 688e50e50c4..30d9db1cdeb 100644 --- a/dm/dm/pb/dmworker.pb.go +++ b/dm/dm/pb/dmworker.pb.go @@ -211,6 +211,8 @@ const ( SchemaOp_GetSchema SchemaOp = 1 SchemaOp_SetSchema SchemaOp = 2 SchemaOp_RemoveSchema SchemaOp = 3 + SchemaOp_ListSchema SchemaOp = 4 + SchemaOp_ListTable SchemaOp = 5 ) var SchemaOp_name = map[int32]string{ @@ -218,6 +220,8 @@ var SchemaOp_name = map[int32]string{ 1: "GetSchema", 2: "SetSchema", 3: "RemoveSchema", + 4: "ListSchema", + 5: "ListTable", } var SchemaOp_value = map[string]int32{ @@ -225,6 +229,8 @@ var SchemaOp_value = map[string]int32{ "GetSchema": 1, "SetSchema": 2, "RemoveSchema": 3, + "ListSchema": 4, + "ListTable": 5, } func (x SchemaOp) String() string { @@ -2535,133 +2541,134 @@ func init() { func init() { proto.RegisterFile("dmworker.proto", fileDescriptor_51a1b9e17fd67b10) } var fileDescriptor_51a1b9e17fd67b10 = []byte{ - // 2008 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x4f, 0x6f, 0xe4, 0x48, - 0x15, 0x6f, 0xb7, 0xbb, 0x3b, 0xdd, 0xaf, 0x3b, 0x19, 0x6f, 0x25, 0xb3, 0x34, 0x61, 0x68, 0x22, - 0xcf, 0x6a, 0x08, 0x39, 0x44, 0x3b, 0x61, 0xd1, 0xa2, 0x95, 0x80, 0x21, 0xc9, 0x6c, 0x66, 0x21, - 0x43, 0x66, 0xdc, 0x33, 0xcb, 0x11, 0x55, 0xdb, 0x95, 0x8e, 0x15, 0xb7, 0xed, 0x71, 0xd9, 0x89, - 0xfa, 0x80, 0xf8, 0x08, 0x70, 0xe1, 0x80, 0xc4, 0x95, 0xeb, 0x1e, 0xf9, 0x08, 0xc0, 0x71, 0x85, - 0x84, 0x84, 0x38, 0xa1, 0x99, 0xaf, 0xc1, 0x01, 0xbd, 0x57, 0x65, 0xbb, 0x3a, 0xe9, 0x9e, 0x61, - 0x0e, 0xdc, 0xfc, 0x7e, 0xef, 0xd5, 0xab, 0x57, 0xbf, 0x7a, 0x7f, 0x6c, 0xc3, 0x46, 0x30, 0xbb, - 0x4e, 0xb2, 0x4b, 0x91, 0xed, 0xa7, 0x59, 0x92, 0x27, 0xac, 0x99, 0x4e, 0xdc, 0x5d, 0x60, 0xcf, - 0x0b, 0x91, 0xcd, 0xc7, 0x39, 0xcf, 0x0b, 0xe9, 0x89, 0x57, 0x85, 0x90, 0x39, 0x63, 0xd0, 0x8a, - 0xf9, 0x4c, 0x0c, 0xad, 0x1d, 0x6b, 0xb7, 0xe7, 0xd1, 0xb3, 0x9b, 0xc2, 0xd6, 0x51, 0x32, 0x9b, - 0x25, 0xf1, 0x2f, 0xc9, 0x87, 0x27, 0x64, 0x9a, 0xc4, 0x52, 0xb0, 0x0f, 0xa1, 0x93, 0x09, 0x59, - 0x44, 0x39, 0x59, 0x77, 0x3d, 0x2d, 0x31, 0x07, 0xec, 0x99, 0x9c, 0x0e, 0x9b, 0xe4, 0x02, 0x1f, - 0xd1, 0x52, 0x26, 0x45, 0xe6, 0x8b, 0xa1, 0x4d, 0xa0, 0x96, 0x10, 0x57, 0x71, 0x0d, 0x5b, 0x0a, - 0x57, 0x92, 0xfb, 0x95, 0x05, 0x9b, 0x0b, 0xc1, 0xbd, 0xf7, 0x8e, 0x9f, 0xc0, 0x40, 0xed, 0xa1, - 0x3c, 0xd0, 0xbe, 0xfd, 0x03, 0x67, 0x3f, 0x9d, 0xec, 0x8f, 0x0d, 0xdc, 0x5b, 0xb0, 0x62, 0x9f, - 0xc2, 0xba, 0x2c, 0x26, 0x2f, 0xb8, 0xbc, 0xd4, 0xcb, 0x5a, 0x3b, 0xf6, 0x6e, 0xff, 0xe0, 0x03, - 0x5a, 0x66, 0x2a, 0xbc, 0x45, 0x3b, 0xf7, 0x4f, 0x16, 0xf4, 0x8f, 0x2e, 0x84, 0xaf, 0x65, 0x0c, - 0x34, 0xe5, 0x52, 0x8a, 0xa0, 0x0c, 0x54, 0x49, 0x6c, 0x0b, 0xda, 0x79, 0x92, 0xf3, 0x88, 0x42, - 0x6d, 0x7b, 0x4a, 0x60, 0x23, 0x00, 0x59, 0xf8, 0xbe, 0x90, 0xf2, 0xbc, 0x88, 0x28, 0xd4, 0xb6, - 0x67, 0x20, 0xe8, 0xed, 0x9c, 0x87, 0x91, 0x08, 0x88, 0xa6, 0xb6, 0xa7, 0x25, 0x36, 0x84, 0xb5, - 0x6b, 0x9e, 0xc5, 0x61, 0x3c, 0x1d, 0xb6, 0x49, 0x51, 0x8a, 0xb8, 0x22, 0x10, 0x39, 0x0f, 0xa3, - 0x61, 0x67, 0xc7, 0xda, 0x1d, 0x78, 0x5a, 0x72, 0x07, 0x00, 0xc7, 0xc5, 0x2c, 0xd5, 0x51, 0xff, - 0xd9, 0x02, 0x38, 0x4d, 0x78, 0xa0, 0x83, 0xfe, 0x08, 0xd6, 0xcf, 0xc3, 0x38, 0x94, 0x17, 0x22, - 0x38, 0x9c, 0xe7, 0x42, 0x52, 0xec, 0xb6, 0xb7, 0x08, 0x62, 0xb0, 0x14, 0xb5, 0x32, 0x69, 0x92, - 0x89, 0x81, 0xb0, 0x6d, 0xe8, 0xa6, 0x59, 0x32, 0xcd, 0x84, 0x94, 0xfa, 0xb6, 0x2b, 0x19, 0xd7, - 0xce, 0x44, 0xce, 0x0f, 0xc3, 0x38, 0x4a, 0xa6, 0xfa, 0xce, 0x0d, 0x84, 0x3d, 0x80, 0x8d, 0x5a, - 0x3a, 0x79, 0xf1, 0xc5, 0x31, 0x9d, 0xab, 0xe7, 0xdd, 0x40, 0xdd, 0xdf, 0x5b, 0xb0, 0x3e, 0xbe, - 0xe0, 0x59, 0x10, 0xc6, 0xd3, 0x93, 0x2c, 0x29, 0x52, 0x3c, 0x70, 0xce, 0xb3, 0xa9, 0xc8, 0x75, - 0xe6, 0x6a, 0x09, 0xf3, 0xf9, 0xf8, 0xf8, 0x14, 0xe3, 0xb4, 0x31, 0x9f, 0xf1, 0x59, 0x9d, 0x33, - 0x93, 0xf9, 0x69, 0xe2, 0xf3, 0x3c, 0x4c, 0x62, 0x1d, 0xe6, 0x22, 0x48, 0x39, 0x3b, 0x8f, 0x7d, - 0x22, 0xdd, 0xa6, 0x9c, 0x25, 0x09, 0xcf, 0x57, 0xc4, 0x5a, 0xd3, 0x26, 0x4d, 0x25, 0xbb, 0xff, - 0xb0, 0x01, 0xc6, 0xf3, 0xd8, 0xd7, 0x84, 0xee, 0x40, 0x9f, 0x88, 0x79, 0x7c, 0x25, 0xe2, 0xbc, - 0xa4, 0xd3, 0x84, 0xd0, 0x19, 0x89, 0x2f, 0xd2, 0x92, 0xca, 0x4a, 0x66, 0xf7, 0xa0, 0x97, 0x09, - 0x5f, 0xc4, 0x39, 0x2a, 0x6d, 0x52, 0xd6, 0x00, 0x73, 0x61, 0x30, 0xe3, 0x32, 0x17, 0xd9, 0x02, - 0x99, 0x0b, 0x18, 0xdb, 0x03, 0xc7, 0x94, 0x4f, 0xf2, 0x30, 0xd0, 0x84, 0xde, 0xc2, 0xd1, 0x1f, - 0x1d, 0xa2, 0xf4, 0xd7, 0x51, 0xfe, 0x4c, 0x0c, 0xfd, 0x99, 0x32, 0xf9, 0x5b, 0x53, 0xfe, 0x6e, - 0xe2, 0xe8, 0x6f, 0x12, 0x25, 0xfe, 0x65, 0x18, 0x4f, 0xe9, 0x02, 0xba, 0x44, 0xd5, 0x02, 0xc6, - 0x7e, 0x04, 0x4e, 0x11, 0x67, 0x42, 0x26, 0xd1, 0x95, 0x08, 0xe8, 0x1e, 0xe5, 0xb0, 0x67, 0x54, - 0x9c, 0x79, 0xc3, 0xde, 0x2d, 0x53, 0xe3, 0x86, 0x40, 0x15, 0x99, 0xbe, 0xa1, 0x11, 0xc0, 0x84, - 0x02, 0x79, 0x31, 0x4f, 0xc5, 0xb0, 0xaf, 0xb2, 0xac, 0x46, 0xd8, 0xc7, 0xb0, 0x29, 0x85, 0x9f, - 0xc4, 0x81, 0x3c, 0x14, 0x17, 0x61, 0x1c, 0x3c, 0x25, 0x2e, 0x86, 0x03, 0xa2, 0x78, 0x99, 0xca, - 0xfd, 0xa3, 0x05, 0x03, 0xb3, 0x6d, 0x18, 0x0d, 0xcd, 0x5a, 0xd1, 0xd0, 0x9a, 0x66, 0x43, 0x63, - 0xdf, 0xab, 0x1a, 0x97, 0x6a, 0x44, 0x74, 0xbe, 0x67, 0x59, 0x82, 0x15, 0xee, 0x91, 0xa2, 0xea, - 0x65, 0x0f, 0xa1, 0x9f, 0x89, 0x88, 0xcf, 0xab, 0x0e, 0x84, 0xf6, 0x77, 0xd0, 0xde, 0xab, 0x61, - 0xcf, 0xb4, 0x71, 0xff, 0xda, 0x84, 0xbe, 0xa1, 0xbc, 0x95, 0x1b, 0xd6, 0xff, 0x98, 0x1b, 0xcd, - 0x15, 0xb9, 0xb1, 0x53, 0x86, 0x54, 0x4c, 0x8e, 0xc3, 0x4c, 0x97, 0x8b, 0x09, 0x55, 0x16, 0x0b, - 0xc9, 0x68, 0x42, 0x6c, 0x17, 0xee, 0x18, 0xa2, 0x91, 0x8a, 0x37, 0x61, 0xb6, 0x0f, 0x8c, 0xa0, - 0x23, 0x9e, 0xfb, 0x17, 0x2f, 0x53, 0x7d, 0x3b, 0x1d, 0xba, 0xe2, 0x25, 0x1a, 0xf6, 0x1d, 0x68, - 0xcb, 0x9c, 0x4f, 0x05, 0xa5, 0xe2, 0xc6, 0x41, 0x8f, 0x52, 0x07, 0x01, 0x4f, 0xe1, 0x06, 0xf9, - 0xdd, 0x77, 0x90, 0xef, 0xfe, 0xa7, 0x09, 0xeb, 0x0b, 0x8d, 0x7e, 0xd9, 0x40, 0xac, 0x77, 0x6c, - 0xae, 0xd8, 0x71, 0x07, 0x5a, 0x45, 0x1c, 0xaa, 0xcb, 0xde, 0x38, 0x18, 0xa0, 0xfe, 0x65, 0x1c, - 0xe6, 0x98, 0x7d, 0x1e, 0x69, 0x8c, 0x98, 0x5a, 0xef, 0x4a, 0x88, 0x8f, 0x61, 0xb3, 0x4e, 0xfd, - 0xe3, 0xe3, 0xd3, 0xd3, 0xc4, 0xbf, 0xac, 0x3a, 0xe3, 0x32, 0x15, 0x63, 0x6a, 0x1c, 0x52, 0x09, - 0x3f, 0x69, 0xa8, 0x81, 0xf8, 0x5d, 0x68, 0xfb, 0x38, 0xa0, 0x88, 0x25, 0x9d, 0x50, 0xc6, 0xc4, - 0x7a, 0xd2, 0xf0, 0x94, 0x9e, 0x7d, 0x04, 0xad, 0xa0, 0x98, 0xa5, 0x9a, 0xab, 0x0d, 0xb4, 0xab, - 0x47, 0xc6, 0x93, 0x86, 0x47, 0x5a, 0xb4, 0x8a, 0x12, 0x1e, 0x0c, 0x7b, 0xb5, 0x55, 0x3d, 0x49, - 0xd0, 0x0a, 0xb5, 0x68, 0x85, 0x35, 0x49, 0xf5, 0xa9, 0xad, 0xea, 0xf6, 0x88, 0x56, 0xa8, 0x3d, - 0xec, 0x42, 0x47, 0xaa, 0x44, 0xfe, 0x31, 0x7c, 0xb0, 0xc0, 0xfe, 0x69, 0x28, 0x89, 0x2a, 0xa5, - 0x1e, 0x5a, 0xab, 0xa6, 0x71, 0xb9, 0x7e, 0x04, 0x40, 0x67, 0x7a, 0x9c, 0x65, 0x49, 0x56, 0xbe, - 0x15, 0x58, 0xd5, 0x5b, 0x81, 0xfb, 0x6d, 0xe8, 0xe1, 0x59, 0xde, 0xa2, 0xc6, 0x43, 0xac, 0x52, - 0xa7, 0x30, 0xa0, 0xe8, 0x9f, 0x9f, 0xae, 0xb0, 0x60, 0x07, 0xb0, 0xa5, 0x46, 0xb3, 0x4a, 0xe7, - 0x67, 0x89, 0x0c, 0x69, 0xc0, 0xa8, 0xc2, 0x5a, 0xaa, 0xc3, 0x11, 0x20, 0xd0, 0xdd, 0xf8, 0xf9, - 0x69, 0x39, 0x2f, 0x4b, 0xd9, 0xfd, 0x01, 0xf4, 0x70, 0x47, 0xb5, 0xdd, 0x2e, 0x74, 0x48, 0x51, - 0xf2, 0xe0, 0x54, 0x74, 0xea, 0x80, 0x3c, 0xad, 0x77, 0x7f, 0x6b, 0x41, 0x5f, 0xb5, 0x2b, 0xb5, - 0xf2, 0x7d, 0xbb, 0xd5, 0xce, 0xc2, 0xf2, 0xb2, 0xde, 0x4d, 0x8f, 0xfb, 0x00, 0xd4, 0x70, 0x94, - 0x41, 0xab, 0xbe, 0xde, 0x1a, 0xf5, 0x0c, 0x0b, 0xbc, 0x98, 0x5a, 0x5a, 0x42, 0xed, 0x1f, 0x9a, - 0x30, 0xd0, 0x57, 0xaa, 0x4c, 0xfe, 0x4f, 0x65, 0xa7, 0x2b, 0xa3, 0x65, 0x56, 0xc6, 0x83, 0xb2, - 0x32, 0xda, 0xf5, 0x31, 0xea, 0x2c, 0xaa, 0x0b, 0xe3, 0xbe, 0x2e, 0x8c, 0x0e, 0x99, 0xad, 0x97, - 0x85, 0x51, 0x5a, 0xa9, 0xba, 0xb8, 0xaf, 0xeb, 0x62, 0xad, 0x36, 0xaa, 0x52, 0xaa, 0x2a, 0x8b, - 0xfb, 0xba, 0x2c, 0xba, 0xb5, 0x51, 0x75, 0xcd, 0x55, 0x55, 0xac, 0x41, 0x9b, 0xae, 0xd3, 0xfd, - 0x0c, 0x1c, 0x93, 0x1a, 0xaa, 0x89, 0x07, 0x5a, 0xb9, 0x90, 0x0a, 0x86, 0x91, 0xa7, 0xd7, 0xbe, - 0x82, 0xf5, 0x85, 0xa6, 0x82, 0xb3, 0x31, 0x94, 0x47, 0x3c, 0xf6, 0x45, 0x54, 0xbd, 0x9c, 0x1a, - 0x88, 0x91, 0x64, 0xcd, 0xda, 0xb3, 0x76, 0xb1, 0x90, 0x64, 0xc6, 0x2b, 0xa6, 0xbd, 0xf0, 0x8a, - 0xf9, 0x77, 0x0b, 0x06, 0xe6, 0x02, 0x7c, 0x4b, 0x7d, 0x9c, 0x65, 0x47, 0x49, 0xa0, 0x6e, 0xb3, - 0xed, 0x95, 0x22, 0xa6, 0x3e, 0x3e, 0x46, 0x5c, 0x4a, 0x9d, 0x81, 0x95, 0xac, 0x75, 0x63, 0x3f, - 0x49, 0xcb, 0x8f, 0x86, 0x4a, 0xd6, 0xba, 0x53, 0x71, 0x25, 0x22, 0x3d, 0x6a, 0x2a, 0x19, 0x77, - 0x7b, 0x2a, 0xa4, 0xc4, 0x34, 0x51, 0x1d, 0xb2, 0x14, 0x71, 0x95, 0xc7, 0xaf, 0x8f, 0x78, 0x21, - 0x85, 0x7e, 0xbb, 0xa9, 0x64, 0xa4, 0x05, 0x3f, 0x6e, 0x78, 0x96, 0x14, 0x71, 0xf9, 0x4e, 0x63, - 0x20, 0xee, 0x35, 0x7c, 0xf0, 0xac, 0xc8, 0xa6, 0x82, 0x92, 0xb8, 0xfc, 0x56, 0xda, 0x86, 0x6e, - 0x18, 0x73, 0x3f, 0x0f, 0xaf, 0x84, 0x66, 0xb2, 0x92, 0x31, 0x7f, 0xf3, 0x70, 0x26, 0xf4, 0x4b, - 0x1d, 0x3d, 0xa3, 0xfd, 0x79, 0x18, 0x09, 0xca, 0x6b, 0x7d, 0xa4, 0x52, 0xa6, 0x12, 0x55, 0xd3, - 0x55, 0x7f, 0x09, 0x29, 0xc9, 0xfd, 0x97, 0x05, 0xdb, 0x67, 0xa9, 0xc8, 0x78, 0x2e, 0xd4, 0xd7, - 0xd7, 0xd8, 0xbf, 0x10, 0x33, 0x5e, 0x86, 0x70, 0x0f, 0x9a, 0x49, 0x4a, 0x9b, 0xeb, 0x7c, 0x57, - 0xea, 0xb3, 0xd4, 0x6b, 0x26, 0x29, 0x05, 0xc1, 0xe5, 0xa5, 0xe6, 0x96, 0x9e, 0x57, 0x7e, 0x8a, - 0x6d, 0x43, 0x37, 0xe0, 0x39, 0x9f, 0x70, 0x29, 0x4a, 0x4e, 0x4b, 0x99, 0xbe, 0x5a, 0xf8, 0x24, - 0x2a, 0x19, 0x55, 0x02, 0x79, 0xa2, 0xdd, 0x34, 0x9b, 0x5a, 0x42, 0xeb, 0xf3, 0xa8, 0x90, 0x17, - 0x44, 0x63, 0xd7, 0x53, 0x02, 0xc6, 0x52, 0xe5, 0x7c, 0x57, 0xa5, 0xb8, 0x9b, 0xc3, 0xfa, 0x97, - 0x0f, 0x75, 0xda, 0x3e, 0x15, 0x39, 0x67, 0xdb, 0xc6, 0x71, 0x00, 0x8f, 0x83, 0x1a, 0x7d, 0x98, - 0x77, 0x56, 0x7f, 0xd9, 0x32, 0x6c, 0xa3, 0x65, 0x94, 0x0c, 0xb4, 0x28, 0x45, 0xe9, 0xd9, 0xfd, - 0x04, 0xb6, 0x34, 0xa3, 0x5f, 0x3e, 0xc4, 0x5d, 0x57, 0x72, 0xa9, 0xd4, 0x6a, 0x7b, 0xf7, 0x2f, - 0x16, 0xdc, 0xbd, 0xb1, 0xec, 0xbd, 0x3f, 0x4a, 0x3f, 0x85, 0x16, 0x7e, 0xc8, 0x0c, 0x6d, 0x2a, - 0xad, 0xfb, 0xb8, 0xc7, 0x52, 0x97, 0xfb, 0x28, 0x3c, 0x8e, 0xf3, 0x6c, 0xee, 0xd1, 0x82, 0xed, - 0x9f, 0x41, 0xaf, 0x82, 0xd0, 0xef, 0xa5, 0x98, 0x97, 0xdd, 0xf3, 0x52, 0xcc, 0x71, 0xb6, 0x5f, - 0xf1, 0xa8, 0x50, 0xd4, 0xe8, 0x01, 0xb9, 0x40, 0xac, 0xa7, 0xf4, 0x9f, 0x35, 0x7f, 0x68, 0xb9, - 0xbf, 0x86, 0xe1, 0x13, 0x1e, 0x07, 0x91, 0xce, 0x27, 0x55, 0xd4, 0x9a, 0x82, 0x6f, 0x19, 0x14, - 0xf4, 0xd1, 0x0b, 0x69, 0xdf, 0x92, 0x4d, 0xf7, 0xa0, 0x37, 0x29, 0xc7, 0x99, 0x26, 0xbe, 0x06, - 0xe8, 0xce, 0x5f, 0x45, 0x52, 0x7f, 0x40, 0xd1, 0xb3, 0x7b, 0x17, 0x36, 0x4f, 0x44, 0xae, 0xf6, - 0x3e, 0x3a, 0x9f, 0xea, 0x9d, 0xdd, 0x5d, 0xd8, 0x5a, 0x84, 0x35, 0xb9, 0x0e, 0xd8, 0xfe, 0x79, - 0x35, 0x2a, 0xfc, 0xf3, 0xe9, 0xde, 0xaf, 0xa0, 0xa3, 0xb2, 0x82, 0xad, 0x43, 0xef, 0x8b, 0xf8, - 0x8a, 0x47, 0x61, 0x70, 0x96, 0x3a, 0x0d, 0xd6, 0x85, 0xd6, 0x38, 0x4f, 0x52, 0xc7, 0x62, 0x3d, - 0x68, 0x3f, 0xc3, 0xb2, 0x76, 0x9a, 0x0c, 0xa0, 0x83, 0x9d, 0x6f, 0x26, 0x1c, 0x1b, 0xe1, 0x71, - 0xce, 0xb3, 0xdc, 0x69, 0x21, 0xfc, 0x32, 0x0d, 0x78, 0x2e, 0x9c, 0x36, 0xdb, 0x00, 0xf8, 0x69, - 0x91, 0x27, 0xda, 0xac, 0xb3, 0xf7, 0x1b, 0x32, 0x9b, 0xe2, 0xde, 0x03, 0xed, 0x9f, 0x64, 0xa7, - 0xc1, 0xd6, 0xc0, 0xfe, 0x85, 0xb8, 0x76, 0x2c, 0xd6, 0x87, 0x35, 0xaf, 0x88, 0xf1, 0x53, 0x5b, - 0xed, 0x41, 0xdb, 0x05, 0x8e, 0x8d, 0x0a, 0x0c, 0x22, 0x15, 0x81, 0xd3, 0x62, 0x03, 0xe8, 0x7e, - 0xae, 0xbf, 0x9d, 0x9d, 0x36, 0xaa, 0xd0, 0x0c, 0xd7, 0x74, 0x50, 0x45, 0x1b, 0xa2, 0xb4, 0x86, - 0x12, 0xad, 0x42, 0xa9, 0xbb, 0x77, 0x06, 0xdd, 0x72, 0x6c, 0xb1, 0x3b, 0xd0, 0xd7, 0x31, 0x20, - 0xe4, 0x34, 0xf0, 0x10, 0x34, 0x9c, 0x1c, 0x0b, 0x0f, 0x8c, 0x03, 0xc8, 0x69, 0xe2, 0x13, 0x4e, - 0x19, 0xc7, 0x26, 0x12, 0xe6, 0xb1, 0xef, 0xb4, 0xd0, 0x90, 0xba, 0x95, 0x13, 0xec, 0x3d, 0x85, - 0x35, 0x7a, 0x3c, 0xc3, 0x4b, 0xdc, 0xd0, 0xfe, 0x34, 0xe2, 0x34, 0x90, 0x47, 0xdc, 0x5d, 0x59, - 0x5b, 0xc8, 0x07, 0x1d, 0x47, 0xc9, 0x4d, 0x0c, 0x41, 0x71, 0xa3, 0x00, 0x1b, 0xe3, 0x2b, 0xdb, - 0x0c, 0xdb, 0x84, 0x3b, 0x25, 0x47, 0x1a, 0x52, 0x0e, 0x4f, 0x44, 0xae, 0x00, 0xc7, 0x22, 0xff, - 0x95, 0xd8, 0x44, 0x5a, 0x3d, 0x31, 0x4b, 0xae, 0x84, 0x46, 0xec, 0xbd, 0x47, 0xd0, 0x2d, 0x6b, - 0xcd, 0x70, 0x58, 0x42, 0x95, 0x43, 0x05, 0x38, 0x56, 0xed, 0x41, 0x23, 0xcd, 0xbd, 0x47, 0x34, - 0x63, 0x30, 0x55, 0x8d, 0x13, 0x6a, 0x44, 0xa7, 0xc6, 0x65, 0x98, 0xea, 0x8b, 0x13, 0x69, 0xc4, - 0xfd, 0x2a, 0x39, 0xae, 0x44, 0x96, 0x3b, 0xf6, 0xc1, 0x57, 0x36, 0x74, 0x54, 0xfa, 0xb1, 0x47, - 0xd0, 0x37, 0x7e, 0x3e, 0xb1, 0x0f, 0xb1, 0x10, 0x6e, 0xff, 0x2a, 0xdb, 0xfe, 0xc6, 0x2d, 0x5c, - 0xe5, 0xac, 0xdb, 0x60, 0x3f, 0x01, 0xa8, 0xc7, 0x05, 0xbb, 0x4b, 0x33, 0xf4, 0xe6, 0xf8, 0xd8, - 0x1e, 0xd2, 0x8b, 0xc6, 0x92, 0x1f, 0x6b, 0x6e, 0x83, 0xfd, 0x1c, 0xd6, 0x75, 0x67, 0x50, 0x24, - 0xb1, 0x91, 0xd1, 0x2c, 0x96, 0x0c, 0x82, 0xb7, 0x3a, 0xfb, 0xbc, 0x72, 0xa6, 0xf8, 0x62, 0xc3, - 0x25, 0x9d, 0x47, 0xb9, 0xf9, 0xe6, 0xca, 0x9e, 0xe4, 0x36, 0xd8, 0x09, 0xf4, 0x55, 0xe7, 0x50, - 0x73, 0xfd, 0x1e, 0xda, 0xae, 0x6a, 0x25, 0x6f, 0x0d, 0xe8, 0x08, 0x06, 0x66, 0xb1, 0x33, 0x62, - 0x72, 0x49, 0x57, 0x50, 0x4e, 0x96, 0xf5, 0x05, 0xb7, 0x71, 0x38, 0xfc, 0xdb, 0xeb, 0x91, 0xf5, - 0xf5, 0xeb, 0x91, 0xf5, 0xef, 0xd7, 0x23, 0xeb, 0x77, 0x6f, 0x46, 0x8d, 0xaf, 0xdf, 0x8c, 0x1a, - 0xff, 0x7c, 0x33, 0x6a, 0x4c, 0x3a, 0xf4, 0x93, 0xf3, 0xfb, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, - 0x02, 0x25, 0x21, 0xbf, 0xf6, 0x14, 0x00, 0x00, + // 2022 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x4f, 0x6f, 0x1c, 0x49, + 0x15, 0x9f, 0x9e, 0x9e, 0x19, 0xcf, 0xbc, 0x19, 0x3b, 0x9d, 0xb2, 0xb3, 0x0c, 0x26, 0x0c, 0x56, + 0x67, 0x15, 0x8c, 0x0f, 0xd6, 0xc6, 0x2c, 0x5a, 0xb4, 0x12, 0x10, 0x6c, 0x67, 0x9d, 0x05, 0x07, + 0x27, 0x6d, 0x67, 0x39, 0xa2, 0x9a, 0xee, 0xf2, 0xb8, 0xe5, 0x9e, 0xee, 0x4e, 0x57, 0xb7, 0xad, + 0x39, 0x20, 0x3e, 0x02, 0x5c, 0x38, 0x20, 0x71, 0xe5, 0xba, 0x47, 0x3e, 0x02, 0x70, 0x8c, 0x90, + 0x90, 0x10, 0x27, 0x94, 0x7c, 0x0d, 0x0e, 0xe8, 0xbd, 0xaa, 0xee, 0xae, 0xb1, 0x67, 0x12, 0x72, + 0xe0, 0xd6, 0xef, 0x4f, 0xbd, 0xf7, 0xea, 0x57, 0xef, 0x4f, 0x55, 0xc3, 0x5a, 0x30, 0xbd, 0x4e, + 0xb2, 0x4b, 0x91, 0xed, 0xa6, 0x59, 0x92, 0x27, 0xac, 0x99, 0x8e, 0xdd, 0x6d, 0x60, 0x2f, 0x0a, + 0x91, 0xcd, 0x4e, 0x73, 0x9e, 0x17, 0xd2, 0x13, 0xaf, 0x0a, 0x21, 0x73, 0xc6, 0xa0, 0x15, 0xf3, + 0xa9, 0x18, 0x5a, 0x5b, 0xd6, 0x76, 0xcf, 0xa3, 0x6f, 0x37, 0x85, 0x8d, 0x83, 0x64, 0x3a, 0x4d, + 0xe2, 0x5f, 0x92, 0x0d, 0x4f, 0xc8, 0x34, 0x89, 0xa5, 0x60, 0x1f, 0x41, 0x27, 0x13, 0xb2, 0x88, + 0x72, 0xd2, 0xee, 0x7a, 0x9a, 0x62, 0x0e, 0xd8, 0x53, 0x39, 0x19, 0x36, 0xc9, 0x04, 0x7e, 0xa2, + 0xa6, 0x4c, 0x8a, 0xcc, 0x17, 0x43, 0x9b, 0x98, 0x9a, 0x42, 0xbe, 0x8a, 0x6b, 0xd8, 0x52, 0x7c, + 0x45, 0xb9, 0x5f, 0x5b, 0xb0, 0x3e, 0x17, 0xdc, 0x07, 0x7b, 0xfc, 0x14, 0x06, 0xca, 0x87, 0xb2, + 0x40, 0x7e, 0xfb, 0x7b, 0xce, 0x6e, 0x3a, 0xde, 0x3d, 0x35, 0xf8, 0xde, 0x9c, 0x16, 0xfb, 0x0c, + 0x56, 0x65, 0x31, 0x3e, 0xe3, 0xf2, 0x52, 0x2f, 0x6b, 0x6d, 0xd9, 0xdb, 0xfd, 0xbd, 0xbb, 0xb4, + 0xcc, 0x14, 0x78, 0xf3, 0x7a, 0xee, 0x9f, 0x2c, 0xe8, 0x1f, 0x5c, 0x08, 0x5f, 0xd3, 0x18, 0x68, + 0xca, 0xa5, 0x14, 0x41, 0x19, 0xa8, 0xa2, 0xd8, 0x06, 0xb4, 0xf3, 0x24, 0xe7, 0x11, 0x85, 0xda, + 0xf6, 0x14, 0xc1, 0x46, 0x00, 0xb2, 0xf0, 0x7d, 0x21, 0xe5, 0x79, 0x11, 0x51, 0xa8, 0x6d, 0xcf, + 0xe0, 0xa0, 0xb5, 0x73, 0x1e, 0x46, 0x22, 0x20, 0x98, 0xda, 0x9e, 0xa6, 0xd8, 0x10, 0x56, 0xae, + 0x79, 0x16, 0x87, 0xf1, 0x64, 0xd8, 0x26, 0x41, 0x49, 0xe2, 0x8a, 0x40, 0xe4, 0x3c, 0x8c, 0x86, + 0x9d, 0x2d, 0x6b, 0x7b, 0xe0, 0x69, 0xca, 0x1d, 0x00, 0x1c, 0x16, 0xd3, 0x54, 0x47, 0xfd, 0x67, + 0x0b, 0xe0, 0x38, 0xe1, 0x81, 0x0e, 0xfa, 0x63, 0x58, 0x3d, 0x0f, 0xe3, 0x50, 0x5e, 0x88, 0x60, + 0x7f, 0x96, 0x0b, 0x49, 0xb1, 0xdb, 0xde, 0x3c, 0x13, 0x83, 0xa5, 0xa8, 0x95, 0x4a, 0x93, 0x54, + 0x0c, 0x0e, 0xdb, 0x84, 0x6e, 0x9a, 0x25, 0x93, 0x4c, 0x48, 0xa9, 0x4f, 0xbb, 0xa2, 0x71, 0xed, + 0x54, 0xe4, 0x7c, 0x3f, 0x8c, 0xa3, 0x64, 0xa2, 0xcf, 0xdc, 0xe0, 0xb0, 0x87, 0xb0, 0x56, 0x53, + 0x47, 0x67, 0x5f, 0x1e, 0xd2, 0xbe, 0x7a, 0xde, 0x0d, 0xae, 0xfb, 0x7b, 0x0b, 0x56, 0x4f, 0x2f, + 0x78, 0x16, 0x84, 0xf1, 0xe4, 0x28, 0x4b, 0x8a, 0x14, 0x37, 0x9c, 0xf3, 0x6c, 0x22, 0x72, 0x9d, + 0xb9, 0x9a, 0xc2, 0x7c, 0x3e, 0x3c, 0x3c, 0xc6, 0x38, 0x6d, 0xcc, 0x67, 0xfc, 0x56, 0xfb, 0xcc, + 0x64, 0x7e, 0x9c, 0xf8, 0x3c, 0x0f, 0x93, 0x58, 0x87, 0x39, 0xcf, 0xa4, 0x9c, 0x9d, 0xc5, 0x3e, + 0x81, 0x6e, 0x53, 0xce, 0x12, 0x85, 0xfb, 0x2b, 0x62, 0x2d, 0x69, 0x93, 0xa4, 0xa2, 0xdd, 0x7f, + 0xd8, 0x00, 0xa7, 0xb3, 0xd8, 0xd7, 0x80, 0x6e, 0x41, 0x9f, 0x80, 0x79, 0x72, 0x25, 0xe2, 0xbc, + 0x84, 0xd3, 0x64, 0xa1, 0x31, 0x22, 0xcf, 0xd2, 0x12, 0xca, 0x8a, 0x66, 0xf7, 0xa1, 0x97, 0x09, + 0x5f, 0xc4, 0x39, 0x0a, 0x6d, 0x12, 0xd6, 0x0c, 0xe6, 0xc2, 0x60, 0xca, 0x65, 0x2e, 0xb2, 0x39, + 0x30, 0xe7, 0x78, 0x6c, 0x07, 0x1c, 0x93, 0x3e, 0xca, 0xc3, 0x40, 0x03, 0x7a, 0x8b, 0x8f, 0xf6, + 0x68, 0x13, 0xa5, 0xbd, 0x8e, 0xb2, 0x67, 0xf2, 0xd0, 0x9e, 0x49, 0x93, 0xbd, 0x15, 0x65, 0xef, + 0x26, 0x1f, 0xed, 0x8d, 0xa3, 0xc4, 0xbf, 0x0c, 0xe3, 0x09, 0x1d, 0x40, 0x97, 0xa0, 0x9a, 0xe3, + 0xb1, 0x1f, 0x81, 0x53, 0xc4, 0x99, 0x90, 0x49, 0x74, 0x25, 0x02, 0x3a, 0x47, 0x39, 0xec, 0x19, + 0x15, 0x67, 0x9e, 0xb0, 0x77, 0x4b, 0xd5, 0x38, 0x21, 0x50, 0x45, 0xa6, 0x4f, 0x68, 0x04, 0x30, + 0xa6, 0x40, 0xce, 0x66, 0xa9, 0x18, 0xf6, 0x55, 0x96, 0xd5, 0x1c, 0xf6, 0x09, 0xac, 0x4b, 0xe1, + 0x27, 0x71, 0x20, 0xf7, 0xc5, 0x45, 0x18, 0x07, 0xcf, 0x08, 0x8b, 0xe1, 0x80, 0x20, 0x5e, 0x24, + 0x72, 0xff, 0x68, 0xc1, 0xc0, 0x6c, 0x1b, 0x46, 0x43, 0xb3, 0x96, 0x34, 0xb4, 0xa6, 0xd9, 0xd0, + 0xd8, 0xf7, 0xaa, 0xc6, 0xa5, 0x1a, 0x11, 0xed, 0xef, 0x79, 0x96, 0x60, 0x85, 0x7b, 0x24, 0xa8, + 0x7a, 0xd9, 0x23, 0xe8, 0x67, 0x22, 0xe2, 0xb3, 0xaa, 0x03, 0xa1, 0xfe, 0x1d, 0xd4, 0xf7, 0x6a, + 0xb6, 0x67, 0xea, 0xb8, 0x7f, 0x6d, 0x42, 0xdf, 0x10, 0xde, 0xca, 0x0d, 0xeb, 0x7f, 0xcc, 0x8d, + 0xe6, 0x92, 0xdc, 0xd8, 0x2a, 0x43, 0x2a, 0xc6, 0x87, 0x61, 0xa6, 0xcb, 0xc5, 0x64, 0x55, 0x1a, + 0x73, 0xc9, 0x68, 0xb2, 0xd8, 0x36, 0xdc, 0x31, 0x48, 0x23, 0x15, 0x6f, 0xb2, 0xd9, 0x2e, 0x30, + 0x62, 0x1d, 0xf0, 0xdc, 0xbf, 0x78, 0x99, 0xea, 0xd3, 0xe9, 0xd0, 0x11, 0x2f, 0x90, 0xb0, 0xef, + 0x40, 0x5b, 0xe6, 0x7c, 0x22, 0x28, 0x15, 0xd7, 0xf6, 0x7a, 0x94, 0x3a, 0xc8, 0xf0, 0x14, 0xdf, + 0x00, 0xbf, 0xfb, 0x1e, 0xf0, 0xdd, 0xff, 0x34, 0x61, 0x75, 0xae, 0xd1, 0x2f, 0x1a, 0x88, 0xb5, + 0xc7, 0xe6, 0x12, 0x8f, 0x5b, 0xd0, 0x2a, 0xe2, 0x50, 0x1d, 0xf6, 0xda, 0xde, 0x00, 0xe5, 0x2f, + 0xe3, 0x30, 0xc7, 0xec, 0xf3, 0x48, 0x62, 0xc4, 0xd4, 0x7a, 0x5f, 0x42, 0x7c, 0x02, 0xeb, 0x75, + 0xea, 0x1f, 0x1e, 0x1e, 0x1f, 0x27, 0xfe, 0x65, 0xd5, 0x19, 0x17, 0x89, 0x18, 0x53, 0xe3, 0x90, + 0x4a, 0xf8, 0x69, 0x43, 0x0d, 0xc4, 0xef, 0x42, 0xdb, 0xc7, 0x01, 0x45, 0x28, 0xe9, 0x84, 0x32, + 0x26, 0xd6, 0xd3, 0x86, 0xa7, 0xe4, 0xec, 0x63, 0x68, 0x05, 0xc5, 0x34, 0xd5, 0x58, 0xad, 0xa1, + 0x5e, 0x3d, 0x32, 0x9e, 0x36, 0x3c, 0x92, 0xa2, 0x56, 0x94, 0xf0, 0x60, 0xd8, 0xab, 0xb5, 0xea, + 0x49, 0x82, 0x5a, 0x28, 0x45, 0x2d, 0xac, 0x49, 0xaa, 0x4f, 0xad, 0x55, 0xb7, 0x47, 0xd4, 0x42, + 0xe9, 0x7e, 0x17, 0x3a, 0x52, 0x25, 0xf2, 0x8f, 0xe1, 0xee, 0x1c, 0xfa, 0xc7, 0xa1, 0x24, 0xa8, + 0x94, 0x78, 0x68, 0x2d, 0x9b, 0xc6, 0xe5, 0xfa, 0x11, 0x00, 0xed, 0xe9, 0x49, 0x96, 0x25, 0x59, + 0x79, 0x2b, 0xb0, 0xaa, 0x5b, 0x81, 0xfb, 0x6d, 0xe8, 0xe1, 0x5e, 0xde, 0x21, 0xc6, 0x4d, 0x2c, + 0x13, 0xa7, 0x30, 0xa0, 0xe8, 0x5f, 0x1c, 0x2f, 0xd1, 0x60, 0x7b, 0xb0, 0xa1, 0x46, 0xb3, 0x4a, + 0xe7, 0xe7, 0x89, 0x0c, 0x69, 0xc0, 0xa8, 0xc2, 0x5a, 0x28, 0xc3, 0x11, 0x20, 0xd0, 0xdc, 0xe9, + 0x8b, 0xe3, 0x72, 0x5e, 0x96, 0xb4, 0xfb, 0x03, 0xe8, 0xa1, 0x47, 0xe5, 0x6e, 0x1b, 0x3a, 0x24, + 0x28, 0x71, 0x70, 0x2a, 0x38, 0x75, 0x40, 0x9e, 0x96, 0xbb, 0xbf, 0xb5, 0xa0, 0xaf, 0xda, 0x95, + 0x5a, 0xf9, 0xa1, 0xdd, 0x6a, 0x6b, 0x6e, 0x79, 0x59, 0xef, 0xa6, 0xc5, 0x5d, 0x00, 0x6a, 0x38, + 0x4a, 0xa1, 0x55, 0x1f, 0x6f, 0xcd, 0xf5, 0x0c, 0x0d, 0x3c, 0x98, 0x9a, 0x5a, 0x00, 0xed, 0x1f, + 0x9a, 0x30, 0xd0, 0x47, 0xaa, 0x54, 0xfe, 0x4f, 0x65, 0xa7, 0x2b, 0xa3, 0x65, 0x56, 0xc6, 0xc3, + 0xb2, 0x32, 0xda, 0xf5, 0x36, 0xea, 0x2c, 0xaa, 0x0b, 0xe3, 0x81, 0x2e, 0x8c, 0x0e, 0xa9, 0xad, + 0x96, 0x85, 0x51, 0x6a, 0xa9, 0xba, 0x78, 0xa0, 0xeb, 0x62, 0xa5, 0x56, 0xaa, 0x52, 0xaa, 0x2a, + 0x8b, 0x07, 0xba, 0x2c, 0xba, 0xb5, 0x52, 0x75, 0xcc, 0x55, 0x55, 0xac, 0x40, 0x9b, 0x8e, 0xd3, + 0xfd, 0x1c, 0x1c, 0x13, 0x1a, 0xaa, 0x89, 0x87, 0x5a, 0x38, 0x97, 0x0a, 0x86, 0x92, 0xa7, 0xd7, + 0xbe, 0x82, 0xd5, 0xb9, 0xa6, 0x82, 0xb3, 0x31, 0x94, 0x07, 0x3c, 0xf6, 0x45, 0x54, 0x5d, 0x4e, + 0x0d, 0x8e, 0x91, 0x64, 0xcd, 0xda, 0xb2, 0x36, 0x31, 0x97, 0x64, 0xc6, 0x15, 0xd3, 0x9e, 0xbb, + 0x62, 0xfe, 0xdd, 0x82, 0x81, 0xb9, 0x00, 0x6f, 0xa9, 0x4f, 0xb2, 0xec, 0x20, 0x09, 0xd4, 0x69, + 0xb6, 0xbd, 0x92, 0xc4, 0xd4, 0xc7, 0xcf, 0x88, 0x4b, 0xa9, 0x33, 0xb0, 0xa2, 0xb5, 0xec, 0xd4, + 0x4f, 0xd2, 0xf2, 0xd1, 0x50, 0xd1, 0x5a, 0x76, 0x2c, 0xae, 0x44, 0xa4, 0x47, 0x4d, 0x45, 0xa3, + 0xb7, 0x67, 0x42, 0x4a, 0x4c, 0x13, 0xd5, 0x21, 0x4b, 0x12, 0x57, 0x79, 0xfc, 0xfa, 0x80, 0x17, + 0x52, 0xe8, 0xdb, 0x4d, 0x45, 0x23, 0x2c, 0xf8, 0xb8, 0xe1, 0x59, 0x52, 0xc4, 0xe5, 0x9d, 0xc6, + 0xe0, 0xb8, 0xd7, 0x70, 0xf7, 0x79, 0x91, 0x4d, 0x04, 0x25, 0x71, 0xf9, 0x56, 0xda, 0x84, 0x6e, + 0x18, 0x73, 0x3f, 0x0f, 0xaf, 0x84, 0x46, 0xb2, 0xa2, 0x31, 0x7f, 0xf3, 0x70, 0x2a, 0xf4, 0xa5, + 0x8e, 0xbe, 0x51, 0xff, 0x3c, 0x8c, 0x04, 0xe5, 0xb5, 0xde, 0x52, 0x49, 0x53, 0x89, 0xaa, 0xe9, + 0xaa, 0x5f, 0x42, 0x8a, 0x72, 0xff, 0x65, 0xc1, 0xe6, 0x49, 0x2a, 0x32, 0x9e, 0x0b, 0xf5, 0xfa, + 0x3a, 0xf5, 0x2f, 0xc4, 0x94, 0x97, 0x21, 0xdc, 0x87, 0x66, 0x92, 0x92, 0x73, 0x9d, 0xef, 0x4a, + 0x7c, 0x92, 0x7a, 0xcd, 0x24, 0xa5, 0x20, 0xb8, 0xbc, 0xd4, 0xd8, 0xd2, 0xf7, 0xd2, 0xa7, 0xd8, + 0x26, 0x74, 0x03, 0x9e, 0xf3, 0x31, 0x97, 0xa2, 0xc4, 0xb4, 0xa4, 0xe9, 0xd5, 0xc2, 0xc7, 0x51, + 0x89, 0xa8, 0x22, 0xc8, 0x12, 0x79, 0xd3, 0x68, 0x6a, 0x0a, 0xb5, 0xcf, 0xa3, 0x42, 0x5e, 0x10, + 0x8c, 0x5d, 0x4f, 0x11, 0x18, 0x4b, 0x95, 0xf3, 0x5d, 0x95, 0xe2, 0x6e, 0x0e, 0xab, 0x5f, 0x3d, + 0xd2, 0x69, 0xfb, 0x4c, 0xe4, 0x9c, 0x6d, 0x1a, 0xdb, 0x01, 0xdc, 0x0e, 0x4a, 0xf4, 0x66, 0xde, + 0x5b, 0xfd, 0x65, 0xcb, 0xb0, 0x8d, 0x96, 0x51, 0x22, 0xd0, 0xa2, 0x14, 0xa5, 0x6f, 0xf7, 0x53, + 0xd8, 0xd0, 0x88, 0x7e, 0xf5, 0x08, 0xbd, 0x2e, 0xc5, 0x52, 0x89, 0x95, 0x7b, 0xf7, 0x2f, 0x16, + 0xdc, 0xbb, 0xb1, 0xec, 0x83, 0x1f, 0xa5, 0x9f, 0x41, 0x0b, 0x1f, 0x32, 0x43, 0x9b, 0x4a, 0xeb, + 0x01, 0xfa, 0x58, 0x68, 0x72, 0x17, 0x89, 0x27, 0x71, 0x9e, 0xcd, 0x3c, 0x5a, 0xb0, 0xf9, 0x33, + 0xe8, 0x55, 0x2c, 0xb4, 0x7b, 0x29, 0x66, 0x65, 0xf7, 0xbc, 0x14, 0x33, 0x9c, 0xed, 0x57, 0x3c, + 0x2a, 0x14, 0x34, 0x7a, 0x40, 0xce, 0x01, 0xeb, 0x29, 0xf9, 0xe7, 0xcd, 0x1f, 0x5a, 0xee, 0xaf, + 0x61, 0xf8, 0x94, 0xc7, 0x41, 0xa4, 0xf3, 0x49, 0x15, 0xb5, 0x86, 0xe0, 0x5b, 0x06, 0x04, 0x7d, + 0xb4, 0x42, 0xd2, 0x77, 0x64, 0xd3, 0x7d, 0xe8, 0x8d, 0xcb, 0x71, 0xa6, 0x81, 0xaf, 0x19, 0x74, + 0xe6, 0xaf, 0x22, 0xa9, 0x1f, 0x50, 0xf4, 0xed, 0xde, 0x83, 0xf5, 0x23, 0x91, 0x2b, 0xdf, 0x07, + 0xe7, 0x13, 0xed, 0xd9, 0xdd, 0x86, 0x8d, 0x79, 0xb6, 0x06, 0xd7, 0x01, 0xdb, 0x3f, 0xaf, 0x46, + 0x85, 0x7f, 0x3e, 0xd9, 0xf9, 0x15, 0x74, 0x54, 0x56, 0xb0, 0x55, 0xe8, 0x7d, 0x19, 0x5f, 0xf1, + 0x28, 0x0c, 0x4e, 0x52, 0xa7, 0xc1, 0xba, 0xd0, 0x3a, 0xcd, 0x93, 0xd4, 0xb1, 0x58, 0x0f, 0xda, + 0xcf, 0xb1, 0xac, 0x9d, 0x26, 0x03, 0xe8, 0x60, 0xe7, 0x9b, 0x0a, 0xc7, 0x46, 0xf6, 0x69, 0xce, + 0xb3, 0xdc, 0x69, 0x21, 0xfb, 0x65, 0x1a, 0xf0, 0x5c, 0x38, 0x6d, 0xb6, 0x06, 0xf0, 0xd3, 0x22, + 0x4f, 0xb4, 0x5a, 0x67, 0xe7, 0x37, 0xa4, 0x36, 0x41, 0xdf, 0x03, 0x6d, 0x9f, 0x68, 0xa7, 0xc1, + 0x56, 0xc0, 0xfe, 0x85, 0xb8, 0x76, 0x2c, 0xd6, 0x87, 0x15, 0xaf, 0x88, 0xf1, 0xa9, 0xad, 0x7c, + 0x90, 0xbb, 0xc0, 0xb1, 0x51, 0x80, 0x41, 0xa4, 0x22, 0x70, 0x5a, 0x6c, 0x00, 0xdd, 0x2f, 0xf4, + 0xdb, 0xd9, 0x69, 0xa3, 0x08, 0xd5, 0x70, 0x4d, 0x07, 0x45, 0xe4, 0x10, 0xa9, 0x15, 0xa4, 0x68, + 0x15, 0x52, 0xdd, 0x9d, 0x13, 0xe8, 0x96, 0x63, 0x8b, 0xdd, 0x81, 0xbe, 0x8e, 0x01, 0x59, 0x4e, + 0x03, 0x37, 0x41, 0xc3, 0xc9, 0xb1, 0x70, 0xc3, 0x38, 0x80, 0x9c, 0x26, 0x7e, 0xe1, 0x94, 0x71, + 0x6c, 0x02, 0x61, 0x16, 0xfb, 0x4e, 0x0b, 0x15, 0xa9, 0x5b, 0x39, 0xc1, 0xce, 0x33, 0x58, 0xa1, + 0xcf, 0x13, 0x3c, 0xc4, 0x35, 0x6d, 0x4f, 0x73, 0x9c, 0x06, 0xe2, 0x88, 0xde, 0x95, 0xb6, 0x85, + 0x78, 0xd0, 0x76, 0x14, 0xdd, 0xc4, 0x10, 0x14, 0x36, 0x8a, 0x61, 0xef, 0xc4, 0xd0, 0x2d, 0xdb, + 0x0c, 0x5b, 0x87, 0x3b, 0x25, 0x46, 0x9a, 0xa5, 0x0c, 0x1e, 0x89, 0x5c, 0x31, 0x1c, 0x8b, 0xec, + 0x57, 0x64, 0x13, 0x61, 0xf5, 0xc4, 0x34, 0xb9, 0x12, 0x9a, 0x63, 0xa3, 0x47, 0x9c, 0x6a, 0x9a, + 0x6e, 0xe1, 0x02, 0xa4, 0xcf, 0xb0, 0xcd, 0x38, 0xed, 0x9d, 0xc7, 0xd0, 0x2d, 0x4b, 0xd1, 0xf0, + 0x57, 0xb2, 0x2a, 0x7f, 0x8a, 0xe1, 0x58, 0xb5, 0x03, 0xcd, 0x69, 0xee, 0x3c, 0xa6, 0x11, 0x84, + 0x99, 0x6c, 0x00, 0xa0, 0x39, 0x3a, 0x73, 0x2e, 0xc3, 0x54, 0x9f, 0xab, 0x48, 0x23, 0xee, 0x57, + 0xb9, 0x73, 0x25, 0xb2, 0xdc, 0xb1, 0xf7, 0xbe, 0xb6, 0xa1, 0xa3, 0xb2, 0x93, 0x3d, 0x86, 0xbe, + 0xf1, 0x6f, 0x8a, 0x7d, 0x84, 0x75, 0x72, 0xfb, 0x4f, 0xda, 0xe6, 0x37, 0x6e, 0xf1, 0x55, 0x4a, + 0xbb, 0x0d, 0xf6, 0x13, 0x80, 0x7a, 0x9a, 0xb0, 0x7b, 0x34, 0x62, 0x6f, 0x4e, 0x97, 0xcd, 0x21, + 0xdd, 0x43, 0x16, 0xfc, 0x77, 0x73, 0x1b, 0xec, 0xe7, 0xb0, 0xaa, 0x1b, 0x87, 0xc2, 0x8c, 0x8d, + 0x8c, 0x5e, 0xb2, 0x60, 0x4e, 0xbc, 0xd3, 0xd8, 0x17, 0x95, 0x31, 0x85, 0x17, 0x1b, 0x2e, 0x68, + 0x4c, 0xca, 0xcc, 0x37, 0x97, 0xb6, 0x2c, 0xb7, 0xc1, 0x8e, 0xa0, 0xaf, 0x1a, 0x8b, 0x1a, 0xfb, + 0xf7, 0x51, 0x77, 0x59, 0xa7, 0x79, 0x67, 0x40, 0x07, 0x30, 0x30, 0x7b, 0x01, 0x23, 0x24, 0x17, + 0x34, 0x0d, 0x65, 0x64, 0x51, 0xdb, 0x70, 0x1b, 0xfb, 0xc3, 0xbf, 0xbd, 0x19, 0x59, 0xaf, 0xdf, + 0x8c, 0xac, 0x7f, 0xbf, 0x19, 0x59, 0xbf, 0x7b, 0x3b, 0x6a, 0xbc, 0x7e, 0x3b, 0x6a, 0xfc, 0xf3, + 0xed, 0xa8, 0x31, 0xee, 0xd0, 0x3f, 0xd0, 0xef, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x89, 0xaa, + 0x52, 0x17, 0x15, 0x15, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2679,7 +2686,7 @@ type WorkerClient interface { QueryStatus(ctx context.Context, in *QueryStatusRequest, opts ...grpc.CallOption) (*QueryStatusResponse, error) // PurgeRelay purges relay log files for this dm-worker PurgeRelay(ctx context.Context, in *PurgeRelayRequest, opts ...grpc.CallOption) (*CommonWorkerResponse, error) - // Operate (get/set/remove) schema for a specified upstream table. + // Operate (get/set/remove) schema for a specified table in tracker. // a `set`/`remove` operation should be an one-time operation (only take effect once), // so we use a gRPC method rather than a etcd operation now (no persistent operation state). OperateSchema(ctx context.Context, in *OperateWorkerSchemaRequest, opts ...grpc.CallOption) (*CommonWorkerResponse, error) @@ -2755,7 +2762,7 @@ type WorkerServer interface { QueryStatus(context.Context, *QueryStatusRequest) (*QueryStatusResponse, error) // PurgeRelay purges relay log files for this dm-worker PurgeRelay(context.Context, *PurgeRelayRequest) (*CommonWorkerResponse, error) - // Operate (get/set/remove) schema for a specified upstream table. + // Operate (get/set/remove) schema for a specified table in tracker. // a `set`/`remove` operation should be an one-time operation (only take effect once), // so we use a gRPC method rather than a etcd operation now (no persistent operation state). OperateSchema(context.Context, *OperateWorkerSchemaRequest) (*CommonWorkerResponse, error) diff --git a/dm/dm/proto/dmworker.proto b/dm/dm/proto/dmworker.proto index 1794a6b3cad..c472c7a4017 100644 --- a/dm/dm/proto/dmworker.proto +++ b/dm/dm/proto/dmworker.proto @@ -9,7 +9,7 @@ service Worker { // PurgeRelay purges relay log files for this dm-worker rpc PurgeRelay (PurgeRelayRequest) returns (CommonWorkerResponse) {} - // Operate (get/set/remove) schema for a specified upstream table. + // Operate (get/set/remove) schema for a specified table in tracker. // a `set`/`remove` operation should be an one-time operation (only take effect once), // so we use a gRPC method rather than a etcd operation now (no persistent operation state). rpc OperateSchema(OperateWorkerSchemaRequest) returns(CommonWorkerResponse) {} @@ -37,7 +37,7 @@ message QueryStatusRequest { message CommonWorkerResponse { bool result = 1; - string msg = 2; // when result is true, msg is empty + string msg = 2; // when result is true, msg is empty, except for operate schema string source = 3; // source ID, set by dm-master string worker = 4; // worker name, set by dm-worker config } @@ -316,6 +316,8 @@ enum SchemaOp { GetSchema = 1; SetSchema = 2; RemoveSchema = 3; + ListSchema = 4; + ListTable = 5; } message OperateWorkerSchemaRequest { diff --git a/dm/errors.toml b/dm/errors.toml index d5bbe1966a2..8e795adf873 100644 --- a/dm/errors.toml +++ b/dm/errors.toml @@ -2962,6 +2962,24 @@ description = "" workaround = "" tags = ["internal", "high"] +[error.DM-schema-tracker-44013] +message = "can not marshal struct maybe `%v` is unable to serialize" +description = "" +workaround = "" +tags = ["downstream", "high"] + +[error.DM-schema-tracker-44014] +message = "can not unmarshal json maybe `%s` is not proper JSON" +description = "" +workaround = "" +tags = ["downstream", "high"] + +[error.DM-schema-tracker-44015] +message = "can not find `%s` in tracker" +description = "" +workaround = "" +tags = ["downstream", "high"] + [error.DM-scheduler-46001] message = "the scheduler has not started" description = "" diff --git a/dm/openapi/gen.server.go b/dm/openapi/gen.server.go index 1f394878ec0..01bb9afeaab 100644 --- a/dm/openapi/gen.server.go +++ b/dm/openapi/gen.server.go @@ -82,25 +82,25 @@ type ServerInterface interface { DMAPIDeleteTask(ctx echo.Context, taskName string, params DMAPIDeleteTaskParams) error // pause task // (POST /api/v1/tasks/{task-name}/pause) - DMAPPauseTask(ctx echo.Context, taskName string) error + DMAPIPauseTask(ctx echo.Context, taskName string) error // resume task // (POST /api/v1/tasks/{task-name}/resume) DMAPIResumeTask(ctx echo.Context, taskName string) error // get task source schema list // (GET /api/v1/tasks/{task-name}/sources/{source-name}/schemas) - DMAPIGetTaskSourceSchemaList(ctx echo.Context, taskName string, sourceName string) error + DMAPIGetSchemaListByTaskAndSource(ctx echo.Context, taskName string, sourceName string) error // get task source table list // (GET /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}) - DMAPIGetTaskSourceTableList(ctx echo.Context, taskName string, sourceName string, schemaName string) error + DMAPIGetTableListByTaskAndSource(ctx echo.Context, taskName string, sourceName string, schemaName string) error // delete task source table structure // (DELETE /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}/{table-name}) - DMAPIDeleteTaskSourceTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error + DMAPIDeleteTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error // get task source table structure // (GET /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}/{table-name}) - DMAPIGetTaskSourceTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error + DMAPIGetTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error // operate task source table structure // (PUT /api/v1/tasks/{task-name}/sources/{source-name}/schemas/{schema-name}/{table-name}) - DMAPIOperateTaskSourceTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error + DMAPIOperateTableStructure(ctx echo.Context, taskName string, sourceName string, schemaName string, tableName string) error // get task status // (GET /api/v1/tasks/{task-name}/status) DMAPIGetTaskStatus(ctx echo.Context, taskName string, params DMAPIGetTaskStatusParams) error @@ -410,8 +410,8 @@ func (w *ServerInterfaceWrapper) DMAPIDeleteTask(ctx echo.Context) error { return err } -// DMAPPauseTask converts echo context to params. -func (w *ServerInterfaceWrapper) DMAPPauseTask(ctx echo.Context) error { +// DMAPIPauseTask converts echo context to params. +func (w *ServerInterfaceWrapper) DMAPIPauseTask(ctx echo.Context) error { var err error // ------------- Path parameter "task-name" ------------- var taskName string @@ -422,7 +422,7 @@ func (w *ServerInterfaceWrapper) DMAPPauseTask(ctx echo.Context) error { } // Invoke the callback with all the unmarshalled arguments - err = w.Handler.DMAPPauseTask(ctx, taskName) + err = w.Handler.DMAPIPauseTask(ctx, taskName) return err } @@ -442,8 +442,8 @@ func (w *ServerInterfaceWrapper) DMAPIResumeTask(ctx echo.Context) error { return err } -// DMAPIGetTaskSourceSchemaList converts echo context to params. -func (w *ServerInterfaceWrapper) DMAPIGetTaskSourceSchemaList(ctx echo.Context) error { +// DMAPIGetSchemaListByTaskAndSource converts echo context to params. +func (w *ServerInterfaceWrapper) DMAPIGetSchemaListByTaskAndSource(ctx echo.Context) error { var err error // ------------- Path parameter "task-name" ------------- var taskName string @@ -462,12 +462,12 @@ func (w *ServerInterfaceWrapper) DMAPIGetTaskSourceSchemaList(ctx echo.Context) } // Invoke the callback with all the unmarshalled arguments - err = w.Handler.DMAPIGetTaskSourceSchemaList(ctx, taskName, sourceName) + err = w.Handler.DMAPIGetSchemaListByTaskAndSource(ctx, taskName, sourceName) return err } -// DMAPIGetTaskSourceTableList converts echo context to params. -func (w *ServerInterfaceWrapper) DMAPIGetTaskSourceTableList(ctx echo.Context) error { +// DMAPIGetTableListByTaskAndSource converts echo context to params. +func (w *ServerInterfaceWrapper) DMAPIGetTableListByTaskAndSource(ctx echo.Context) error { var err error // ------------- Path parameter "task-name" ------------- var taskName string @@ -494,12 +494,12 @@ func (w *ServerInterfaceWrapper) DMAPIGetTaskSourceTableList(ctx echo.Context) e } // Invoke the callback with all the unmarshalled arguments - err = w.Handler.DMAPIGetTaskSourceTableList(ctx, taskName, sourceName, schemaName) + err = w.Handler.DMAPIGetTableListByTaskAndSource(ctx, taskName, sourceName, schemaName) return err } -// DMAPIDeleteTaskSourceTableStructure converts echo context to params. -func (w *ServerInterfaceWrapper) DMAPIDeleteTaskSourceTableStructure(ctx echo.Context) error { +// DMAPIDeleteTableStructure converts echo context to params. +func (w *ServerInterfaceWrapper) DMAPIDeleteTableStructure(ctx echo.Context) error { var err error // ------------- Path parameter "task-name" ------------- var taskName string @@ -534,12 +534,12 @@ func (w *ServerInterfaceWrapper) DMAPIDeleteTaskSourceTableStructure(ctx echo.Co } // Invoke the callback with all the unmarshalled arguments - err = w.Handler.DMAPIDeleteTaskSourceTableStructure(ctx, taskName, sourceName, schemaName, tableName) + err = w.Handler.DMAPIDeleteTableStructure(ctx, taskName, sourceName, schemaName, tableName) return err } -// DMAPIGetTaskSourceTableStructure converts echo context to params. -func (w *ServerInterfaceWrapper) DMAPIGetTaskSourceTableStructure(ctx echo.Context) error { +// DMAPIGetTableStructure converts echo context to params. +func (w *ServerInterfaceWrapper) DMAPIGetTableStructure(ctx echo.Context) error { var err error // ------------- Path parameter "task-name" ------------- var taskName string @@ -574,12 +574,12 @@ func (w *ServerInterfaceWrapper) DMAPIGetTaskSourceTableStructure(ctx echo.Conte } // Invoke the callback with all the unmarshalled arguments - err = w.Handler.DMAPIGetTaskSourceTableStructure(ctx, taskName, sourceName, schemaName, tableName) + err = w.Handler.DMAPIGetTableStructure(ctx, taskName, sourceName, schemaName, tableName) return err } -// DMAPIOperateTaskSourceTableStructure converts echo context to params. -func (w *ServerInterfaceWrapper) DMAPIOperateTaskSourceTableStructure(ctx echo.Context) error { +// DMAPIOperateTableStructure converts echo context to params. +func (w *ServerInterfaceWrapper) DMAPIOperateTableStructure(ctx echo.Context) error { var err error // ------------- Path parameter "task-name" ------------- var taskName string @@ -614,7 +614,7 @@ func (w *ServerInterfaceWrapper) DMAPIOperateTaskSourceTableStructure(ctx echo.C } // Invoke the callback with all the unmarshalled arguments - err = w.Handler.DMAPIOperateTaskSourceTableStructure(ctx, taskName, sourceName, schemaName, tableName) + err = w.Handler.DMAPIOperateTableStructure(ctx, taskName, sourceName, schemaName, tableName) return err } @@ -690,98 +690,98 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.GET(baseURL+"/api/v1/tasks", wrapper.DMAPIGetTaskList) router.POST(baseURL+"/api/v1/tasks", wrapper.DMAPIStartTask) router.DELETE(baseURL+"/api/v1/tasks/:task-name", wrapper.DMAPIDeleteTask) - router.POST(baseURL+"/api/v1/tasks/:task-name/pause", wrapper.DMAPPauseTask) + router.POST(baseURL+"/api/v1/tasks/:task-name/pause", wrapper.DMAPIPauseTask) router.POST(baseURL+"/api/v1/tasks/:task-name/resume", wrapper.DMAPIResumeTask) - router.GET(baseURL+"/api/v1/tasks/:task-name/sources/:source-name/schemas", wrapper.DMAPIGetTaskSourceSchemaList) - router.GET(baseURL+"/api/v1/tasks/:task-name/sources/:source-name/schemas/:schema-name", wrapper.DMAPIGetTaskSourceTableList) - router.DELETE(baseURL+"/api/v1/tasks/:task-name/sources/:source-name/schemas/:schema-name/:table-name", wrapper.DMAPIDeleteTaskSourceTableStructure) - router.GET(baseURL+"/api/v1/tasks/:task-name/sources/:source-name/schemas/:schema-name/:table-name", wrapper.DMAPIGetTaskSourceTableStructure) - router.PUT(baseURL+"/api/v1/tasks/:task-name/sources/:source-name/schemas/:schema-name/:table-name", wrapper.DMAPIOperateTaskSourceTableStructure) + router.GET(baseURL+"/api/v1/tasks/:task-name/sources/:source-name/schemas", wrapper.DMAPIGetSchemaListByTaskAndSource) + router.GET(baseURL+"/api/v1/tasks/:task-name/sources/:source-name/schemas/:schema-name", wrapper.DMAPIGetTableListByTaskAndSource) + router.DELETE(baseURL+"/api/v1/tasks/:task-name/sources/:source-name/schemas/:schema-name/:table-name", wrapper.DMAPIDeleteTableStructure) + router.GET(baseURL+"/api/v1/tasks/:task-name/sources/:source-name/schemas/:schema-name/:table-name", wrapper.DMAPIGetTableStructure) + router.PUT(baseURL+"/api/v1/tasks/:task-name/sources/:source-name/schemas/:schema-name/:table-name", wrapper.DMAPIOperateTableStructure) router.GET(baseURL+"/api/v1/tasks/:task-name/status", wrapper.DMAPIGetTaskStatus) } // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "BZDM7g/m47IHd5/v/h0AAP//ygaUOLJ9AAA=", + "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", + "JLPLgvm47MH95/t/BwAA//+0gXDln30AAA==", } // 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 38733bb4f9d..83a2eeaebd2 100644 --- a/dm/openapi/gen.types.go +++ b/dm/openapi/gen.types.go @@ -516,14 +516,14 @@ type DMAPIDeleteTaskParams struct { SourceNameList *[]string `json:"source_name_list,omitempty"` } -// DMAPPauseTaskJSONBody defines parameters for DMAPPauseTask. -type DMAPPauseTaskJSONBody SourceNameList +// DMAPIPauseTaskJSONBody defines parameters for DMAPIPauseTask. +type DMAPIPauseTaskJSONBody SourceNameList // DMAPIResumeTaskJSONBody defines parameters for DMAPIResumeTask. type DMAPIResumeTaskJSONBody SourceNameList -// DMAPIOperateTaskSourceTableStructureJSONBody defines parameters for DMAPIOperateTaskSourceTableStructure. -type DMAPIOperateTaskSourceTableStructureJSONBody OperateTaskTableStructureRequest +// DMAPIOperateTableStructureJSONBody defines parameters for DMAPIOperateTableStructure. +type DMAPIOperateTableStructureJSONBody OperateTaskTableStructureRequest // DMAPIGetTaskStatusParams defines parameters for DMAPIGetTaskStatus. type DMAPIGetTaskStatusParams struct { @@ -546,14 +546,14 @@ type DMAPITransferSourceJSONRequestBody DMAPITransferSourceJSONBody // DMAPIStartTaskJSONRequestBody defines body for DMAPIStartTask for application/json ContentType. type DMAPIStartTaskJSONRequestBody DMAPIStartTaskJSONBody -// DMAPPauseTaskJSONRequestBody defines body for DMAPPauseTask for application/json ContentType. -type DMAPPauseTaskJSONRequestBody DMAPPauseTaskJSONBody +// DMAPIPauseTaskJSONRequestBody defines body for DMAPIPauseTask for application/json ContentType. +type DMAPIPauseTaskJSONRequestBody DMAPIPauseTaskJSONBody // DMAPIResumeTaskJSONRequestBody defines body for DMAPIResumeTask for application/json ContentType. type DMAPIResumeTaskJSONRequestBody DMAPIResumeTaskJSONBody -// DMAPIOperateTaskSourceTableStructureJSONRequestBody defines body for DMAPIOperateTaskSourceTableStructure for application/json ContentType. -type DMAPIOperateTaskSourceTableStructureJSONRequestBody DMAPIOperateTaskSourceTableStructureJSONBody +// DMAPIOperateTableStructureJSONRequestBody defines body for DMAPIOperateTableStructure for application/json ContentType. +type DMAPIOperateTableStructureJSONRequestBody DMAPIOperateTableStructureJSONBody // Getter for additional properties for Task_BinlogFilterRule. Returns the specified // element and whether it was found diff --git a/dm/openapi/spec/dm.yaml b/dm/openapi/spec/dm.yaml index d7b5dc06452..10f62dac946 100644 --- a/dm/openapi/spec/dm.yaml +++ b/dm/openapi/spec/dm.yaml @@ -455,7 +455,7 @@ paths: tags: - task summary: "pause task" - operationId: "DMAPPauseTask" + operationId: "DMAPIPauseTask" parameters: - name: task-name in: path @@ -513,7 +513,7 @@ paths: tags: - task summary: "get task source schema list" - operationId: "DMAPIGetTaskSourceSchemaList" + operationId: "DMAPIGetSchemaListByTaskAndSource" parameters: - name: task-name in: path @@ -547,7 +547,7 @@ paths: tags: - task summary: "get task source table list" - operationId: "DMAPIGetTaskSourceTableList" + operationId: "DMAPIGetTableListByTaskAndSource" parameters: - name: task-name in: path @@ -588,7 +588,7 @@ paths: tags: - task summary: "get task source table structure" - operationId: "DMAPIGetTaskSourceTableStructure" + operationId: "DMAPIGetTableStructure" parameters: - name: task-name in: path @@ -635,7 +635,7 @@ paths: tags: - task summary: "operate task source table structure" - operationId: "DMAPIOperateTaskSourceTableStructure" + operationId: "DMAPIOperateTableStructure" parameters: - name: task-name in: path @@ -684,7 +684,7 @@ paths: tags: - task summary: "delete task source table structure" - operationId: "DMAPIDeleteTaskSourceTableStructure" + operationId: "DMAPIDeleteTableStructure" parameters: - name: task-name in: path diff --git a/dm/pkg/schema/tracker.go b/dm/pkg/schema/tracker.go index d1f26e227fe..27dd4f55361 100644 --- a/dm/pkg/schema/tracker.go +++ b/dm/pkg/schema/tracker.go @@ -36,6 +36,7 @@ import ( "github.com/pingcap/ticdc/dm/pkg/conn" tcontext "github.com/pingcap/ticdc/dm/pkg/context" "github.com/pingcap/ticdc/dm/pkg/log" + dmterror "github.com/pingcap/ticdc/dm/pkg/terror" ) const ( @@ -221,6 +222,21 @@ func (tr *Tracker) AllSchemas() []*model.DBInfo { return filteredSchemas } +// ListSchemaTables lists all tables in the schema. +func (tr *Tracker) ListSchemaTables(schema string) ([]string, error) { + allSchemas := tr.AllSchemas() + for _, db := range allSchemas { + if db.Name.String() == schema { + tables := make([]string, len(db.Tables)) + for i, t := range db.Tables { + tables[i] = t.Name.String() + } + return tables, nil + } + } + return nil, dmterror.ErrSchemaTrackerUnSchemaNotExist.Generate(schema) +} + // GetSingleColumnIndices returns indices of input column if input column only has single-column indices // returns nil if input column has no indices, or has multi-column indices. func (tr *Tracker) GetSingleColumnIndices(db, tbl, col string) ([]*model.IndexInfo, error) { diff --git a/dm/pkg/schema/tracker_test.go b/dm/pkg/schema/tracker_test.go index b2b0a591034..b8262e30da8 100644 --- a/dm/pkg/schema/tracker_test.go +++ b/dm/pkg/schema/tracker_test.go @@ -30,6 +30,7 @@ import ( "go.uber.org/zap/zapcore" "github.com/pingcap/ticdc/dm/pkg/conn" + "github.com/pingcap/ticdc/dm/pkg/terror" ) func Test(t *testing.T) { @@ -456,6 +457,15 @@ func (s *trackerSuite) TestAllSchemas(c *C) { err = tracker.Exec(ctx, "testdb1", "create table c(a int)") c.Assert(err, IsNil) + // check schema tables + tables, err := tracker.ListSchemaTables("testdb1") + c.Assert(err, IsNil) + c.Assert(tables, DeepEquals, []string{"b", "c"}) + // check schema not exists + notExistSchemaName := "testdb_not_found" + _, err = tracker.ListSchemaTables(notExistSchemaName) + c.Assert(terror.ErrSchemaTrackerUnSchemaNotExist.Equal(err), IsTrue) + // check that all schemas and tables are present. allSchemas := tracker.AllSchemas() c.Assert(allSchemas, HasLen, 3) diff --git a/dm/pkg/terror/error_list.go b/dm/pkg/terror/error_list.go index 77b0bea9275..74d721499b9 100644 --- a/dm/pkg/terror/error_list.go +++ b/dm/pkg/terror/error_list.go @@ -605,6 +605,9 @@ const ( codeSchemaTrackerRestoreStmtFail codeSchemaTrackerCannotDropTable codeSchemaTrackerInit + codeSchemaTrackerMarshalJSON + codeSchemaTrackerUnMarshalJSON + codeSchemaTrackerUnSchemaNotExist ) // HA scheduler. @@ -1224,6 +1227,9 @@ var ( ErrSchemaTrackerCannotSerialize = New(codeSchemaTrackerCannotSerialize, ClassSchemaTracker, ScopeInternal, LevelHigh, "failed to serialize table info for `%s`.`%s`", "") ErrSchemaTrackerCannotGetTable = New(codeSchemaTrackerCannotGetTable, ClassSchemaTracker, ScopeInternal, LevelHigh, "cannot get table info for %v from schema tracker", "") ErrSchemaTrackerCannotExecDDL = New(codeSchemaTrackerCannotExecDDL, ClassSchemaTracker, ScopeInternal, LevelHigh, "cannot track DDL: %s", "") + ErrSchemaTrackerMarshalJSON = New(codeSchemaTrackerMarshalJSON, ClassSchemaTracker, ScopeDownstream, LevelHigh, "can not marshal struct maybe `%v` is unable to serialize", "") + ErrSchemaTrackerUnMarshalJSON = New(codeSchemaTrackerUnMarshalJSON, ClassSchemaTracker, ScopeDownstream, LevelHigh, "can not unmarshal json maybe `%s` is not proper JSON", "") + ErrSchemaTrackerUnSchemaNotExist = New(codeSchemaTrackerUnSchemaNotExist, ClassSchemaTracker, ScopeDownstream, LevelHigh, "can not find `%s` in tracker", "") ErrSchemaTrackerCannotFetchDownstreamTable = New( codeSchemaTrackerCannotFetchDownstreamTable, ClassSchemaTracker, ScopeDownstream, LevelMedium, diff --git a/dm/syncer/schema.go b/dm/syncer/schema.go index 3db646e5e03..f23b6fa2154 100644 --- a/dm/syncer/schema.go +++ b/dm/syncer/schema.go @@ -15,6 +15,7 @@ package syncer import ( "context" + "encoding/json" "strings" "github.com/pingcap/tidb-tools/pkg/filter" @@ -32,12 +33,33 @@ import ( ) // OperateSchema operates schema for an upstream table. -func (s *Syncer) OperateSchema(ctx context.Context, req *pb.OperateWorkerSchemaRequest) (createTableStr string, err error) { +func (s *Syncer) OperateSchema(ctx context.Context, req *pb.OperateWorkerSchemaRequest) (msg string, err error) { sourceTable := &filter.Table{ Schema: req.Database, Name: req.Table, } switch req.Op { + case pb.SchemaOp_ListSchema: + allSchema := s.schemaTracker.AllSchemas() + schemaList := make([]string, len(allSchema)) + for i, schema := range allSchema { + schemaList[i] = schema.Name.String() + } + schemaListJSON, err := json.Marshal(schemaList) + if err != nil { + return "", terror.ErrSchemaTrackerMarshalJSON.Delegate(err, schemaList) + } + return string(schemaListJSON), err + case pb.SchemaOp_ListTable: + tables, err := s.schemaTracker.ListSchemaTables(req.Database) + if err != nil { + return "", err + } + tableListJSON, err := json.Marshal(tables) + if err != nil { + return "", terror.ErrSchemaTrackerMarshalJSON.Delegate(err, tables) + } + return string(tableListJSON), err case pb.SchemaOp_GetSchema: // we only try to get schema from schema-tracker now. // in other words, we can not get the schema if any DDL/DML has been replicated, or set a schema previously. diff --git a/dm/tests/openapi/client/openapi_task_check b/dm/tests/openapi/client/openapi_task_check index 2cb936e3b5f..64d58618311 100755 --- a/dm/tests/openapi/client/openapi_task_check +++ b/dm/tests/openapi/client/openapi_task_check @@ -4,6 +4,7 @@ import requests NO_SHARD_TASK_NAME = "test-no-shard" SHARD_TASK_NAME = "test-shard" +ILLEGAL_CHAR_TASK_NAME='t-Ë!s`t' SOURCE1_NAME = "mysql-01" SOURCE2_NAME = "mysql-02" @@ -176,6 +177,76 @@ def get_task_list(task_count): assert data["total"] == int(task_count) +def pause_task_success(task_name, source_name): + url = API_ENDPOINT + "/" + task_name + "/pause" + resp = requests.post( + url=url, + json=[ + source_name, + ], + ) + assert resp.status_code == 200 + + +def resume_task_success(task_name, source_name): + url = API_ENDPOINT + "/" + task_name + "/resume" + resp = requests.post( + url=url, + json=[ + source_name, + ], + ) + assert resp.status_code == 200 + + +def operate_schema_and_table_success(task_name, source_name, schema_name, table_name): + schema_url = API_ENDPOINT + "/" + task_name + "/sources/" + source_name + "/schemas" + schema_resp = requests.get(url=schema_url) + assert schema_resp.status_code == 200 + print("get_task_schema_success schema resp=", schema_resp.json()) + assert len(schema_resp.json()) > 0 + + schema_list = schema_resp.json() + assert schema_name in schema_list + table_url = schema_url + "/" + schema_name + table_resp = requests.get(url=table_url) + assert table_resp.status_code == 200 + print("get_task_schema_success table resp=", table_resp.json()) + table_list = table_resp.json() + assert table_name in table_list + + single_table_url = table_url + "/" + table_name + create_table_resp = requests.get(url=single_table_url) + assert create_table_resp.status_code == 200 + create_table = create_table_resp.json() + print("get_task_schema_success create table resp=", create_table) + assert create_table["table_name"] == table_name + assert create_table["schema_name"] == schema_name + assert table_name in create_table["schema_create_sql"] + + # delete table + resp = requests.delete(url=single_table_url) + assert resp.status_code == 204 + + # after delete, no table in schema + resp = requests.get(url=table_url) + assert resp.status_code == 200 + print("get_task_schema_success table resp=", resp.json()) + assert len(resp.json()) == 0 + + # add table back again + set_table_data = { + "sql_content": "CREATE TABLE openapi.t1(i TINYINT, j INT UNIQUE KEY);", + "flush": True, + "sync": True, + } + resp = requests.put(url=single_table_url, json=set_table_data) + assert resp.status_code == 200 + table_list = requests.get(url=table_url).json() + print("get_task_schema_success table resp=", table_list) + assert len(table_list) == 1 + + def stop_task_failed(task_name): resp = requests.delete(url=API_ENDPOINT + "/" + task_name) print("stop_task_failed resp=", resp.json()) @@ -194,10 +265,13 @@ if __name__ == "__main__": "start_noshard_task_success": start_noshard_task_success, "start_shard_task_success": start_shard_task_success, "stop_task_failed": stop_task_failed, + "pause_task_success": pause_task_success, + "resume_task_success": resume_task_success, "stop_task_success": stop_task_success, "get_task_list": get_task_list, "get_task_status_failed": get_task_status_failed, "get_task_status_success": get_task_status_success, + "operate_schema_and_table_success": operate_schema_and_table_success, } func = FUNC_MAP[sys.argv[1]] diff --git a/dm/tests/openapi/run.sh b/dm/tests/openapi/run.sh index 76ec027b5ed..3eaa6473557 100644 --- a/dm/tests/openapi/run.sh +++ b/dm/tests/openapi/run.sh @@ -189,7 +189,7 @@ function test_shard_task() { run_sql_source1 "DELETE FROM openapi.t;" run_sql_tidb_with_retry "select count(1) from openapi.t;" "count(1): 2" - # test binlog event filter, this ddl will ignored in source-2 + # test binlog event filter, this ddl will be ignored in source-2 run_sql "alter table openapi.t add column aaa int;" $MYSQL_PORT2 $MYSQL_PASSWORD2 # ddl will be ignored, so no ddl locks and the task will work normally. run_sql "INSERT INTO openapi.t(i,j) VALUES (5, 5);" $MYSQL_PORT1 $MYSQL_PASSWORD1 @@ -231,15 +231,17 @@ function test_noshard_task() { # create source succesfully 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" + openapi_source_check "get_source_status_success" "mysql-01" # create source succesfully 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" + openapi_source_check "get_source_status_success" "mysql-02" # start task success: not vaild task create request openapi_task_check "start_task_failed" @@ -269,6 +271,15 @@ function test_noshard_task() { # get task list openapi_task_check "get_task_list" 1 + # pause task first for operate schema + openapi_task_check "pause_task_success" "$task_name" "mysql-02" + + # opreate schema + openapi_task_check "operate_schema_and_table_success" "$task_name" "mysql-02" "openapi" "t2" + + # resume task + openapi_task_check "resume_task_success" "$task_name" "mysql-02" + # stop task success openapi_task_check "stop_task_success" "$task_name" @@ -319,7 +330,6 @@ function run() { test_shard_task test_noshard_task - test_cluster } diff --git a/go.mod b/go.mod index 191fdf980f7..11577d097d0 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,6 @@ require ( github.com/go-sql-driver/mysql v1.6.0 github.com/gogo/gateway v1.1.0 github.com/gogo/protobuf v1.3.2 - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 github.com/google/btree v1.0.0 @@ -40,10 +39,11 @@ require ( github.com/jarcoal/httpmock v1.0.5 github.com/jmoiron/sqlx v1.3.3 github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d - github.com/labstack/echo/v4 v4.2.1 + github.com/labstack/echo/v4 v4.6.1 github.com/lib/pq v1.3.0 // indirect github.com/linkedin/goavro/v2 v2.9.8 github.com/mackerelio/go-osstat v0.1.0 + github.com/mattn/go-colorable v0.1.11 // indirect github.com/mattn/go-shellwords v1.0.3 github.com/mattn/go-sqlite3 v2.0.2+incompatible // indirect github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 @@ -83,9 +83,10 @@ require ( go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 - golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect + golang.org/x/net v0.0.0-20211020060615-d418f374d309 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 + golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 golang.org/x/text v0.3.7 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda diff --git a/go.sum b/go.sum index 48e7aafeb33..9b3d0f125d8 100644 --- a/go.sum +++ b/go.sum @@ -605,8 +605,9 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/echo/v4 v4.2.1 h1:LF5Iq7t/jrtUuSutNuiEWtB5eiHfZ5gSe2pcu5exjQw= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/echo/v4 v4.6.1 h1:OMVsrnNFzYlGSdaiYGHbgWQnr+JM7NG+B9suCPie14M= +github.com/labstack/echo/v4 v4.6.1/go.mod h1:RnjgMWNDB9g/HucVWhQYNQP9PvbYf6adqftqryo7s9k= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= @@ -630,15 +631,17 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -1076,8 +1079,10 @@ golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1173,8 +1178,10 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 h1:a8jGStKg0XqKDlKqjLrXn0ioF5MH36pT7Z0BRTqLhbk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211020060615-d418f374d309 h1:A0lJIi+hcTR6aajJH4YqKWwohY4aW9RO7oRMcdv+HKI= +golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1272,10 +1279,14 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 h1:siQdpVirKtzPhKl3lZWozZraCFObP8S1v6PRp0bLrtU= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=