docs: private boolean tryRestartOrFail(long globalModVersionForRestart) {
  		JobStatus currentState = state;
  
  		if (currentState == JobStatus.FAILING || currentState == JobStatus.RESTARTING) {
  			final Throwable failureCause = this.failureCause;
  
  			synchronized (progressLock) {
  				if (LOG.isDebugEnabled()) {
  					LOG.debug("Try to restart or fail the job {} ({}) if no longer possible.", getJobName(), getJobID(), failureCause);
  				} else {
  					LOG.info("Try to restart or fail the job {} ({}) if no longer possible.", getJobName(), getJobID());
  				}
  
  				final boolean isFailureCauseAllowingRestart = !(failureCause instanceof SuppressRestartsException);
  				final boolean isRestartStrategyAllowingRestart = restartStrategy.canRestart();
  				boolean isRestartable = isFailureCauseAllowingRestart && isRestartStrategyAllowingRestart;
  
  				if (isRestartable && transitionState(currentState, JobStatus.RESTARTING)) {
  					LOG.info("Restarting the job {} ({}).", getJobName(), getJobID());
  
  					RestartCallback restarter = new ExecutionGraphRestartCallback(this, globalModVersionForRestart);
  					restartStrategy.restart(restarter, getJobMasterMainThreadExecutor());
  
  					return true;
  				}
  				else if (!isRestartable && transitionState(currentState, JobStatus.FAILED, failureCause)) {
  					final String cause1 = isFailureCauseAllowingRestart ? null :
  						"a type of SuppressRestartsException was thrown";
  					final String cause2 = isRestartStrategyAllowingRestart ? null :
  						"the restart strategy prevented it";
  
  					LOG.info("Could not restart the job {} ({}) because {}.", getJobName(), getJobID(),
  						StringUtils.concatenateWithAnd(cause1, cause2), failureCause);
  					onTerminalState(JobStatus.FAILED);
  
  					return true;
  				} else {
  					// we must have changed the state concurrently, thus we cannot complete this operation
  					return false;
  				}
  			}
  		} else {
  			// this operation is only allowed in the state FAILING or RESTARTING
  			return false;
  		}
  	}