code: @VisibleForTesting
    static void addJobStatusToStateStore(org.apache.gobblin.configuration.State jobStatus, StateStore stateStore)
        throws IOException {
      if (!jobStatus.contains(TimingEvent.FlowEventConstants.JOB_NAME_FIELD)) {
        jobStatus.setProp(TimingEvent.FlowEventConstants.JOB_NAME_FIELD, JobStatusRetriever.NA_KEY);
      }
      if (!jobStatus.contains(TimingEvent.FlowEventConstants.JOB_GROUP_FIELD)) {
        jobStatus.setProp(TimingEvent.FlowEventConstants.JOB_GROUP_FIELD, JobStatusRetriever.NA_KEY);
      }
  
      String flowName = jobStatus.getProp(TimingEvent.FlowEventConstants.FLOW_NAME_FIELD);
      String flowGroup = jobStatus.getProp(TimingEvent.FlowEventConstants.FLOW_GROUP_FIELD);
      String flowExecutionId = jobStatus.getProp(TimingEvent.FlowEventConstants.FLOW_EXECUTION_ID_FIELD);
      String jobName = jobStatus.getProp(TimingEvent.FlowEventConstants.JOB_NAME_FIELD);
      String jobGroup = jobStatus.getProp(TimingEvent.FlowEventConstants.JOB_GROUP_FIELD);
      String storeName = jobStatusStoreName(flowGroup, flowName);
      String tableName = jobStatusTableName(flowExecutionId, jobGroup, jobName);
  
      jobStatus = mergedProperties(storeName, tableName, jobStatus, stateStore);
  
      stateStore.put(storeName, tableName, jobStatus);
    }
docs: Persist job status to the underlying {@link StateStore}.
  It fills missing fields in job status and also merge the fields with the
  existing job status in the state store. Merging is required because we
  do not want to lose the information sent by other GobblinTrackingEvents.
  @param jobStatus
  @throws IOException