@@ -870,7 +870,7 @@ func newWorkflowsDag(wf *wfv1.Workflow) ([]*dagNode, error) {
870
870
parentNode = nodes [parentWfNode .ID ]
871
871
}
872
872
873
- children := []* dagNode {}
873
+ children := make ( []* dagNode , 0 )
874
874
875
875
for _ , childID := range wfNode .Children {
876
876
childNode , ok := nodes [childID ]
@@ -883,7 +883,7 @@ func newWorkflowsDag(wf *wfv1.Workflow) ([]*dagNode, error) {
883
883
nodes [wfNode .ID ].children = children
884
884
}
885
885
886
- values := []* dagNode {}
886
+ values := make ( []* dagNode , 0 )
887
887
for _ , v := range nodes {
888
888
values = append (values , v )
889
889
}
@@ -905,13 +905,17 @@ func singularPath(nodes []*dagNode, toNode string) ([]*dagNode, error) {
905
905
}
906
906
}
907
907
908
+ if root == nil {
909
+ return nil , fmt .Errorf ("was unable to find root" )
910
+ }
911
+
908
912
if leaf == nil {
909
913
return nil , fmt .Errorf ("was unable to find %s" , toNode )
910
914
}
911
915
912
916
curr := leaf
913
917
914
- reverseNodes := []* dagNode {}
918
+ reverseNodes := make ( []* dagNode , 0 )
915
919
for {
916
920
reverseNodes = append (reverseNodes , curr )
917
921
if curr .n .ID == root .n .ID {
@@ -949,37 +953,32 @@ func getChildren(n *dagNode) map[string]bool {
949
953
950
954
type resetFn func (string )
951
955
type deleteFn func (string )
956
+ type matchFn func (* dagNode ) bool
952
957
953
- // untilFn is a function that returns two variables, the first indicates
954
- // a `found` boolean while the second indicates if reset should be called.
955
- type untilFn func (* dagNode ) (bool , bool )
956
-
957
- func getUntilFnNodeType (nodeType wfv1.NodeType ) untilFn {
958
- return func (n * dagNode ) (bool , bool ) {
959
- return n .n .Type == nodeType , true
958
+ func matchNodeType (nodeType wfv1.NodeType ) matchFn {
959
+ return func (n * dagNode ) bool {
960
+ return n .n .Type == nodeType
960
961
}
961
962
}
962
963
963
- func resetUntil (n * dagNode , should untilFn , resetFunc resetFn ) (* dagNode , error ) {
964
+ func resetUntil (n * dagNode , matchFunc matchFn , resetFunc resetFn ) (* dagNode , error ) {
964
965
curr := n
965
966
for {
966
967
if curr == nil {
967
968
return nil , fmt .Errorf ("was seeking node but ran out of nodes to explore" )
968
969
}
969
970
970
- if foundNode , shouldReset := should (curr ); foundNode {
971
- if shouldReset {
972
- resetFunc (curr .n .ID )
973
- }
971
+ if match := matchFunc (curr ); match {
972
+ resetFunc (curr .n .ID )
974
973
return curr , nil
975
974
}
976
975
curr = curr .parent
977
976
}
978
977
}
979
978
980
- func getTillBoundaryFn (boundaryID string ) untilFn {
981
- return func (n * dagNode ) ( bool , bool ) {
982
- return n .n .ID == boundaryID , n . n . BoundaryID != ""
979
+ func matchBoundaryID (boundaryID string ) matchFn {
980
+ return func (n * dagNode ) bool {
981
+ return n .n .ID == boundaryID
983
982
}
984
983
}
985
984
@@ -989,6 +988,10 @@ func resetBoundaries(n *dagNode, resetFunc resetFn) (*dagNode, error) {
989
988
if curr == nil {
990
989
return curr , nil
991
990
}
991
+ if curr .parent != nil && curr .parent .n .Type == wfv1 .NodeTypeRetry {
992
+ resetFunc (curr .parent .n .ID )
993
+ curr = curr .parent
994
+ }
992
995
if curr .parent != nil && curr .parent .n .Type == wfv1 .NodeTypeStepGroup {
993
996
resetFunc (curr .parent .n .ID )
994
997
}
@@ -997,41 +1000,17 @@ func resetBoundaries(n *dagNode, resetFunc resetFn) (*dagNode, error) {
997
1000
return curr .parent , nil
998
1001
}
999
1002
var err error
1000
- curr , err = resetUntil (curr , getTillBoundaryFn (seekingBoundaryID ), resetFunc )
1003
+ curr , err = resetUntil (curr , matchBoundaryID (seekingBoundaryID ), resetFunc )
1001
1004
if err != nil {
1002
1005
return nil , err
1003
1006
}
1004
1007
}
1005
1008
}
1006
1009
1007
- func resetStepGroup (n * dagNode , resetFunc resetFn ) (* dagNode , error ) {
1008
- return resetUntil (n , getUntilFnNodeType (wfv1 .NodeTypeStepGroup ), resetFunc )
1009
- }
1010
-
1011
- func resetSteps (n * dagNode , resetFunc resetFn ) (* dagNode , error ) {
1012
- n , err := resetUntil (n , getUntilFnNodeType (wfv1 .NodeTypeSteps ), resetFunc )
1013
- if err != nil {
1014
- return nil , err
1015
- }
1016
- return resetBoundaries (n , resetFunc )
1017
- }
1018
-
1019
- func resetTaskGroup (n * dagNode , resetFunc resetFn ) (* dagNode , error ) {
1020
- return resetUntil (n , getUntilFnNodeType (wfv1 .NodeTypeTaskGroup ), resetFunc )
1021
- }
1022
-
1023
- func resetDAG (n * dagNode , resetFunc resetFn ) (* dagNode , error ) {
1024
- n , err := resetUntil (n , getUntilFnNodeType (wfv1 .NodeTypeDAG ), resetFunc )
1025
- if err != nil {
1026
- return nil , err
1027
- }
1028
- return resetBoundaries (n , resetFunc )
1029
- }
1030
-
1031
1010
// resetPod is only called in the event a Container was found. This implies that there is a parent pod.
1032
1011
func resetPod (n * dagNode , resetFunc resetFn , addToDelete deleteFn ) (* dagNode , error ) {
1033
1012
// this sets to reset but resets are overridden by deletes in the final FormulateRetryWorkflow logic.
1034
- curr , err := resetUntil (n , getUntilFnNodeType (wfv1 .NodeTypePod ), resetFunc )
1013
+ curr , err := resetUntil (n , matchNodeType (wfv1 .NodeTypePod ), resetFunc )
1035
1014
if err != nil {
1036
1015
return nil , err
1037
1016
}
@@ -1075,83 +1054,31 @@ func resetPath(allNodes []*dagNode, startNode string) (map[string]bool, map[stri
1075
1054
nodesToDelete [nodeID ] = true
1076
1055
}
1077
1056
1078
- var mustFind wfv1.NodeType
1079
- mustFind = ""
1080
-
1081
- if curr .n .Type == wfv1 .NodeTypeContainer {
1082
- // special case where the retry node is the container of a containerSet
1083
- mustFind = wfv1 .NodeTypePod
1084
- }
1085
-
1086
- findBoundaries := false
1087
1057
for {
1088
1058
1089
1059
if curr == nil {
1090
1060
break
1091
1061
}
1092
1062
1093
- switch curr .n .Type {
1094
- case wfv1 .NodeTypePod :
1095
- //ignore
1096
- case wfv1 .NodeTypeContainer :
1097
- //ignore
1098
- case wfv1 .NodeTypeSteps :
1099
- addToReset (curr .n .ID )
1100
- findBoundaries = true
1101
- case wfv1 .NodeTypeStepGroup :
1102
- addToReset (curr .n .ID )
1103
- findBoundaries = true
1104
- case wfv1 .NodeTypeDAG :
1105
- addToReset (curr .n .ID )
1106
- findBoundaries = true
1107
- case wfv1 .NodeTypeTaskGroup :
1108
- addToReset (curr .n .ID )
1109
- findBoundaries = true
1110
- case wfv1 .NodeTypeRetry :
1063
+ switch {
1064
+ case isGroupNodeType (curr .n .Type ):
1111
1065
addToReset (curr .n .ID )
1112
- case wfv1 .NodeTypeSkipped :
1113
- // ignore -> doesn't make sense to reach this
1114
- case wfv1 .NodeTypeSuspend :
1115
- // ignore
1116
- case wfv1 .NodeTypeHTTP :
1117
- // ignore
1118
- case wfv1 .NodeTypePlugin :
1119
- addToReset (curr .n .ID )
1120
- }
1121
-
1122
- if mustFind == "" && ! findBoundaries {
1123
- curr = curr .parent
1124
- continue
1125
- }
1126
-
1127
- if findBoundaries {
1128
1066
curr , err = resetBoundaries (curr , addToReset )
1129
1067
if err != nil {
1130
1068
return nil , nil , err
1131
1069
}
1132
- findBoundaries = false
1133
1070
continue
1134
- }
1135
-
1136
- switch mustFind {
1137
- case wfv1 .NodeTypePod :
1071
+ case curr .n .Type == wfv1 .NodeTypeRetry :
1072
+ addToReset (curr .n .ID )
1073
+ case curr .n .Type == wfv1 .NodeTypeContainer :
1138
1074
curr , err = resetPod (curr , addToReset , addToDelete )
1139
- case wfv1 .NodeTypeSteps :
1140
- curr , err = resetSteps (curr , addToReset )
1141
- case wfv1 .NodeTypeStepGroup :
1142
- curr , err = resetStepGroup (curr , addToReset )
1143
- case wfv1 .NodeTypeDAG :
1144
- curr , err = resetDAG (curr , addToReset )
1145
- case wfv1 .NodeTypeTaskGroup :
1146
- curr , err = resetTaskGroup (curr , addToReset )
1147
- default :
1148
- return nil , nil , fmt .Errorf ("invalid mustFind of %s supplied" , mustFind )
1149
- }
1150
- mustFind = ""
1151
- if err != nil {
1152
- return nil , nil , err
1075
+ if err != nil {
1076
+ return nil , nil , err
1077
+ }
1078
+ continue
1153
1079
}
1154
1080
1081
+ curr = curr .parent
1155
1082
}
1156
1083
return nodesToReset , nodesToDelete , nil
1157
1084
}
@@ -1170,11 +1097,13 @@ func setUnion[T comparable](m1 map[T]bool, m2 map[T]bool) map[T]bool {
1170
1097
}
1171
1098
return res
1172
1099
}
1173
- func shouldRetryFailedType (nodeTyp wfv1.NodeType ) bool {
1174
- if nodeTyp == wfv1 .NodeTypePod || nodeTyp == wfv1 .NodeTypeContainer {
1175
- return true
1176
- }
1177
- return false
1100
+
1101
+ func isGroupNodeType (nodeType wfv1.NodeType ) bool {
1102
+ return nodeType == wfv1 .NodeTypeDAG || nodeType == wfv1 .NodeTypeTaskGroup || nodeType == wfv1 .NodeTypeStepGroup || nodeType == wfv1 .NodeTypeSteps
1103
+ }
1104
+
1105
+ func isExecutionNodeType (nodeType wfv1.NodeType ) bool {
1106
+ return nodeType == wfv1 .NodeTypeContainer || nodeType == wfv1 .NodeTypePod || nodeType == wfv1 .NodeTypeHTTP || nodeType == wfv1 .NodeTypePlugin
1178
1107
}
1179
1108
1180
1109
// dagSortedNodes sorts the nodes based on topological order, omits onExitNode
@@ -1241,7 +1170,7 @@ func FormulateRetryWorkflow(ctx context.Context, wf *wfv1.Workflow, restartSucce
1241
1170
1242
1171
failed := make (map [string ]bool )
1243
1172
for nodeID , node := range wf .Status .Nodes {
1244
- if node .Phase . FailedOrError () && shouldRetryFailedType (node .Type ) && ! isDescendantNodeSucceeded (wf , node , deleteNodesMap ) {
1173
+ if node .FailedOrError () && isExecutionNodeType (node .Type ) && ! isDescendantNodeSucceeded (wf , node , deleteNodesMap ) {
1245
1174
failed [nodeID ] = true
1246
1175
}
1247
1176
}
@@ -1295,7 +1224,7 @@ func FormulateRetryWorkflow(ctx context.Context, wf *wfv1.Workflow, restartSucce
1295
1224
}
1296
1225
1297
1226
for nodeID := range toReset {
1298
- // avoid reseting nodes that are marked for deletion
1227
+ // avoid resetting nodes that are marked for deletion
1299
1228
if in := toDelete [nodeID ]; in {
1300
1229
continue
1301
1230
}
@@ -1340,9 +1269,6 @@ func FormulateRetryWorkflow(ctx context.Context, wf *wfv1.Workflow, restartSucce
1340
1269
queue .Remove (currNode )
1341
1270
}
1342
1271
}
1343
- if n .Name == wf .Name && ! shouldRetryFailedType (n .Type ) {
1344
- newWf .Status .Nodes .Set (id , resetNode (* n .DeepCopy ()))
1345
- }
1346
1272
}
1347
1273
for id , oldWfNode := range wf .Status .Nodes {
1348
1274
0 commit comments