@Override
  public void run() {
    // clone a copy of the killable tasks
    Set<TaskID> killableTasks = Sets.newHashSet(schedulerState.getKillableTasks());

    if (CollectionUtils.isEmpty(killableTasks)) {
      return;
    }

    Status driverStatus = driverManager.getDriverStatus();
    if (Status.DRIVER_RUNNING != driverStatus) {
      LOGGER.warn("Cannot kill tasks, as driver is not running. Status: {}", driverStatus);
      return;
    }

    for (TaskID taskIdToKill : killableTasks) {
      if (this.schedulerState.getPendingTaskIds().contains(taskIdToKill)) {
        this.schedulerState.removeTask(taskIdToKill);
      } else {
        Status status = this.driverManager.kill(taskIdToKill);
        NodeTask task = schedulerState.getTask(taskIdToKill);
        if (task != null) {
          offerLifeCycleManager.declineOutstandingOffers(task.getHostname());
          this.schedulerState.removeTask(taskIdToKill);
        } else {
          schedulerState.removeTask(taskIdToKill);
          LOGGER.warn("NodeTask with taskId: {} does not exist", taskIdToKill);
        }
        Preconditions.checkState(status == Status.DRIVER_RUNNING);
      }
    }
  }
  @Provides
  @Singleton
  SchedulerDriver providesSchedulerDriver(
      MyriadScheduler scheduler, MyriadConfiguration cfg, SchedulerState schedulerState) {

    Builder frameworkInfoBuilder =
        FrameworkInfo.newBuilder()
            .setUser("")
            .setName(cfg.getFrameworkName())
            .setCheckpoint(cfg.isCheckpoint())
            .setFailoverTimeout(cfg.getFrameworkFailoverTimeout());

    if (StringUtils.isNotEmpty(cfg.getFrameworkRole())) {
      frameworkInfoBuilder.setRole(cfg.getFrameworkRole());
    }

    FrameworkID frameworkId = schedulerState.getFrameworkID();
    if (frameworkId != null) {
      LOGGER.info("Attempting to re-register with frameworkId: {}", frameworkId.getValue());
      frameworkInfoBuilder.setId(frameworkId);
    }

    String mesosAuthenticationPrincipal = cfg.getMesosAuthenticationPrincipal();
    String mesosAuthenticationSecretFilename = cfg.getMesosAuthenticationSecretFilename();
    if (StringUtils.isNotEmpty(mesosAuthenticationPrincipal)) {
      frameworkInfoBuilder.setPrincipal(mesosAuthenticationPrincipal);

      Credential.Builder credentialBuilder = Credential.newBuilder();
      credentialBuilder.setPrincipal(mesosAuthenticationPrincipal);
      if (StringUtils.isNotEmpty(mesosAuthenticationSecretFilename)) {
        try {
          credentialBuilder.setSecretBytes(
              ByteString.readFrom(new FileInputStream(mesosAuthenticationSecretFilename)));
        } catch (FileNotFoundException ex) {
          LOGGER.error("Mesos authentication secret file was not found", ex);
          throw new RuntimeException(ex);
        } catch (IOException ex) {
          LOGGER.error("Error reading Mesos authentication secret file", ex);
          throw new RuntimeException(ex);
        }
      }
      return new MesosSchedulerDriver(
          scheduler, frameworkInfoBuilder.build(), cfg.getMesosMaster(), credentialBuilder.build());
    } else {
      return new MesosSchedulerDriver(
          scheduler, frameworkInfoBuilder.build(), cfg.getMesosMaster());
    }
  }