You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by ca...@apache.org on 2021/12/30 10:20:25 UTC
[dolphinscheduler] branch dev updated: [Improvement-6151] Performance optimization of DEPENDENT task (#7725)
This is an automated email from the ASF dual-hosted git repository.
caishunfeng pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 52a7439 [Improvement-6151] Performance optimization of DEPENDENT task (#7725)
52a7439 is described below
commit 52a74396ddecaed4e1dd6bba379cb5aae2185c64
Author: wangyizhi <wa...@cmss.chinamobile.com>
AuthorDate: Thu Dec 30 18:20:20 2021 +0800
[Improvement-6151] Performance optimization of DEPENDENT task (#7725)
* Performance optimization of DEPENDENT task
* fix eslint
---
.../formModel/tasks/_source/dependItemList.vue | 36 ++++++++++++++-----
.../dag/_source/formModel/tasks/dependent.vue | 42 ++++++++++++++++++++--
2 files changed, 66 insertions(+), 12 deletions(-)
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue
index 883b13a..643bac8 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue
@@ -76,7 +76,8 @@
props: {
dependItemList: Array,
index: Number,
- dependTaskList: Array
+ dependTaskList: Array,
+ projectDefinitionsCache: Object
},
model: {
prop: 'dependItemList',
@@ -136,6 +137,9 @@
})
},
_getProcessByProjectCode (code) {
+ if (this.projectDefinitionsCache[code]) {
+ return Promise.resolve(this.projectDefinitionsCache[code])
+ }
return new Promise((resolve, reject) => {
this.store.dispatch('dag/getProcessByProjectCode', code).then(res => {
let definitionList = _.map(_.cloneDeep(res), v => {
@@ -144,6 +148,10 @@
label: v.processDefinition.name
}
})
+ this.$emit('addProjectDefinitionsCache', {
+ projectCode: code,
+ definitionList
+ })
resolve(definitionList)
})
})
@@ -281,16 +289,26 @@
}
})
} else {
- // get definitionCode codes
- let codes = _.map(this.dependItemList, v => v.definitionCode).join(',')
- // get item list
- this._getDependItemList(codes, false).then(res => {
- _.map(this.dependItemList, (v, i) => {
- this._getProcessByProjectCode(v.projectCode).then(definitionList => {
- this.$set(this.dependItemList, i, this._rtOldParams(v.definitionCode, definitionList, [_.cloneDeep(DEP_ALL_TASK)].concat(_.map(res[v.definitionCode] || [], v => ({ code: v.code, name: v.name }))), v))
+ // Get uniq definitionCodes and projectCodes
+ const definitionCodes = _.uniq(this.dependItemList.map(dep => dep.definitionCode)).join(',')
+
+ // Query all tasks by definitionCodes, definitionCodes can cross projects
+ this._getDependItemList(definitionCodes, false)
+ .then(definitionTasks => {
+ _.map(this.dependItemList, (dep, i) => {
+ const definitionList = this.projectDefinitionsCache[dep.projectCode]
+ const depTasksList = (definitionTasks[dep.definitionCode] || [])
+ .map(task => ({ code: task.code, name: task.name }))
+ .concat(_.cloneDeep(DEP_ALL_TASK))
+
+ this.$set(this.dependItemList, i, this._rtOldParams(
+ dep.definitionCode,
+ definitionList,
+ depTasksList,
+ dep
+ ))
})
})
- })
}
})
},
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue
index b0b46e7..5f03ba6 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue
@@ -27,7 +27,7 @@
<em v-if="isLoading" class="el-icon-loading as as-spin" data-toggle="tooltip" :title="$t('Add')"></em>
</a>
</div>
- <div class="dep-box">
+ <div class="dep-box" v-if="cacheReady">
<span
class="dep-relation"
@click="!isDetails && _setGlobalRelation()"
@@ -49,9 +49,11 @@
</em>
<m-depend-item-list
:dependTaskList='dependTaskList'
+ :projectDefinitionsCache='projectDefinitionsCache'
v-model="el.dependItemList"
@on-delete-all="_onDeleteAll"
@getDependTaskList="getDependTaskList"
+ @addProjectDefinitionsCache="addProjectDefinitionsCache"
:index="$index">
</m-depend-item-list>
</div>
@@ -65,7 +67,7 @@
import mListBox from './_source/listBox'
import mDependItemList from './_source/dependItemList'
import disabledState from '@/module/mixin/disabledState'
- import { mapState } from 'vuex'
+ import { mapState, mapActions } from 'vuex'
export default {
name: 'dependent',
@@ -73,7 +75,10 @@
return {
relation: 'AND',
dependTaskList: [],
- isLoading: false
+ isLoading: false,
+ // Reduce repeated requests
+ projectDefinitionsCache: {},
+ cacheReady: false
}
},
mixins: [disabledState],
@@ -81,6 +86,7 @@
backfillItem: Object
},
methods: {
+ ...mapActions('dag', ['getProcessByProjectCode']),
_addDep () {
if (!this.isLoading) {
this.isLoading = true
@@ -125,6 +131,25 @@
})
})
return true
+ },
+ _getProcessByProjectCode (code) {
+ return new Promise((resolve, reject) => {
+ this.getProcessByProjectCode(code).then(res => {
+ let definitionList = _.map(_.cloneDeep(res), v => {
+ return {
+ value: v.processDefinition.code,
+ label: v.processDefinition.name
+ }
+ })
+ resolve({
+ definitionList,
+ projectCode: code
+ })
+ })
+ })
+ },
+ addProjectDefinitionsCache ({ projectCode, definitionList }) {
+ this.projectDefinitionsCache[projectCode] = definitionList
}
},
watch: {
@@ -151,6 +176,17 @@
_.map(this.dependTaskList, v => _.map(v.dependItemList, v1 => {
v1.state = dependentResult[`${v1.definitionCode}-${v1.depTaskCode}-${v1.cycle}-${v1.dateValue}`] || defaultState
}))
+ // cache project definitions
+ const projectCodes = _.uniq(_.flatten(this.dependTaskList.map(dep => dep.dependItemList.map(item => item.projectCode))))
+ Promise.all(projectCodes.map(projectCode => this._getProcessByProjectCode(projectCode))).then((arr) => {
+ arr.forEach((item) => {
+ const { projectCode, definitionList } = item
+ this.projectDefinitionsCache[projectCode] = definitionList
+ })
+ this.cacheReady = true
+ })
+ } else {
+ this.cacheReady = true
}
},
mounted () {