[ 
https://issues.apache.org/jira/browse/GOBBLIN-2151?focusedWorklogId=933872&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-933872
 ]

ASF GitHub Bot logged work on GOBBLIN-2151:
-------------------------------------------

                Author: ASF GitHub Bot
            Created on: 09/Sep/24 21:23
            Start Date: 09/Sep/24 21:23
    Worklog Time Spent: 10m 
      Work Description: phet commented on code in PR #4050:
URL: https://github.com/apache/gobblin/pull/4050#discussion_r1750937444


##########
gobblin-service/src/main/java/org/apache/gobblin/service/modules/utils/FlowCompilationValidationHelper.java:
##########
@@ -187,9 +194,59 @@ public Optional<Dag<JobExecutionPlan>> 
validateAndHandleConcurrentExecution(Conf
    * @param allowConcurrentExecution
    * @return true if the {@link FlowSpec} allows concurrent executions or if 
no other instance of the flow is currently RUNNING.
    */
-  private boolean isExecutionPermitted(FlowStatusGenerator 
flowStatusGenerator, String flowGroup, String flowName,
-      boolean allowConcurrentExecution, long flowExecutionId) {
-    return allowConcurrentExecution || 
!flowStatusGenerator.isFlowRunning(flowName, flowGroup, flowExecutionId);
+  private boolean isExecutionPermitted(String flowGroup, String flowName, 
boolean allowConcurrentExecution)
+      throws IOException {
+    return allowConcurrentExecution || !isFlowRunning(flowGroup, flowName, 
dagManagementStateStore);
+  }
+
+  /**
+   * Returns true if any previous execution for the flow determined by the 
provided flowGroup, flowName is running.
+   * We ignore the execution that has the provided flowExecutionId. We also 
ignore the flows that are running beyond

Review Comment:
   doesn't look like `flowExecutionId` is actually provided



##########
gobblin-service/src/main/java/org/apache/gobblin/service/modules/utils/FlowCompilationValidationHelper.java:
##########
@@ -187,9 +194,59 @@ public Optional<Dag<JobExecutionPlan>> 
validateAndHandleConcurrentExecution(Conf
    * @param allowConcurrentExecution
    * @return true if the {@link FlowSpec} allows concurrent executions or if 
no other instance of the flow is currently RUNNING.
    */
-  private boolean isExecutionPermitted(FlowStatusGenerator 
flowStatusGenerator, String flowGroup, String flowName,
-      boolean allowConcurrentExecution, long flowExecutionId) {
-    return allowConcurrentExecution || 
!flowStatusGenerator.isFlowRunning(flowName, flowGroup, flowExecutionId);
+  private boolean isExecutionPermitted(String flowGroup, String flowName, 
boolean allowConcurrentExecution)
+      throws IOException {
+    return allowConcurrentExecution || !isFlowRunning(flowGroup, flowName, 
dagManagementStateStore);
+  }
+
+  /**
+   * Returns true if any previous execution for the flow determined by the 
provided flowGroup, flowName is running.
+   * We ignore the execution that has the provided flowExecutionId. We also 
ignore the flows that are running beyond
+   * the job start deadline and flow finish deadline.
+   */
+  @VisibleForTesting
+  static boolean isFlowRunning(String flowGroup, String flowName, 
DagManagementStateStore dagManagementStateStore)
+      throws IOException {
+    List<FlowStatus> flowStatusList = 
dagManagementStateStore.getAllFlowStatusesForFlow(flowGroup, flowName);
+
+    if (flowStatusList == null || flowStatusList.isEmpty()) {
+      return false;
+    }
+
+    for (FlowStatus flowStatus : flowStatusList) {
+      ExecutionStatus flowExecutionStatus = 
flowStatus.getFlowExecutionStatus();
+      log.info("Verifying if {} is running...", flowStatus);

Review Comment:
   at best this should be `.debug` level... although I'm not 100% certain about 
that, given it may not be descriptive enough



##########
gobblin-service/src/main/java/org/apache/gobblin/service/modules/utils/FlowCompilationValidationHelper.java:
##########
@@ -187,9 +194,59 @@ public Optional<Dag<JobExecutionPlan>> 
validateAndHandleConcurrentExecution(Conf
    * @param allowConcurrentExecution
    * @return true if the {@link FlowSpec} allows concurrent executions or if 
no other instance of the flow is currently RUNNING.
    */
-  private boolean isExecutionPermitted(FlowStatusGenerator 
flowStatusGenerator, String flowGroup, String flowName,
-      boolean allowConcurrentExecution, long flowExecutionId) {
-    return allowConcurrentExecution || 
!flowStatusGenerator.isFlowRunning(flowName, flowGroup, flowExecutionId);
+  private boolean isExecutionPermitted(String flowGroup, String flowName, 
boolean allowConcurrentExecution)
+      throws IOException {
+    return allowConcurrentExecution || !isFlowRunning(flowGroup, flowName, 
dagManagementStateStore);
+  }
+
+  /**
+   * Returns true if any previous execution for the flow determined by the 
provided flowGroup, flowName is running.
+   * We ignore the execution that has the provided flowExecutionId. We also 
ignore the flows that are running beyond
+   * the job start deadline and flow finish deadline.
+   */
+  @VisibleForTesting
+  static boolean isFlowRunning(String flowGroup, String flowName, 
DagManagementStateStore dagManagementStateStore)
+      throws IOException {
+    List<FlowStatus> flowStatusList = 
dagManagementStateStore.getAllFlowStatusesForFlow(flowGroup, flowName);
+
+    if (flowStatusList == null || flowStatusList.isEmpty()) {
+      return false;
+    }
+
+    for (FlowStatus flowStatus : flowStatusList) {
+      ExecutionStatus flowExecutionStatus = 
flowStatus.getFlowExecutionStatus();
+      log.info("Verifying if {} is running...", flowStatus);
+
+      if (flowExecutionStatus == COMPILED || flowExecutionStatus == PENDING
+          || flowExecutionStatus == PENDING_RESUME || flowExecutionStatus == 
RUNNING) {

Review Comment:
   let's code more defensively by confirm specific statues we expect and 
flagging those that are unrecognized.  e.g. what about ORCHESTRATED?  -
   ```
   if (fES == COMPLETED || fES == FAILED) {
     // no-op
   } else if (fES == COMPILED || PENDING_RESUME || RUNNING) {
     ...
   } else {
     log.error("unknown fES...");
   }
   ```



##########
gobblin-service/src/main/java/org/apache/gobblin/service/modules/utils/FlowCompilationValidationHelper.java:
##########
@@ -187,9 +194,59 @@ public Optional<Dag<JobExecutionPlan>> 
validateAndHandleConcurrentExecution(Conf
    * @param allowConcurrentExecution
    * @return true if the {@link FlowSpec} allows concurrent executions or if 
no other instance of the flow is currently RUNNING.
    */
-  private boolean isExecutionPermitted(FlowStatusGenerator 
flowStatusGenerator, String flowGroup, String flowName,
-      boolean allowConcurrentExecution, long flowExecutionId) {
-    return allowConcurrentExecution || 
!flowStatusGenerator.isFlowRunning(flowName, flowGroup, flowExecutionId);
+  private boolean isExecutionPermitted(String flowGroup, String flowName, 
boolean allowConcurrentExecution)
+      throws IOException {
+    return allowConcurrentExecution || !isFlowRunning(flowGroup, flowName, 
dagManagementStateStore);
+  }
+
+  /**
+   * Returns true if any previous execution for the flow determined by the 
provided flowGroup, flowName is running.
+   * We ignore the execution that has the provided flowExecutionId. We also 
ignore the flows that are running beyond
+   * the job start deadline and flow finish deadline.
+   */
+  @VisibleForTesting
+  static boolean isFlowRunning(String flowGroup, String flowName, 
DagManagementStateStore dagManagementStateStore)
+      throws IOException {
+    List<FlowStatus> flowStatusList = 
dagManagementStateStore.getAllFlowStatusesForFlow(flowGroup, flowName);
+
+    if (flowStatusList == null || flowStatusList.isEmpty()) {
+      return false;
+    }
+
+    for (FlowStatus flowStatus : flowStatusList) {
+      ExecutionStatus flowExecutionStatus = 
flowStatus.getFlowExecutionStatus();
+      log.info("Verifying if {} is running...", flowStatus);
+
+      if (flowExecutionStatus == COMPILED || flowExecutionStatus == PENDING
+          || flowExecutionStatus == PENDING_RESUME || flowExecutionStatus == 
RUNNING) {
+        Dag.DagId dagIdOfOldExecution = new Dag.DagId(flowGroup, flowName, 
flowStatus.getFlowExecutionId());
+        java.util.Optional<Dag<JobExecutionPlan>> dag = 
dagManagementStateStore.getDag(dagIdOfOldExecution);
+
+        if (!dag.isPresent()) {
+          // dag is finished and cleaned up, job status monitor somehow did 
not receive/update the flow status; just ignore it...

Review Comment:
   this really shouldn't happen, should it?  if not, let's log a `.warn`ing





Issue Time Tracking
-------------------

    Worklog Id:     (was: 933872)
    Time Spent: 20m  (was: 10m)

> ignore flows that are running beyond job start and flow finish deadline
> -----------------------------------------------------------------------
>
>                 Key: GOBBLIN-2151
>                 URL: https://issues.apache.org/jira/browse/GOBBLIN-2151
>             Project: Apache Gobblin
>          Issue Type: Improvement
>            Reporter: Arjun Singh Bora
>            Priority: Major
>          Time Spent: 20m
>  Remaining Estimate: 0h
>




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to