This is an automated email from the ASF dual-hosted git repository.
pingsutw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/submarine.git
The following commit(s) were added to refs/heads/master by this push:
new c495ee8e SUBMARINE-1341. Optimising experiment asynchronous refresh
handling
c495ee8e is described below
commit c495ee8e41d85154057f28e4a3afe8d145b410e6
Author: cdmikechen <[email protected]>
AuthorDate: Fri Oct 7 11:47:00 2022 +0800
SUBMARINE-1341. Optimising experiment asynchronous refresh handling
### What is this PR for?
Experiment's asynchronous refresh will cancel the confirmation tooltip for
the delete button.
### What type of PR is it?
Improvement
### Todos
* [x] - Adjust the asynchronous refresh logic to update only the changed
values
### What is the Jira issue?
https://issues.apache.org/jira/browse/SUBMARINE-1341
### How should this be tested?
No.
### Screenshots (if appropriate)
https://user-images.githubusercontent.com/12069428/194464126-5087b544-d3de-4693-a734-ee27b7c4e70d.mov
### Questions:
* Do the license files need updating? No
* Are there breaking changes for older versions? No
* Does this need new documentation? No
Author: cdmikechen <[email protected]>
Signed-off-by: Kevin <[email protected]>
Closes #1006 from cdmikechen/SUBMARINE-1341 and squashes the following
commits:
c430c7d9 [cdmikechen] Optimising experiment asynchronous refresh handling
---
.../experiment-home/experiment-home.component.ts | 63 ++++++++++++++++------
1 file changed, 47 insertions(+), 16 deletions(-)
diff --git
a/submarine-workbench/workbench-web/src/app/pages/workbench/experiment/experiment-home/experiment-home.component.ts
b/submarine-workbench/workbench-web/src/app/pages/workbench/experiment/experiment-home/experiment-home.component.ts
index 6a8ab7af..44e07557 100644
---
a/submarine-workbench/workbench-web/src/app/pages/workbench/experiment/experiment-home/experiment-home.component.ts
+++
b/submarine-workbench/workbench-web/src/app/pages/workbench/experiment/experiment-home/experiment-home.component.ts
@@ -23,6 +23,7 @@ import { ExperimentFormService } from
'@submarine/services/experiment.form.servi
import { ExperimentService } from '@submarine/services/experiment.service';
import { NzMessageService } from 'ng-zorro-antd';
import { interval } from 'rxjs';
+import { isEqual } from 'lodash';
import { filter, mergeMap, take, tap, timeout, retryWhen } from
'rxjs/operators';
import { ExperimentFormComponent } from
'./experiment-form/experiment-form.component';
@@ -38,7 +39,7 @@ export class ExperimentHomeComponent implements OnInit {
because when we modify the array in child component,
the modification will be sync to parent.
*/
- experimentList: ExperimentInfo[];
+ experimentList: ExperimentInfo[] = [];
isListLoading: boolean = true;
checkedList: boolean[];
selectAllChecked: boolean = false;
@@ -49,7 +50,7 @@ export class ExperimentHomeComponent implements OnInit {
reloadInterval = interval(this.reloadPeriod);
reloadSub = null;
- //mlflow
+ // mlflow
isMlflowLoading: boolean = true;
mlflowUrl: string = '';
@@ -86,21 +87,52 @@ export class ExperimentHomeComponent implements OnInit {
this.experimentService.fetchExperimentList().subscribe(
(list) => {
this.isListLoading = false;
- this.experimentList = list;
+ // Partial refresh required
+ // exists list size
+ const currentListSize = this.experimentList.length;
+ // The backend returns a real-time list
+ const newListSize = list.length;
const currentTime = new Date();
- this.experimentList.forEach((item) => {
- if (item.status === 'Succeeded') {
- const finTime = new Date(item.finishedTime);
- const runTime = new Date(item.runningTime);
- const result = (finTime.getTime() - runTime.getTime()) / 1000;
- item.duration = this.experimentService.durationHandle(result);
- } else if (item.runningTime) {
- const runTime = new Date(item.runningTime);
- const result = (currentTime.getTime() - runTime.getTime()) / 1000;
- item.duration = this.experimentService.durationHandle(result);
+ // for loop experiment list
+ for (let i = 0; i < newListSize; i++) {
+ // The latest experiment info
+ const experiment = list[i]
+ // If a new row is found, insert it directly into
+ if (i > currentListSize - 1) {
+ this.experimentList = [...this.experimentList, experiment]
+ } else {
+ // Otherwise compare relevant information and update
+ const item = this.experimentList[i];
+ // compare
+ const keys = Object.keys(item);
+ for (const key of keys) {
+ if (key !== 'duration' && !isEqual(item[key], experiment[key])) {
+ item[key] = experiment[key]
+ }
+ }
+ // cal duration
+ if (item.status === 'Succeeded') {
+ const finTime = new Date(item.finishedTime);
+ const runTime = new Date(item.runningTime);
+ const result = (finTime.getTime() - runTime.getTime()) / 1000;
+ item.duration = this.experimentService.durationHandle(result);
+ } else if (item.runningTime) {
+ const runTime = new Date(item.runningTime);
+ const result = (currentTime.getTime() - runTime.getTime()) /
1000;
+ item.duration = this.experimentService.durationHandle(result);
+ } else {
+ const acceptedTime = new Date(item.acceptedTime);
+ const result = (currentTime.getTime() - acceptedTime.getTime())
/ 1000;
+ item.duration = this.experimentService.durationHandle(result);
+ }
}
- });
- if(!isAutoReload){
+ }
+ // Delete redundant rows
+ if (currentListSize > newListSize) {
+ this.experimentList = this.experimentList.splice(0, newListSize -
currentListSize);
+ }
+
+ if (!isAutoReload) {
// If it is auto-reloading, we do not want to change the state of
checkbox.
this.checkedList = [];
for (let i = 0; i < this.experimentList.length; i++) {
@@ -199,4 +231,3 @@ export class ExperimentHomeComponent implements OnInit {
);
}
}
-
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]