瀏覽代碼

SONAR-7125 use efficient delete dir code in core, batch and server

use Java NIO rather than Common IO FileUtils
tags/5.5-M1
Sébastien Lesaint 8 年之前
父節點
當前提交
8b36b92c75
共有 16 個檔案被更改,包括 71 行新增79 行删除
  1. 3
    2
      server/sonar-server/src/main/java/org/sonar/server/app/EmbeddedTomcat.java
  2. 1
    1
      server/sonar-server/src/main/java/org/sonar/server/app/TomcatContexts.java
  3. 3
    3
      server/sonar-server/src/main/java/org/sonar/server/computation/queue/report/ReportFiles.java
  4. 1
    1
      server/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerFileSystem.java
  5. 1
    1
      server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java
  6. 2
    3
      server/sonar-server/src/main/java/org/sonar/server/plugins/PluginDownloader.java
  7. 3
    5
      server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginJarExploder.java
  8. 2
    2
      server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java
  9. 9
    10
      server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileCopier.java
  10. 3
    1
      sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginJarExploder.java
  11. 13
    14
      sonar-batch/src/main/java/org/sonar/batch/bootstrap/GlobalTempFolderProvider.java
  12. 5
    6
      sonar-batch/src/main/java/org/sonar/batch/cache/DefaultProjectCacheStatus.java
  13. 5
    6
      sonar-batch/src/main/java/org/sonar/batch/index/CachesManager.java
  14. 13
    12
      sonar-batch/src/main/java/org/sonar/batch/report/ReportPublisher.java
  15. 4
    7
      sonar-batch/src/main/java/org/sonar/batch/scan/MutableProjectReactorProvider.java
  16. 3
    5
      sonar-core/src/main/java/org/sonar/core/util/DefaultHttpDownloader.java

+ 3
- 2
server/sonar-server/src/main/java/org/sonar/server/app/EmbeddedTomcat.java 查看文件

@@ -24,11 +24,12 @@ import java.io.File;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.commons.io.FileUtils;
import org.sonar.api.utils.log.Loggers;
import org.sonar.process.ProcessProperties;
import org.sonar.process.Props;

import static org.sonar.core.util.FileUtils.deleteQuietly;

class EmbeddedTomcat {

private final Props props;
@@ -97,7 +98,7 @@ class EmbeddedTomcat {
Loggers.get(EmbeddedTomcat.class).error("Fail to stop web server", e);
}
}
FileUtils.deleteQuietly(tomcatBasedir());
deleteQuietly(tomcatBasedir());
}

void awaitTermination() {

+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/app/TomcatContexts.java 查看文件

@@ -136,7 +136,7 @@ public class TomcatContexts {
static class Fs {
void createOrCleanupDir(File dir) throws IOException {
FileUtils.forceMkdir(dir);
FileUtils.cleanDirectory(dir);
org.sonar.core.util.FileUtils.cleanDirectory(dir);
}
}
}

+ 3
- 3
server/sonar-server/src/main/java/org/sonar/server/computation/queue/report/ReportFiles.java 查看文件

@@ -49,21 +49,21 @@ public class ReportFiles {
try {
FileUtils.copyInputStreamToFile(reportInput, file);
} catch (Exception e) {
FileUtils.deleteQuietly(file);
org.sonar.core.util.FileUtils.deleteQuietly(file);
IOUtils.closeQuietly(reportInput);
throw new IllegalStateException(format("Fail to copy report to file: %s", file.getAbsolutePath()), e);
}
}

public void deleteIfExists(String taskUuid) {
FileUtils.deleteQuietly(fileForUuid(taskUuid));
org.sonar.core.util.FileUtils.deleteQuietly(fileForUuid(taskUuid));
}

public void deleteAll() {
File dir = reportDir();
if (dir.exists()) {
try {
FileUtils.cleanDirectory(dir);
org.sonar.core.util.FileUtils.cleanDirectory(dir);
} catch (Exception e) {
throw new IllegalStateException(format("Fail to clean directory: %s", dir.getAbsolutePath()), e);
}

+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerFileSystem.java 查看文件

@@ -74,7 +74,7 @@ public class DefaultServerFileSystem implements ServerFileSystem, Startable {
File deprecated = getDeprecatedPluginsDir();
try {
FileUtils.forceMkdir(deprecated);
FileUtils.cleanDirectory(deprecated);
org.sonar.core.util.FileUtils.cleanDirectory(deprecated);
} catch (IOException e) {
throw new IllegalStateException("The following directory can not be created: " + deprecated.getAbsolutePath(), e);
}

+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java 查看文件

@@ -111,7 +111,7 @@ public class RailsAppsDeployer implements Startable {
private void prepareDir(File appsDir) {
if (appsDir.exists() && appsDir.isDirectory()) {
try {
FileUtils.deleteDirectory(appsDir);
org.sonar.core.util.FileUtils.deleteDirectory(appsDir);
} catch (IOException e) {
throw new IllegalStateException("Fail to delete temp directory: " + appsDir, e);
}

+ 2
- 3
server/sonar-server/src/main/java/org/sonar/server/plugins/PluginDownloader.java 查看文件

@@ -42,14 +42,13 @@ import org.sonar.updatecenter.common.Version;

import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Lists.newArrayList;
import static org.apache.commons.io.FileUtils.cleanDirectory;
import static org.apache.commons.io.FileUtils.copyFile;
import static org.apache.commons.io.FileUtils.copyFileToDirectory;
import static org.apache.commons.io.FileUtils.deleteQuietly;
import static org.apache.commons.io.FileUtils.forceMkdir;
import static org.apache.commons.io.FileUtils.toFile;
import static org.apache.commons.lang.StringUtils.substringAfterLast;
import static org.sonar.core.platform.PluginInfo.jarToPluginInfo;
import static org.sonar.core.util.FileUtils.deleteQuietly;

/**
* Downloads plugins from update center. Files are copied in the directory extensions/downloads and then
@@ -95,7 +94,7 @@ public class PluginDownloader implements Startable {
public void cancelDownloads() {
try {
if (downloadDir.exists()) {
cleanDirectory(downloadDir);
org.sonar.core.util.FileUtils.cleanDirectory(downloadDir);
}
} catch (IOException e) {
throw new IllegalStateException("Fail to clean the plugin downloads directory: " + downloadDir, e);

+ 3
- 5
server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginJarExploder.java 查看文件

@@ -19,17 +19,15 @@
*/
package org.sonar.server.plugins;

import java.io.File;
import org.apache.commons.io.FileUtils;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.ZipUtils;
import org.sonar.core.platform.ExplodedPlugin;
import org.sonar.core.platform.PluginJarExploder;
import org.sonar.core.platform.PluginInfo;
import org.sonar.core.platform.PluginJarExploder;
import org.sonar.server.platform.DefaultServerFileSystem;

import java.io.File;

import static org.apache.commons.io.FileUtils.cleanDirectory;
import static org.apache.commons.io.FileUtils.forceMkdir;

@ServerSide
@@ -51,7 +49,7 @@ public class ServerPluginJarExploder extends PluginJarExploder {
File toDir = new File(fs.getDeployedPluginsDir(), pluginInfo.getKey());
try {
forceMkdir(toDir);
cleanDirectory(toDir);
org.sonar.core.util.FileUtils.cleanDirectory(toDir);

File jarSource = pluginInfo.getNonNullJarFile();
File jarTarget = new File(toDir, jarSource.getName());

+ 2
- 2
server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java 查看文件

@@ -53,7 +53,7 @@ import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Lists.newArrayList;
import static java.lang.String.format;
import static org.apache.commons.io.FileUtils.copyFile;
import static org.apache.commons.io.FileUtils.deleteQuietly;
import static org.sonar.core.util.FileUtils.deleteQuietly;
import static org.apache.commons.io.FileUtils.moveFile;
import static org.apache.commons.io.FileUtils.moveFileToDirectory;
import static org.sonar.core.platform.PluginInfo.jarToPluginInfo;
@@ -159,7 +159,7 @@ public class ServerPluginRepository implements PluginRepository, Startable {
private void registerPluginInfo(PluginInfo info) {
if (blacklistedPluginKeys.contains(info.getKey())) {
LOG.warn("Plugin {} [{}] is blacklisted and is being uninstalled.", info.getName(), info.getKey());
deleteQuietly(info.getNonNullJarFile());
org.sonar.core.util.FileUtils.deleteQuietly(info.getNonNullJarFile());
return;
}
PluginInfo existing = pluginInfosByKeys.put(info.getKey(), info);

+ 9
- 10
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileCopier.java 查看文件

@@ -19,15 +19,6 @@
*/
package org.sonar.server.qualityprofile;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.TempFolder;
import org.sonar.db.DbSession;
import org.sonar.db.qualityprofile.QualityProfileDto;
import org.sonar.db.DbClient;

import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
@@ -35,6 +26,14 @@ import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.TempFolder;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.qualityprofile.QualityProfileDto;

@ServerSide
public class QProfileCopier {
@@ -59,7 +58,7 @@ public class QProfileCopier {
restore(backupFile, QProfileName.createFor(to.getLanguage(), to.getName()));
return to;
} finally {
FileUtils.deleteQuietly(backupFile);
org.sonar.core.util.FileUtils.deleteQuietly(backupFile);
}
}


+ 3
- 1
sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginJarExploder.java 查看文件

@@ -31,6 +31,8 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import static org.sonar.core.util.FileUtils.deleteQuietly;

@BatchSide
public class BatchPluginJarExploder extends PluginJarExploder {

@@ -70,7 +72,7 @@ public class BatchPluginJarExploder extends PluginJarExploder {
}
} finally {
out.close();
FileUtils.deleteQuietly(lockFile);
deleteQuietly(lockFile);
}
}
return destDir;

+ 13
- 14
sonar-batch/src/main/java/org/sonar/batch/bootstrap/GlobalTempFolderProvider.java 查看文件

@@ -19,19 +19,6 @@
*/
package org.sonar.batch.bootstrap;

import org.picocontainer.ComponentLifecycle;

import org.picocontainer.PicoContainer;
import org.picocontainer.injectors.ProviderAdapter;
import org.sonar.api.utils.System2;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.apache.commons.io.FileUtils;
import org.sonar.api.utils.TempFolder;
import org.apache.commons.lang.StringUtils;
import org.sonar.api.CoreProperties;
import org.sonar.api.utils.internal.DefaultTempFolder;

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
@@ -39,6 +26,18 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
import org.picocontainer.ComponentLifecycle;
import org.picocontainer.PicoContainer;
import org.picocontainer.injectors.ProviderAdapter;
import org.sonar.api.CoreProperties;
import org.sonar.api.utils.System2;
import org.sonar.api.utils.TempFolder;
import org.sonar.api.utils.internal.DefaultTempFolder;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;

import static org.sonar.core.util.FileUtils.deleteQuietly;

public class GlobalTempFolderProvider extends ProviderAdapter implements ComponentLifecycle<TempFolder> {
private static final Logger LOG = Loggers.get(GlobalTempFolderProvider.class);
@@ -113,7 +112,7 @@ public class GlobalTempFolderProvider extends ProviderAdapter implements Compone
if (Files.exists(path)) {
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, new CleanFilter())) {
for (Path p : stream) {
FileUtils.deleteQuietly(p.toFile());
deleteQuietly(p.toFile());
}
}
}

+ 5
- 6
sonar-batch/src/main/java/org/sonar/batch/cache/DefaultProjectCacheStatus.java 查看文件

@@ -19,10 +19,6 @@
*/
package org.sonar.batch.cache;

import org.apache.commons.io.FileUtils;

import org.sonar.home.cache.PersistentCache;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -31,6 +27,9 @@ import java.io.ObjectOutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Date;
import org.sonar.home.cache.PersistentCache;

import static org.sonar.core.util.FileUtils.deleteQuietly;

public class DefaultProjectCacheStatus implements ProjectCacheStatus {
private static final String STATUS_FILENAME = "cache-sync-status";
@@ -56,7 +55,7 @@ public class DefaultProjectCacheStatus implements ProjectCacheStatus {
@Override
public void delete() {
cache.clear();
FileUtils.deleteQuietly(getStatusFilePath().toFile());
deleteQuietly(getStatusFilePath().toFile());
}

@Override
@@ -70,7 +69,7 @@ public class DefaultProjectCacheStatus implements ProjectCacheStatus {
return (Date) objInput.readObject();
}
} catch (IOException | ClassNotFoundException e) {
FileUtils.deleteQuietly(p.toFile());
deleteQuietly(p.toFile());
throw new IllegalStateException("Failed to read cache sync status", e);
}
}

+ 5
- 6
sonar-batch/src/main/java/org/sonar/batch/index/CachesManager.java 查看文件

@@ -19,18 +19,17 @@
*/
package org.sonar.batch.index;

import org.sonar.api.utils.TempFolder;

import com.persistit.Persistit;
import com.persistit.exception.PersistitException;
import com.persistit.logging.Slf4jAdapter;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.util.Properties;
import org.picocontainer.Startable;
import org.slf4j.LoggerFactory;
import org.sonar.api.batch.BatchSide;
import org.sonar.api.utils.TempFolder;

import java.io.File;
import java.util.Properties;
import static org.sonar.core.util.FileUtils.deleteQuietly;

/**
* Factory of caches
@@ -85,7 +84,7 @@ public class CachesManager implements Startable {
throw new IllegalStateException("Fail to close caches", e);
}
}
FileUtils.deleteQuietly(tempDir);
deleteQuietly(tempDir);
tempDir = null;
}


+ 13
- 12
sonar-batch/src/main/java/org/sonar/batch/report/ReportPublisher.java 查看文件

@@ -23,6 +23,15 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Throwables;
import com.google.common.io.Files;
import com.squareup.okhttp.HttpUrl;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.annotation.Nullable;
import org.apache.commons.io.FileUtils;
import org.picocontainer.Startable;
import org.sonar.api.CoreProperties;
@@ -42,15 +51,7 @@ import org.sonarqube.ws.WsCe;
import org.sonarqube.ws.client.PostRequest;
import org.sonarqube.ws.client.WsResponse;

import javax.annotation.Nullable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.sonar.core.util.FileUtils.deleteQuietly;

@BatchSide
public class ReportPublisher implements Startable {
@@ -73,7 +74,7 @@ public class ReportPublisher implements Startable {
private BatchReportWriter writer;

public ReportPublisher(Settings settings, BatchWsClient wsClient, AnalysisContextReportPublisher contextPublisher,
ImmutableProjectReactor projectReactor, DefaultAnalysisMode analysisMode, TempFolder temp, ReportPublisherStep[] publishers) {
ImmutableProjectReactor projectReactor, DefaultAnalysisMode analysisMode, TempFolder temp, ReportPublisherStep[] publishers) {
this.settings = settings;
this.wsClient = wsClient;
this.contextPublisher = contextPublisher;
@@ -93,7 +94,7 @@ public class ReportPublisher implements Startable {
@Override
public void stop() {
if (!settings.getBoolean(KEEP_REPORT_PROP_KEY) && !settings.getBoolean(VERBOSE_KEY)) {
FileUtils.deleteQuietly(reportDir);
deleteQuietly(reportDir);
} else {
LOG.info("Analysis report generated in " + reportDir);
}
@@ -174,7 +175,7 @@ public class ReportPublisher implements Startable {
String effectiveKey = projectReactor.getRoot().getKeyWithBranch();
metadata.put("projectKey", effectiveKey);
metadata.put("serverUrl", publicUrl());
URL dashboardUrl = HttpUrl.parse(publicUrl()).newBuilder()
.addPathSegment("dashboard").addPathSegment("index").addPathSegment(effectiveKey)
.build()

+ 4
- 7
sonar-batch/src/main/java/org/sonar/batch/scan/MutableProjectReactorProvider.java 查看文件

@@ -19,13 +19,11 @@
*/
package org.sonar.batch.scan;

import org.apache.commons.io.FileUtils;
import org.picocontainer.injectors.ProviderAdapter;
import org.sonar.api.batch.bootstrap.ProjectReactor;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import org.picocontainer.injectors.ProviderAdapter;
import org.sonar.api.batch.bootstrap.ProjectReactor;
import org.sonar.core.util.FileUtils;

public class MutableProjectReactorProvider extends ProviderAdapter {
private ProjectReactor reactor = null;
@@ -40,8 +38,7 @@ public class MutableProjectReactorProvider extends ProviderAdapter {

private static void cleanDirectory(File dir) {
try {
FileUtils.deleteDirectory(dir);
Files.createDirectories(dir.toPath());
FileUtils.cleanDirectory(dir);
} catch (IOException e) {
throw new IllegalStateException("Failed to recreate working directory: " + dir.getAbsolutePath(), e);
}

+ 3
- 5
sonar-core/src/main/java/org/sonar/core/util/DefaultHttpDownloader.java 查看文件

@@ -29,7 +29,6 @@ import com.google.common.io.ByteStreams;
import com.google.common.io.CharStreams;
import com.google.common.io.Files;
import com.google.common.io.InputSupplier;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -44,11 +43,8 @@ import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPInputStream;

import javax.annotation.Nullable;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.sonar.api.config.Settings;
import org.sonar.api.platform.Server;
@@ -56,6 +52,8 @@ import org.sonar.api.utils.HttpDownloader;
import org.sonar.api.utils.SonarException;
import org.sonar.api.utils.log.Loggers;

import static org.sonar.core.util.FileUtils.deleteQuietly;

/**
* This component downloads HTTP files
*
@@ -150,7 +148,7 @@ public class DefaultHttpDownloader extends HttpDownloader {
try {
Files.copy(downloader.newInputSupplier(uri, this.connectTimeout, this.readTimeout), toFile);
} catch (IOException e) {
FileUtils.deleteQuietly(toFile);
deleteQuietly(toFile);
throw failToDownload(uri, e);
}
}

Loading…
取消
儲存