Skip to content

Commit ea310a5

Browse files
authored
Enable experiment operations when experiment(s) are running in the queue (#3832)
* switch from disable on running to disable on running in workspace * fix use of context values * how about using redux instead of prop drilling * fix workspace method (for telemetry event) * add running context value to prevent actions on experiments running in the queue
1 parent 59ae23d commit ea310a5

File tree

29 files changed

+365
-199
lines changed

29 files changed

+365
-199
lines changed

extension/package.json

Lines changed: 58 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -664,11 +664,11 @@
664664
},
665665
{
666666
"command": "dvc.applyExperiment",
667-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running"
667+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace"
668668
},
669669
{
670670
"command": "dvc.branchExperiment",
671-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running"
671+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace"
672672
},
673673
{
674674
"command": "dvc.checkout",
@@ -708,7 +708,7 @@
708708
},
709709
{
710710
"command": "dvc.experimentGarbageCollect",
711-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running"
711+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace"
712712
},
713713
{
714714
"command": "dvc.findInFolder",
@@ -752,35 +752,35 @@
752752
},
753753
{
754754
"command": "dvc.modifyExperimentParamsAndQueue",
755-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running"
755+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace"
756756
},
757757
{
758758
"command": "dvc.modifyExperimentParamsAndRun",
759-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running && !dvc.experiment.checkpoints"
759+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace && !dvc.experiment.checkpoints"
760760
},
761761
{
762762
"command": "dvc.modifyExperimentParamsAndResume",
763-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running && dvc.experiment.checkpoints"
763+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace && dvc.experiment.checkpoints"
764764
},
765765
{
766766
"command": "dvc.modifyExperimentParamsResetAndRun",
767-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running && dvc.experiment.checkpoints"
767+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace && dvc.experiment.checkpoints"
768768
},
769769
{
770770
"command": "dvc.pushExperiments",
771-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running"
771+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace"
772772
},
773773
{
774774
"command": "dvc.queueExperiment",
775-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running"
775+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace"
776776
},
777777
{
778778
"command": "dvc.removeExperiments",
779-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running"
779+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace"
780780
},
781781
{
782782
"command": "dvc.removeExperimentQueue",
783-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running"
783+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace"
784784
},
785785
{
786786
"command": "dvc.removeExperimentsTableFilters",
@@ -808,15 +808,15 @@
808808
},
809809
{
810810
"command": "dvc.runExperiment",
811-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running && !dvc.experiment.checkpoints"
811+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace && !dvc.experiment.checkpoints"
812812
},
813813
{
814814
"command": "dvc.resumeCheckpointExperiment",
815-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running && dvc.experiment.checkpoints"
815+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace && dvc.experiment.checkpoints"
816816
},
817817
{
818818
"command": "dvc.resetAndRunCheckpointExperiment",
819-
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running && dvc.experiment.checkpoints"
819+
"when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running.workspace && dvc.experiment.checkpoints"
820820
},
821821
{
822822
"command": "dvc.startExperimentsQueue",
@@ -1029,59 +1029,64 @@
10291029
],
10301030
"editor/title": [
10311031
{
1032-
"command": "dvc.runExperiment",
1032+
"command": "dvc.stopAllRunningExperiments",
10331033
"group": "navigation@0",
1034-
"when": "dvc.params.file.active && !dvc.experiment.running && dvc.commands.available && !dvc.experiment.checkpoints"
1034+
"when": "dvc.params.file.active && dvc.experiment.running && dvc.commands.available"
10351035
},
10361036
{
1037-
"command": "dvc.runExperiment",
1037+
"command": "dvc.stopAllRunningExperiments",
10381038
"group": "navigation@0",
1039-
"when": "dvc.experiments.webview.active && !dvc.experiment.running && dvc.commands.available && !dvc.experiment.checkpoints"
1039+
"when": "dvc.experiments.webview.active && dvc.experiment.running && dvc.commands.available"
10401040
},
10411041
{
1042-
"command": "dvc.stopAllRunningExperiments",
1043-
"group": "navigation@0",
1044-
"when": "dvc.experiment.running && dvc.commands.available"
1042+
"command": "dvc.runExperiment",
1043+
"group": "navigation@1",
1044+
"when": "dvc.params.file.active && !dvc.experiment.running.workspace && dvc.commands.available && !dvc.experiment.checkpoints"
10451045
},
10461046
{
1047-
"command": "dvc.resetAndRunCheckpointExperiment",
1047+
"command": "dvc.runExperiment",
10481048
"group": "navigation@1",
1049-
"when": "dvc.experiments.webview.active && !dvc.experiment.running && dvc.commands.available && dvc.experiment.checkpoints"
1049+
"when": "dvc.experiments.webview.active && !dvc.experiment.running.workspace && dvc.commands.available && !dvc.experiment.checkpoints"
10501050
},
10511051
{
10521052
"command": "dvc.resetAndRunCheckpointExperiment",
1053-
"group": "navigation@1",
1054-
"when": "dvc.params.file.active && !dvc.experiment.running && dvc.commands.available && dvc.experiment.checkpoints"
1053+
"group": "navigation@2",
1054+
"when": "dvc.experiments.webview.active && !dvc.experiment.running.workspace && dvc.commands.available && dvc.experiment.checkpoints"
10551055
},
10561056
{
1057-
"command": "dvc.resumeCheckpointExperiment",
1057+
"command": "dvc.resetAndRunCheckpointExperiment",
10581058
"group": "navigation@2",
1059-
"when": "dvc.experiments.webview.active && !dvc.experiment.running && dvc.commands.available && dvc.experiment.checkpoints"
1059+
"when": "dvc.params.file.active && !dvc.experiment.running.workspace && dvc.commands.available && dvc.experiment.checkpoints"
10601060
},
10611061
{
10621062
"command": "dvc.resumeCheckpointExperiment",
1063-
"group": "navigation@2",
1064-
"when": "dvc.params.file.active && !dvc.experiment.running && dvc.commands.available && dvc.experiment.checkpoints"
1063+
"group": "navigation@3",
1064+
"when": "dvc.experiments.webview.active && !dvc.experiment.running.workspace && dvc.commands.available && dvc.experiment.checkpoints"
10651065
},
10661066
{
1067-
"command": "dvc.startExperimentsQueue",
1067+
"command": "dvc.resumeCheckpointExperiment",
10681068
"group": "navigation@3",
1069-
"when": "dvc.experiments.webview.active && !dvc.experiment.running && dvc.commands.available"
1069+
"when": "dvc.params.file.active && !dvc.experiment.running.workspace && dvc.commands.available && dvc.experiment.checkpoints"
10701070
},
10711071
{
10721072
"command": "dvc.startExperimentsQueue",
1073-
"group": "navigation@3",
1074-
"when": "dvc.params.file.active && !dvc.experiment.running && dvc.commands.available"
1073+
"group": "navigation@4",
1074+
"when": "dvc.experiments.webview.active && dvc.commands.available"
10751075
},
10761076
{
1077-
"command": "dvc.queueExperiment",
1077+
"command": "dvc.startExperimentsQueue",
10781078
"group": "navigation@4",
1079-
"when": "dvc.experiments.webview.active && !dvc.experiment.running && dvc.commands.available"
1079+
"when": "dvc.params.file.active && dvc.commands.available"
10801080
},
10811081
{
10821082
"command": "dvc.queueExperiment",
1083-
"group": "navigation@4",
1084-
"when": "dvc.params.file.active && !dvc.experiment.running && dvc.commands.available"
1083+
"group": "navigation@5",
1084+
"when": "dvc.experiments.webview.active && !dvc.experiment.running.workspace && dvc.commands.available"
1085+
},
1086+
{
1087+
"command": "dvc.queueExperiment",
1088+
"group": "navigation@5",
1089+
"when": "dvc.params.file.active && !dvc.experiment.running.workspace && dvc.commands.available"
10851090
}
10861091
],
10871092
"view/item/context": [
@@ -1158,42 +1163,42 @@
11581163
{
11591164
"command": "dvc.views.experiments.applyExperiment",
11601165
"group": "inline@1",
1161-
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem == experiment && !dvc.experiment.running"
1166+
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem == experiment && !dvc.experiment.running.workspace"
11621167
},
11631168
{
11641169
"command": "dvc.views.experiments.branchExperiment",
11651170
"group": "inline@2",
1166-
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem == experiment && !dvc.experiment.running"
1171+
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem == experiment && !dvc.experiment.running.workspace"
11671172
},
11681173
{
11691174
"command": "dvc.views.experimentsTree.removeExperiment",
11701175
"group": "inline@3",
1171-
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem =~ /^(experiment|queued)$/ && !dvc.experiment.running"
1176+
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem =~ /^(experiment|queued)$/ && !dvc.experiment.running.workspace"
11721177
},
11731178
{
11741179
"command": "dvc.views.experimentsTree.pushExperiment",
11751180
"group": "1_share@0",
1176-
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem == experiment && !dvc.experiment.running"
1181+
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem == experiment && !dvc.experiment.running.workspace"
11771182
},
11781183
{
11791184
"command": "dvc.views.experiments.runExperiment",
11801185
"group": "2_modify@1",
1181-
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem =~ /^(workspace|commit|experiment|queued)$/ && !dvc.experiment.running && !dvc.experiment.checkpoints"
1186+
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem =~ /^(workspace|commit|experiment|queued)$/ && !dvc.experiment.running.workspace && !dvc.experiment.checkpoints"
11821187
},
11831188
{
11841189
"command": "dvc.views.experiments.resetAndRunCheckpointExperiment",
11851190
"group": "2_modify@1",
1186-
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem =~ /^(workspace|commit|experiment|queued)$/ && !dvc.experiment.running && dvc.experiment.checkpoints"
1191+
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem =~ /^(workspace|commit|experiment|queued)$/ && !dvc.experiment.running.workspace && dvc.experiment.checkpoints"
11871192
},
11881193
{
11891194
"command": "dvc.views.experiments.resumeCheckpointExperiment",
11901195
"group": "2_modify@2",
1191-
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem =~ /^(workspace|commit|experiment|queued)$/ && !dvc.experiment.running && dvc.experiment.checkpoints"
1196+
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem =~ /^(workspace|commit|experiment|queued)$/ && !dvc.experiment.running.workspace && dvc.experiment.checkpoints"
11921197
},
11931198
{
11941199
"command": "dvc.views.experiments.queueExperiment",
11951200
"group": "2_modify@3",
1196-
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem =~ /^(workspace|commit|experiment|queued)$/ && !dvc.experiment.running"
1201+
"when": "view == dvc.views.experimentsTree && dvc.commands.available && viewItem =~ /^(workspace|commit|experiment|queued)$/ && !dvc.experiment.running.workspace"
11971202
}
11981203
],
11991204
"view/title": [
@@ -1214,17 +1219,17 @@
12141219
},
12151220
{
12161221
"command": "dvc.runExperiment",
1217-
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running && !dvc.experiment.checkpoints",
1222+
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running.workspace && !dvc.experiment.checkpoints",
12181223
"group": "navigation@1"
12191224
},
12201225
{
12211226
"command": "dvc.resetAndRunCheckpointExperiment",
1222-
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running && dvc.experiment.checkpoints",
1227+
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running.workspace && dvc.experiment.checkpoints",
12231228
"group": "navigation@1"
12241229
},
12251230
{
12261231
"command": "dvc.resumeCheckpointExperiment",
1227-
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running && dvc.experiment.checkpoints",
1232+
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running.workspace && dvc.experiment.checkpoints",
12281233
"group": "navigation@2"
12291234
},
12301235
{
@@ -1249,27 +1254,27 @@
12491254
},
12501255
{
12511256
"command": "dvc.modifyExperimentParamsAndRun",
1252-
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running && !dvc.experiment.checkpoints",
1257+
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running.workspace && !dvc.experiment.checkpoints",
12531258
"group": "2_modify@1"
12541259
},
12551260
{
12561261
"command": "dvc.modifyExperimentParamsAndResume",
1257-
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running && dvc.experiment.checkpoints",
1262+
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running.workspace && dvc.experiment.checkpoints",
12581263
"group": "2_modify@1"
12591264
},
12601265
{
12611266
"command": "dvc.modifyExperimentParamsResetAndRun",
1262-
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running && dvc.experiment.checkpoints",
1267+
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running.workspace && dvc.experiment.checkpoints",
12631268
"group": "2_modify@2"
12641269
},
12651270
{
12661271
"command": "dvc.modifyExperimentParamsAndQueue",
1267-
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running",
1272+
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running.workspace",
12681273
"group": "2_modify@3"
12691274
},
12701275
{
12711276
"command": "dvc.queueExperiment",
1272-
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running",
1277+
"when": "view == dvc.views.experimentsTree && !dvc.experiment.running.workspace",
12731278
"group": "3_queue@1"
12741279
},
12751280
{

extension/src/context.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,22 @@ export class Context extends Disposable {
5353
}
5454

5555
private setIsExperimentRunning(repositories: Experiments[] = []) {
56+
const workspaceRunningInRunner = this.dvcRunner.isExperimentRunning()
57+
58+
const getContextValue = (
59+
method: 'hasRunningWorkspaceExperiment' | 'hasRunningExperiment'
60+
): boolean =>
61+
workspaceRunningInRunner ||
62+
repositories.some(experiments => experiments[method]())
63+
64+
void setContextValue(
65+
ContextKey.EXPERIMENT_RUNNING_WORKSPACE,
66+
getContextValue('hasRunningWorkspaceExperiment')
67+
)
68+
5669
void setContextValue(
5770
ContextKey.EXPERIMENT_RUNNING,
58-
this.dvcRunner.isExperimentRunning() ||
59-
repositories.some(experiments => experiments.hasRunningExperiment())
71+
getContextValue('hasRunningExperiment')
6072
)
6173
}
6274
}

extension/src/experiments/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,10 @@ export class Experiments extends BaseRepository<TableData> {
490490
return this.experiments.hasRunningExperiment()
491491
}
492492

493+
public hasRunningWorkspaceExperiment() {
494+
return this.experiments.hasRunningWorkspaceExperiment()
495+
}
496+
493497
public getFirstThreeColumnOrder() {
494498
return this.columns.getFirstThreeColumnOrder()
495499
}
@@ -617,7 +621,7 @@ export class Experiments extends BaseRepository<TableData> {
617621
this.dvcLiveOnlyCleanupInitialized = true
618622
void pollSignalFileForProcess(this.dvcLiveOnlySignalFile, () => {
619623
this.dvcLiveOnlyCleanupInitialized = false
620-
if (this.hasRunningExperiment()) {
624+
if (this.hasRunningWorkspaceExperiment()) {
621625
void this.data.update()
622626
}
623627
})

extension/src/experiments/model/index.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ import { definedAndNonEmpty, reorderListSubset } from '../../util/array'
2323
import {
2424
EXPERIMENT_WORKSPACE_ID,
2525
Executor,
26-
ExpShowOutput
26+
ExpShowOutput,
27+
ExperimentStatus
2728
} from '../../cli/dvc/contract'
2829
import { flattenMapValues } from '../../util/map'
2930
import { ModelWithPersistence } from '../../persistence/model'
@@ -39,10 +40,11 @@ export type SelectedExperimentWithColor = Experiment & {
3940
}
4041

4142
export enum ExperimentType {
42-
WORKSPACE = 'workspace',
4343
COMMIT = 'commit',
4444
EXPERIMENT = 'experiment',
45-
QUEUED = 'queued'
45+
RUNNING = 'running',
46+
QUEUED = 'queued',
47+
WORKSPACE = 'workspace'
4648
}
4749

4850
export class ExperimentsModel extends ModelWithPersistence {
@@ -166,6 +168,10 @@ export class ExperimentsModel extends ModelWithPersistence {
166168
return this.running.length > 0
167169
}
168170

171+
public hasRunningWorkspaceExperiment() {
172+
return this.running.some(({ executor }) => executor === Executor.WORKSPACE)
173+
}
174+
169175
public hasCheckpoints() {
170176
return this.checkpoints
171177
}
@@ -372,9 +378,7 @@ export class ExperimentsModel extends ModelWithPersistence {
372378
return this.getExperimentsByCommit(commit)?.map(experiment => ({
373379
...experiment,
374380
hasChildren: false,
375-
type: isQueued(experiment.status)
376-
? ExperimentType.QUEUED
377-
: ExperimentType.EXPERIMENT
381+
type: this.getExperimentType(experiment.status)
378382
}))
379383
}
380384

@@ -556,6 +560,17 @@ export class ExperimentsModel extends ModelWithPersistence {
556560
}
557561
}
558562

563+
private getExperimentType(status?: ExperimentStatus) {
564+
if (isQueued(status)) {
565+
return ExperimentType.QUEUED
566+
}
567+
if (isRunning(status)) {
568+
return ExperimentType.RUNNING
569+
}
570+
571+
return ExperimentType.EXPERIMENT
572+
}
573+
559574
private getDisplayColor(id: string) {
560575
const color = this.coloredStatus[id]
561576
if (!color) {

0 commit comments

Comments
 (0)