]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6700 fix undeleted computation working dir and cache files 425/head
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 20 Jul 2015 13:21:24 +0000 (15:21 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 20 Jul 2015 13:24:08 +0000 (15:24 +0200)
server/sonar-server/src/main/java/org/sonar/server/computation/ComputationContainer.java
server/sonar-server/src/main/java/org/sonar/server/computation/ComputationTempFolderProvider.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/internal/DefaultTempFolder.java

index 21e9e7c9cb278f886600c02001a540479d304c12..2e152ca992cd7985c5a3a455fca8aa1d66f1633e 100644 (file)
@@ -59,6 +59,9 @@ public class ComputationContainer {
    */
   static List componentClasses() {
     return Arrays.asList(
+      // temp directory
+      new ComputationTempFolderProvider(),
+
       ComputationService.class,
       ComputationSteps.class,
 
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationTempFolderProvider.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationTempFolderProvider.java
new file mode 100644 (file)
index 0000000..114af56
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.computation;
+
+import java.io.File;
+import java.io.IOException;
+import javax.annotation.CheckForNull;
+import org.apache.commons.io.FileUtils;
+import org.picocontainer.ComponentLifecycle;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.injectors.ProviderAdapter;
+import org.sonar.api.platform.ServerFileSystem;
+import org.sonar.api.utils.TempFolder;
+import org.sonar.api.utils.internal.DefaultTempFolder;
+
+/**
+ * Provides a TempFolder instance pointing a directory dedicated to the processing of a specific item.
+ * This directory will be deleted at the end of the processing.
+ * This directory is located in the "ce" directory of the temp directory of the SonarQube instance.
+ */
+public class ComputationTempFolderProvider extends ProviderAdapter implements ComponentLifecycle<TempFolder> {
+  private boolean started = false;
+  @CheckForNull
+  private AutoDeletedTempFolder tempFolder;
+
+  public TempFolder provide(ServerFileSystem fs) {
+    if (this.tempFolder == null) {
+      File tempDir = new File(fs.getTempDir(), "ce");
+      try {
+        FileUtils.forceMkdir(tempDir);
+      } catch (IOException e) {
+        throw new IllegalStateException("Unable to create computation temp directory " + tempDir, e);
+      }
+      File computationDir = new DefaultTempFolder(tempDir).newDir();
+      this.tempFolder = new AutoDeletedTempFolder(computationDir);
+    }
+    return this.tempFolder;
+  }
+
+  @Override
+  public void start(PicoContainer container) {
+    this.started = true;
+  }
+
+  @Override
+  public void stop(PicoContainer container) {
+    if (tempFolder != null) {
+      tempFolder.stop();
+    }
+  }
+
+  @Override
+  public void dispose(PicoContainer container) {
+    // nothing to do
+  }
+
+  @Override
+  public boolean componentHasLifecycle() {
+    return true;
+  }
+
+  @Override
+  public boolean isStarted() {
+    return started;
+  }
+
+  private static class AutoDeletedTempFolder extends DefaultTempFolder {
+
+    public AutoDeletedTempFolder(File tempDir) {
+      super(tempDir);
+    }
+
+    public void stop() {
+      FileUtils.deleteQuietly(tempDir);
+    }
+  }
+}
index c96ecc3e488d7234b463d6cf63847ee1a1aeac2f..5a20de88adb7bf1563d2c28e4f8ca1d19a99b2a4 100644 (file)
@@ -34,7 +34,7 @@ public class DefaultTempFolder implements TempFolder {
   /** Maximum loop count when creating temp directories. */
   private static final int TEMP_DIR_ATTEMPTS = 10000;
 
-  private final File tempDir;
+  protected final File tempDir;
 
   public DefaultTempFolder(File tempDir) {
     this.tempDir = tempDir;
@@ -53,7 +53,7 @@ public class DefaultTempFolder implements TempFolder {
 
     for (int counter = 0; counter < TEMP_DIR_ATTEMPTS; counter++) {
       File tempDir = new File(baseDir, baseName + counter);
-      if (tempDir.mkdir()) {
+      if (tempDir.mkdirs()) {
         return tempDir;
       }
     }