diff --git a/dbm-services/mysql/db-simulation/app/service/simulation_task.go b/dbm-services/mysql/db-simulation/app/service/simulation_task.go index fc71c249f8..4b67c03325 100644 --- a/dbm-services/mysql/db-simulation/app/service/simulation_task.go +++ b/dbm-services/mysql/db-simulation/app/service/simulation_task.go @@ -25,6 +25,7 @@ import ( "github.com/bsm/redislock" "github.com/redis/go-redis/v9" "github.com/samber/lo" + "gorm.io/gorm" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" util "dbm-services/common/go-pubpkg/cmutil" @@ -200,16 +201,29 @@ func reloadRunningTaskFromdb() { var tks []model.TbSimulationTask if err := model.DB.Model(model.TbSimulationTask{}).Where( //nolint - "phase not in (?) and create_time > DATE_SUB(NOW(),INTERVAL 6 HOUR) and time_to_sec(timediff(heartbeat_time,now())) > ? ", + "phase not in (?) and create_time > DATE_SUB(NOW(),INTERVAL 2 HOUR) and time_to_sec(timediff(now(),heartbeat_time)) > ? ", []string{model.PhaseDone, model.PhaseReloading}, HeartbeatInterval).Scan(&tks).Error; err != nil { logger.Error("get running task failed %s", err.Error()) return } - if len(tks) == 0 { + var reRunTask []model.TbSimulationTask + // 可能已经重试成功了,但是version ID 已经变了 + for _, tk := range tks { + var cks model.TbSimulationTask + if err := model.DB.Model(model.TbSimulationTask{}).Where("bill_task_id = ? and phase = ? and status = ?", + tk.BillTaskId, model.PhaseDone, model.TaskSuccess).First(&cks).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + reRunTask = append(reRunTask, tk) + continue + } + } + logger.Info("task %s already run success", tk.TaskId) + } + if len(reRunTask) == 0 { logger.Info("no need reload running task") return } - for _, tk := range tks { + for _, tk := range reRunTask { var err error var req model.TbRequestRecord var p ReloadParam diff --git a/dbm-services/mysql/db-simulation/app/syntax/parse_relation_db.go b/dbm-services/mysql/db-simulation/app/syntax/parse_relation_db.go index f23778d62b..ba6bca5228 100644 --- a/dbm-services/mysql/db-simulation/app/syntax/parse_relation_db.go +++ b/dbm-services/mysql/db-simulation/app/syntax/parse_relation_db.go @@ -25,6 +25,9 @@ import ( "dbm-services/common/go-pubpkg/logger" ) +// AnalyzeConcurrency 解析并发度 +const AnalyzeConcurrency = 10 + // DoParseRelationDbs parse relation db from sql file func (tf *TmysqlParseFile) DoParseRelationDbs(version string) (createDbs, relationDbs []string, dumpAll bool, err error) { @@ -45,14 +48,12 @@ func (tf *TmysqlParseFile) DoParseRelationDbs(version string) (createDbs, relati } // 最后删除临时目录,不会返回错误 defer tf.delTempDir() - - errChan := make(chan error, 1) + logger.Info("all sqlfiles download ok ~") alreadExecutedSqlfileChan := make(chan string, len(tf.Param.FileNames)) go func() { if err = tf.Execute(alreadExecutedSqlfileChan, version); err != nil { logger.Error("failed to execute tmysqlparse: %s", err.Error()) - errChan <- err } close(alreadExecutedSqlfileChan) }() @@ -78,10 +79,11 @@ func (tf *TmysqlParseFile) DoParseRelationDbs(version string) (createDbs, relati func (t *TmysqlParse) doParseInchan(alreadExecutedSqlfileCh chan string, mysqlVersion string) (createDbs []string, relationDbs []string, dumpAll bool, err error) { var errs []error - c := make(chan struct{}, 10) - errChan := make(chan error, 5) + c := make(chan struct{}, AnalyzeConcurrency) + errChan := make(chan error) wg := &sync.WaitGroup{} - stopChan := make(chan struct{}) + // stopchan len 必须要和 AnalyzeConcurrency 保持一致 + stopChan := make(chan struct{}, AnalyzeConcurrency) for sqlfile := range alreadExecutedSqlfileCh { wg.Add(1) @@ -93,8 +95,11 @@ func (t *TmysqlParse) doParseInchan(alreadExecutedSqlfileCh chan string, if err != nil { errChan <- err } + // 如果有dumpall 则直接返回退出,不在继续分析 if dumpAllDbs { dumpAll = true + <-c + wg.Done() stopChan <- struct{}{} } t.mu.Lock() @@ -132,7 +137,6 @@ func (t *TmysqlParse) analyzeRelationDbs(inputfileName, mysqlVersion string) ( logger.Error("panic error:%v,stack:%s", r, string(debug.Stack())) } }() - t.result[inputfileName] = &CheckInfo{} f, err := os.Open(t.getAbsoutputfilePath(inputfileName, mysqlVersion)) if err != nil { logger.Error("open file failed %s", err.Error()) diff --git a/dbm-services/mysql/db-simulation/app/syntax/syntax.go b/dbm-services/mysql/db-simulation/app/syntax/syntax.go index f0ad05fb22..5680349ecc 100644 --- a/dbm-services/mysql/db-simulation/app/syntax/syntax.go +++ b/dbm-services/mysql/db-simulation/app/syntax/syntax.go @@ -112,11 +112,11 @@ const DdlMapFileSubffix = ".tbl.map" // Do 运行语法检查 For SQL 文件 func (tf *TmysqlParseFile) Do(dbtype string, versions []string) (result map[string]*CheckInfo, err error) { - logger.Info("doing....") + tf.mu = sync.Mutex{} + tf.mu.Lock() tf.result = make(map[string]*CheckInfo) tf.tmpWorkdir = tf.BaseWorkdir - tf.mu = sync.Mutex{} - + tf.mu.Unlock() if !tf.IsLocalFile { if err = tf.Init(); err != nil { logger.Error("Do init failed %s", err.Error()) @@ -142,7 +142,7 @@ func (tf *TmysqlParseFile) Do(dbtype string, versions []string) (result map[stri } func (tf *TmysqlParseFile) doSingleVersion(dbtype string, mysqlVersion string) (err error) { - errChan := make(chan error, 1) + errChan := make(chan error, len(tf.Param.FileNames)) alreadExecutedSqlfileChan := make(chan string, len(tf.Param.FileNames)) signalChan := make(chan struct{}) diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/semantic_dump_schema.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/semantic_dump_schema.go index 2e2f01b886..93c8c17a3d 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/semantic_dump_schema.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/semantic_dump_schema.go @@ -206,10 +206,6 @@ func (c *SemanticDumpSchemaComp) getDumpdbs(alldbs []string, version string) (re finaldbs = append(finaldbs, db) } } else { - if len(lo.Intersect(alldbs, c.Params.ParseCreateDbs)) > 0 { - err = fmt.Errorf("create dbs %v,已经存在目标实例中", c.Params.ParseCreateDbs) - return nil, err - } for _, f := range c.Params.ExecuteObjects { var realexcutedbs []string // 获得目标库 因为是通配符 所以需要获取完整名称 @@ -226,7 +222,9 @@ func (c *SemanticDumpSchemaComp) getDumpdbs(alldbs []string, version string) (re realexcutedbs = util.FilterOutStringSlice(intentionDbs, ignoreDbs) finaldbs = append(finaldbs, realexcutedbs...) } + createSQLExistDbs := lo.Intersect(alldbs, c.Params.ParseCreateDbs) finaldbs = append(finaldbs, c.Params.ParseNeedDumpDbs...) + finaldbs = append(finaldbs, createSQLExistDbs...) } logger.Info("dump dbs:%v", finaldbs) return finaldbs, nil diff --git a/dbm-ui/backend/env/__init__.py b/dbm-ui/backend/env/__init__.py index d15d3ac9f4..fd29c7e1ae 100644 --- a/dbm-ui/backend/env/__init__.py +++ b/dbm-ui/backend/env/__init__.py @@ -121,7 +121,7 @@ # 标准运维项目 ID BK_SOPS_PROJECT_ID = get_type_env(key="BK_SOPS_PROJECT_ID", _type=int, default=1) # 标准运维更新window机器的模板ID -UPDATE_WINDOW_GSE_CONFIG = get_type_env(key="UPDATE_WINDOW_GSE_CONFIG", _type=int, default=1) +UPDATE_WINDOW_GSE_CONFIG = get_type_env(key="UPDATE_WINDOW_GSE_CONFIG", _type=int) # Bamboo ENABLE_CLEAN_EXPIRED_BAMBOO_TASK = get_type_env(key="ENABLE_CLEAN_EXPIRED_BAMBOO_TASK", _type=bool, default=False) diff --git a/dbm-ui/frontend/src/components/db-table/OriginalTable.vue b/dbm-ui/frontend/src/components/db-table/OriginalTable.vue index 704c186ef9..be625661bf 100644 --- a/dbm-ui/frontend/src/components/db-table/OriginalTable.vue +++ b/dbm-ui/frontend/src/components/db-table/OriginalTable.vue @@ -40,12 +40,13 @@ (e: 'clearSearch'): void; } interface Props { - columns: InstanceType['$props']['columns']; + columns?: InstanceType['$props']['columns']; isAnomalies?: boolean; isSearching?: boolean; } const props = withDefaults(defineProps(), { + columns: undefined, isAnomalies: false, isSearching: false, }); diff --git a/dbm-ui/frontend/src/router/index.ts b/dbm-ui/frontend/src/router/index.ts index 663b643787..5cde5912cc 100644 --- a/dbm-ui/frontend/src/router/index.ts +++ b/dbm-ui/frontend/src/router/index.ts @@ -36,10 +36,6 @@ import getTicketRoutes from '@views/ticket-center/routes'; import getTicketCooperationSettingRoutes from '@views/ticket-cooperation-setting/routes'; import getTicketFlowSettingBizRoutes from '@views/ticket-flow-setting-biz/routes'; import getTicketFlowSettingGlobalRoutes from '@views/ticket-flow-setting-global/routes'; -// import getTicketManageRoutes from '@views/ticket-manage/routes'; -// import getTicketSelfApplyRoutes from '@views/ticket-self-apply/routes'; -// import getTicketSelfManageRoutes from '@views/ticket-self-manage/routes'; -// import getTicketSelfTodoRoutes from '@views/ticket-self-todo/routes'; import getVersionFilesRoutes from '@views/version-files/routes'; import getWhitelistRoutes from '@views/whitelist/routes'; diff --git a/dbm-ui/frontend/src/services/source/package.ts b/dbm-ui/frontend/src/services/source/package.ts index f430a99bdd..423cd4dc31 100644 --- a/dbm-ui/frontend/src/services/source/package.ts +++ b/dbm-ui/frontend/src/services/source/package.ts @@ -75,13 +75,13 @@ export function updatePackage(params: { id: number; priority?: number; enable?: boolean; - name: string; - version: string; - pkg_type: string; - db_type: string; - path: string; - size: number; - md5: string; + name?: string; + version?: string; + pkg_type?: string; + db_type?: string; + path?: string; + size?: number; + md5?: string; allow_biz_ids?: number[]; mode?: string; }) { diff --git a/dbm-ui/frontend/src/views/db-configure/components/ParameterTable.vue b/dbm-ui/frontend/src/views/db-configure/components/ParameterTable.vue index 5ce00def04..35baa16ece 100644 --- a/dbm-ui/frontend/src/views/db-configure/components/ParameterTable.vue +++ b/dbm-ui/frontend/src/views/db-configure/components/ParameterTable.vue @@ -28,8 +28,6 @@ - diff --git a/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/riak/common/ScaleIn&ScaleOut.vue b/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/riak/common/ScaleIn&ScaleOut.vue index 1c5811db19..d430729723 100644 --- a/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/riak/common/ScaleIn&ScaleOut.vue +++ b/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/riak/common/ScaleIn&ScaleOut.vue @@ -12,47 +12,37 @@ --> @@ -63,6 +53,8 @@ import TicketModel, { type Riak } from '@services/model/ticket/ticket'; import { getResourceSpecList } from '@services/source/dbresourceSpec'; + import InfoList, { Item as InfoItem } from '../../components/info-list/Index.vue'; + interface Props { ticketDetails: TicketModel } @@ -101,7 +93,7 @@ const ipList = computed(() => props.ticketDetails.details?.nodes?.riak || []); - const { loading } = useRequest(getResourceSpecList, { + const { loading: isLoading } = useRequest(getResourceSpecList, { defaultParams: [{ spec_cluster_type: 'riak', offset: 0, diff --git a/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/sqlserver/HaApply.vue b/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/sqlserver/HaApply.vue index 6cca6ba7c1..8f2ce9c761 100644 --- a/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/sqlserver/HaApply.vue +++ b/dbm-ui/frontend/src/views/ticket-center/common/ticket-detail/components/task-info/com-factory/sqlserver/HaApply.vue @@ -61,7 +61,9 @@ - + - + - + -