All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hubspot.singularity.executor.SingularityExecutorRunner Maven / Gradle / Ivy

The newest version!
package com.hubspot.singularity.executor;

import ch.qos.logback.classic.LoggerContext;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Stage;
import com.google.inject.name.Named;
import com.hubspot.mesos.JavaUtils;
import com.hubspot.singularity.executor.config.SingularityExecutorConfiguration;
import com.hubspot.singularity.executor.config.SingularityExecutorModule;
import com.hubspot.singularity.executor.task.LocalDownloadServiceFetcher;
import com.hubspot.singularity.runner.base.config.SingularityRunnerBaseModule;
import com.hubspot.singularity.runner.base.configuration.BaseRunnerConfiguration;
import com.hubspot.singularity.s3.base.config.SingularityS3Configuration;
import org.apache.mesos.MesosExecutorDriver;
import org.apache.mesos.Protos;
import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SingularityExecutorRunner {
  private static final Logger LOG = LoggerFactory.getLogger(
    SingularityExecutorRunner.class
  );

  public static void main(String... args) {
    final long start = System.currentTimeMillis();

    try {
      final Injector injector = Guice.createInjector(
        Stage.PRODUCTION,
        new SingularityRunnerBaseModule(
          SingularityExecutorConfiguration.class,
          ImmutableSet.>of(
            SingularityS3Configuration.class
          )
        ),
        new SingularityExecutorModule()
      );
      final SingularityExecutorRunner executorRunner = injector.getInstance(
        SingularityExecutorRunner.class
      );
      final LocalDownloadServiceFetcher downloadServiceFetcher = injector.getInstance(
        LocalDownloadServiceFetcher.class
      );
      downloadServiceFetcher.start();

      final Protos.Status driverStatus = executorRunner.run();

      LOG.info(
        "Executor finished after {} with status: {}",
        JavaUtils.duration(start),
        driverStatus
      );

      downloadServiceFetcher.stop();
      stopLog();

      System.exit(driverStatus == Protos.Status.DRIVER_STOPPED ? 0 : 1);
    } catch (Throwable t) {
      LOG.error("Finished after {} with error", JavaUtils.duration(start), t);

      stopLog();

      System.exit(1);
    }
  }

  private static void stopLog() {
    ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
    if (loggerFactory instanceof LoggerContext) {
      LoggerContext context = (LoggerContext) loggerFactory;
      context.stop();
    }
  }

  private final String name;
  private final SingularityExecutor singularityExecutor;
  private final SingularityExecutorMonitor monitor;

  @Inject
  public SingularityExecutorRunner(
    @Named(SingularityRunnerBaseModule.PROCESS_NAME) String name,
    SingularityExecutor singularityExecutor,
    SingularityExecutorMonitor monitor
  ) {
    this.name = name;
    this.singularityExecutor = singularityExecutor;
    this.monitor = monitor;
  }

  public Protos.Status run() {
    LOG.info("{} starting MesosExecutorDriver...", name);

    final MesosExecutorDriver driver = new MesosExecutorDriver(singularityExecutor);
    monitor.start(driver);

    Runtime
      .getRuntime()
      .addShutdownHook(
        new Thread("SingularityExecutorRunnerGracefulShutdown") {

          @Override
          public void run() {
            LOG.info("Executor is shutting down, ensuring shutdown via shutdown hook");
            monitor.shutdown(driver);
          }
        }
      );

    return driver.run();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy