From 6b870122e6e0708097e1c27e33b655d884146b05 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 2 Dec 2019 11:49:32 +0100 Subject: [PATCH] proactively start temp dir cleanup task on project preload stage GitOrigin-RevId: 438a3e3746b16088eab7e480a699da55706d33c0 --- ...brains.jps.builders.PreloadedDataExtension | 1 + .../CleanupTempDirectoryExtension.java | 45 +++++++++++++++++++ .../jps/incremental/IncProjectBuilder.java | 18 +++++--- 3 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 jps/jps-builders/src/META-INF/services/org.jetbrains.jps.builders.PreloadedDataExtension create mode 100644 jps/jps-builders/src/org/jetbrains/jps/incremental/CleanupTempDirectoryExtension.java diff --git a/jps/jps-builders/src/META-INF/services/org.jetbrains.jps.builders.PreloadedDataExtension b/jps/jps-builders/src/META-INF/services/org.jetbrains.jps.builders.PreloadedDataExtension new file mode 100644 index 000000000000..ea16c492e1ce --- /dev/null +++ b/jps/jps-builders/src/META-INF/services/org.jetbrains.jps.builders.PreloadedDataExtension @@ -0,0 +1 @@ +org.jetbrains.jps.incremental.CleanupTempDirectoryExtension \ No newline at end of file diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/CleanupTempDirectoryExtension.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/CleanupTempDirectoryExtension.java new file mode 100644 index 000000000000..3ad803ba0279 --- /dev/null +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/CleanupTempDirectoryExtension.java @@ -0,0 +1,45 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.jps.incremental; + +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.builders.PreloadedDataExtension; +import org.jetbrains.jps.cmdline.PreloadedData; +import org.jetbrains.jps.cmdline.ProjectDescriptor; +import org.jetbrains.jps.service.JpsServiceManager; + +import java.util.concurrent.Future; + +public class CleanupTempDirectoryExtension implements PreloadedDataExtension { + private Future myTask; + + @Override + public void preloadData(PreloadedData data) { + final ProjectDescriptor pd = data.getProjectDescriptor(); + if (pd != null) { + myTask = IncProjectBuilder.startTempDirectoryCleanupTask(pd); + } + } + + @Nullable + public static CleanupTempDirectoryExtension getInstance() { + for (PreloadedDataExtension extension : JpsServiceManager.getInstance().getExtensions(PreloadedDataExtension.class)) { + if (extension instanceof CleanupTempDirectoryExtension) { + return (CleanupTempDirectoryExtension)extension; + } + } + return null; + } + + @Nullable + public Future getCleanupTask() { + return myTask; + } + + @Override + public void buildSessionInitialized(PreloadedData data) { + } + + @Override + public void discardPreloadedData(PreloadedData data) { + } +} diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 76ee265fa2a5..c7fa92dacf36 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -172,7 +172,11 @@ public class IncProjectBuilder { myProjectDescriptor.getProjectStamps().getStampStorage().force(); }); - startTempDirectoryCleanupTask(); + final CleanupTempDirectoryExtension cleaner = CleanupTempDirectoryExtension.getInstance(); + final Future cleanupTask = cleaner != null && cleaner.getCleanupTask() != null? cleaner.getCleanupTask() : startTempDirectoryCleanupTask(myProjectDescriptor); + if (cleanupTask != null) { + myAsyncTasks.add(cleanupTask); + } CompileContextImpl context = null; try { @@ -475,16 +479,17 @@ public class IncProjectBuilder { .forEach(context::processMessage); } - private void startTempDirectoryCleanupTask() { + @Nullable + static Future startTempDirectoryCleanupTask(final ProjectDescriptor pd) { final String tempPath = System.getProperty("java.io.tmpdir", null); if (StringUtil.isEmptyOrSpaces(tempPath)) { - return; + return null; } final File tempDir = new File(tempPath); - final File dataRoot = myProjectDescriptor.dataManager.getDataPaths().getDataStorageRoot(); + final File dataRoot = pd.dataManager.getDataPaths().getDataStorageRoot(); if (!FileUtil.isAncestor(dataRoot, tempDir, true)) { // cleanup only 'local' temp - return; + return null; } final File[] files = tempDir.listFiles(); if (files != null && files.length != 0) { @@ -497,8 +502,9 @@ public class IncProjectBuilder { thread.setPriority(Thread.MIN_PRIORITY); thread.setDaemon(true); thread.start(); - myAsyncTasks.add(task); + return task; } + return null; } private CompileContextImpl createContext(CompileScope scope) throws ProjectBuildException {