Search in sources :

Example 1 with Clock

use of com.google.devtools.build.lib.util.Clock in project bazel by bazelbuild.

the class HttpDownloader method download.

/**
   * Downloads file to disk and returns path.
   *
   * <p>If the SHA256 checksum and path to the repository cache is specified, attempt to load the
   * file from the {@link RepositoryCache}. If it doesn't exist, proceed to download the file and
   * load it into the cache prior to returning the value.
   *
   * @param urls list of mirror URLs with identical content
   * @param sha256 valid SHA256 hex checksum string which is checked, or empty to disable
   * @param type extension, e.g. "tar.gz" to force on downloaded filename, or empty to not do this
   * @param output destination filename if {@code type} is <i>absent</i>, otherwise output directory
   * @param eventHandler CLI progress reporter
   * @param clientEnv environment variables in shell issuing this command
   * @throws IllegalArgumentException on parameter badness, which should be checked beforehand
   * @throws IOException if download was attempted and ended up failing
   * @throws InterruptedException if this thread is being cast into oblivion
   */
public Path download(List<URL> urls, String sha256, Optional<String> type, Path output, ExtendedEventHandler eventHandler, Map<String, String> clientEnv) throws IOException, InterruptedException {
    if (Thread.interrupted()) {
        throw new InterruptedException();
    }
    Path destination = getDownloadDestination(urls.get(0), type, output);
    // Used to decide whether to cache the download at the end of this method.
    boolean isCaching = false;
    if (!sha256.isEmpty()) {
        try {
            String currentSha256 = RepositoryCache.getChecksum(KeyType.SHA256, destination);
            if (currentSha256.equals(sha256)) {
                // No need to download.
                return destination;
            }
        } catch (IOException e) {
        // Ignore error trying to hash. We'll attempt to retrieve from cache or just download again.
        }
        if (repositoryCache.isEnabled()) {
            isCaching = true;
            Path cachedDestination = repositoryCache.get(sha256, destination, KeyType.SHA256);
            if (cachedDestination != null) {
                // Cache hit!
                return cachedDestination;
            }
        }
    }
    // TODO: Consider using Dagger2 to automate this.
    Clock clock = new JavaClock();
    Sleeper sleeper = new JavaSleeper();
    Locale locale = Locale.getDefault();
    ProxyHelper proxyHelper = new ProxyHelper(clientEnv);
    HttpConnector connector = new HttpConnector(locale, eventHandler, proxyHelper, sleeper);
    ProgressInputStream.Factory progressInputStreamFactory = new ProgressInputStream.Factory(locale, clock, eventHandler);
    HttpStream.Factory httpStreamFactory = new HttpStream.Factory(progressInputStreamFactory);
    HttpConnectorMultiplexer multiplexer = new HttpConnectorMultiplexer(eventHandler, connector, httpStreamFactory, clock, sleeper);
    // Connect to the best mirror and download the file, while reporting progress to the CLI.
    semaphore.acquire();
    try (HttpStream payload = multiplexer.connect(urls, sha256);
        OutputStream out = destination.getOutputStream()) {
        ByteStreams.copy(payload, out);
    } catch (InterruptedIOException e) {
        throw new InterruptedException();
    } catch (IOException e) {
        throw new IOException("Error downloading " + urls + " to " + destination + ": " + e.getMessage());
    } finally {
        semaphore.release();
    }
    if (isCaching) {
        repositoryCache.put(sha256, destination, KeyType.SHA256);
    }
    return destination;
}
Also used : Path(com.google.devtools.build.lib.vfs.Path) Locale(java.util.Locale) InterruptedIOException(java.io.InterruptedIOException) OutputStream(java.io.OutputStream) InterruptedIOException(java.io.InterruptedIOException) IOException(java.io.IOException) JavaSleeper(com.google.devtools.build.lib.util.JavaSleeper) Sleeper(com.google.devtools.build.lib.util.Sleeper) Clock(com.google.devtools.build.lib.util.Clock) JavaClock(com.google.devtools.build.lib.util.JavaClock) JavaClock(com.google.devtools.build.lib.util.JavaClock) JavaSleeper(com.google.devtools.build.lib.util.JavaSleeper)

Example 2 with Clock

use of com.google.devtools.build.lib.util.Clock in project bazel by bazelbuild.

the class BlazeRuntime method newRuntime.

/**
   * Creates a new blaze runtime, given the install and output base directories.
   *
   * <p>Note: This method can and should only be called once per startup, as it also creates the
   * filesystem object that will be used for the runtime. So it should only ever be called from the
   * main method of the Blaze program.
   *
   * @param args Blaze startup options.
   *
   * @return a new BlazeRuntime instance initialized with the given filesystem and directories, and
   *         an error string that, if not null, describes a fatal initialization failure that makes
   *         this runtime unsuitable for real commands
   */
private static BlazeRuntime newRuntime(Iterable<BlazeModule> blazeModules, List<String> args, Runnable abruptShutdownHandler) throws AbruptExitException, OptionsParsingException {
    OptionsProvider options = parseOptions(blazeModules, args);
    for (BlazeModule module : blazeModules) {
        module.globalInit(options);
    }
    BlazeServerStartupOptions startupOptions = options.getOptions(BlazeServerStartupOptions.class);
    String productName = startupOptions.productName.toLowerCase(Locale.US);
    if (startupOptions.oomMoreEagerlyThreshold != 100) {
        new RetainedHeapLimiter(startupOptions.oomMoreEagerlyThreshold).install();
    }
    PathFragment workspaceDirectory = startupOptions.workspaceDirectory;
    PathFragment installBase = startupOptions.installBase;
    PathFragment outputBase = startupOptions.outputBase;
    // Must be before first use of JNI.
    maybeForceJNI(installBase);
    // are mandatory options, despite the comment in their declarations.
    if (installBase == null || !installBase.isAbsolute()) {
        // (includes "" default case)
        throw new IllegalArgumentException("Bad --install_base option specified: '" + installBase + "'");
    }
    if (outputBase != null && !outputBase.isAbsolute()) {
        // (includes "" default case)
        throw new IllegalArgumentException("Bad --output_base option specified: '" + outputBase + "'");
    }
    FileSystem fs = null;
    for (BlazeModule module : blazeModules) {
        FileSystem moduleFs = module.getFileSystem(options);
        if (moduleFs != null) {
            Preconditions.checkState(fs == null, "more than one module returns a file system");
            fs = moduleFs;
        }
    }
    if (fs == null) {
        fs = fileSystemImplementation();
    }
    Path.setFileSystemForSerialization(fs);
    SubprocessBuilder.setSubprocessFactory(subprocessFactoryImplementation());
    Path installBasePath = fs.getPath(installBase);
    Path outputBasePath = fs.getPath(outputBase);
    Path workspaceDirectoryPath = null;
    if (!workspaceDirectory.equals(PathFragment.EMPTY_FRAGMENT)) {
        workspaceDirectoryPath = fs.getPath(workspaceDirectory);
    }
    ServerDirectories serverDirectories = new ServerDirectories(installBasePath, outputBasePath, startupOptions.installMD5);
    Clock clock = BlazeClock.instance();
    BlazeRuntime.Builder runtimeBuilder = new BlazeRuntime.Builder().setProductName(productName).setServerDirectories(serverDirectories).setStartupOptionsProvider(options).setClock(clock).setAbruptShutdownHandler(abruptShutdownHandler).setEventBusExceptionHandler(startupOptions.fatalEventBusExceptions || !BlazeVersionInfo.instance().isReleasedBlaze() ? new BlazeRuntime.BugReportingExceptionHandler() : new BlazeRuntime.RemoteExceptionHandler());
    if (System.getenv("TEST_TMPDIR") != null && System.getenv("NO_CRASH_ON_LOGGING_IN_TEST") == null) {
        LoggingUtil.installRemoteLogger(getTestCrashLogger());
    }
    runtimeBuilder.addBlazeModule(new BuiltinCommandModule());
    for (BlazeModule blazeModule : blazeModules) {
        runtimeBuilder.addBlazeModule(blazeModule);
    }
    BlazeRuntime runtime = runtimeBuilder.build();
    BlazeDirectories directories = new BlazeDirectories(serverDirectories, workspaceDirectoryPath, startupOptions.deepExecRoot, productName);
    BinTools binTools;
    try {
        binTools = BinTools.forProduction(directories);
    } catch (IOException e) {
        throw new AbruptExitException("Cannot enumerate embedded binaries: " + e.getMessage(), ExitCode.LOCAL_ENVIRONMENTAL_ERROR);
    }
    runtime.initWorkspace(directories, binTools);
    if (startupOptions.useCustomExitCodeOnAbruptExit) {
        CustomExitCodePublisher.setAbruptExitStatusFileDir(serverDirectories.getOutputBase());
    }
    AutoProfiler.setClock(runtime.getClock());
    BugReport.setRuntime(runtime);
    return runtime;
}
Also used : Path(com.google.devtools.build.lib.vfs.Path) OptionsProvider(com.google.devtools.common.options.OptionsProvider) SubprocessBuilder(com.google.devtools.build.lib.shell.SubprocessBuilder) PathFragment(com.google.devtools.build.lib.vfs.PathFragment) IOException(java.io.IOException) Clock(com.google.devtools.build.lib.util.Clock) BlazeClock(com.google.devtools.build.lib.util.BlazeClock) ServerDirectories(com.google.devtools.build.lib.analysis.ServerDirectories) BinTools(com.google.devtools.build.lib.analysis.config.BinTools) BlazeDirectories(com.google.devtools.build.lib.analysis.BlazeDirectories) JavaIoFileSystem(com.google.devtools.build.lib.vfs.JavaIoFileSystem) FileSystem(com.google.devtools.build.lib.vfs.FileSystem) WindowsFileSystem(com.google.devtools.build.lib.windows.WindowsFileSystem) UnixFileSystem(com.google.devtools.build.lib.unix.UnixFileSystem) AbruptExitException(com.google.devtools.build.lib.util.AbruptExitException)

Example 3 with Clock

use of com.google.devtools.build.lib.util.Clock in project bazel by bazelbuild.

the class ProfilerTest method testResilenceToNonDecreasingNanoTimes.

@Test
public void testResilenceToNonDecreasingNanoTimes() throws Exception {
    final long initialNanoTime = BlazeClock.instance().nanoTime();
    final AtomicInteger numNanoTimeCalls = new AtomicInteger(0);
    Clock badClock = new Clock() {

        @Override
        public long currentTimeMillis() {
            return BlazeClock.instance().currentTimeMillis();
        }

        @Override
        public long nanoTime() {
            return initialNanoTime - numNanoTimeCalls.addAndGet(1);
        }
    };
    Path cacheFile = cacheDir.getRelative("profile1.dat");
    profiler.start(ProfiledTaskKinds.ALL, cacheFile.getOutputStream(), "testResilenceToNonDecreasingNanoTimes", false, badClock, initialNanoTime);
    profiler.logSimpleTask(badClock.nanoTime(), ProfilerTask.TEST, "some task");
    profiler.stop();
}
Also used : Path(com.google.devtools.build.lib.vfs.Path) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Clock(com.google.devtools.build.lib.util.Clock) BlazeClock(com.google.devtools.build.lib.util.BlazeClock) Test(org.junit.Test)

Aggregations

Clock (com.google.devtools.build.lib.util.Clock)3 Path (com.google.devtools.build.lib.vfs.Path)3 BlazeClock (com.google.devtools.build.lib.util.BlazeClock)2 IOException (java.io.IOException)2 BlazeDirectories (com.google.devtools.build.lib.analysis.BlazeDirectories)1 ServerDirectories (com.google.devtools.build.lib.analysis.ServerDirectories)1 BinTools (com.google.devtools.build.lib.analysis.config.BinTools)1 SubprocessBuilder (com.google.devtools.build.lib.shell.SubprocessBuilder)1 UnixFileSystem (com.google.devtools.build.lib.unix.UnixFileSystem)1 AbruptExitException (com.google.devtools.build.lib.util.AbruptExitException)1 JavaClock (com.google.devtools.build.lib.util.JavaClock)1 JavaSleeper (com.google.devtools.build.lib.util.JavaSleeper)1 Sleeper (com.google.devtools.build.lib.util.Sleeper)1 FileSystem (com.google.devtools.build.lib.vfs.FileSystem)1 JavaIoFileSystem (com.google.devtools.build.lib.vfs.JavaIoFileSystem)1 PathFragment (com.google.devtools.build.lib.vfs.PathFragment)1 WindowsFileSystem (com.google.devtools.build.lib.windows.WindowsFileSystem)1 OptionsProvider (com.google.devtools.common.options.OptionsProvider)1 InterruptedIOException (java.io.InterruptedIOException)1 OutputStream (java.io.OutputStream)1