]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6879 Don't delete cache if update fails and change strategy
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Wed, 30 Sep 2015 13:34:39 +0000 (15:34 +0200)
committerDuarte Meneses <duarte.meneses@sonarsource.com>
Thu, 1 Oct 2015 12:34:34 +0000 (14:34 +0200)
sonar-batch/src/main/java/org/sonar/batch/cache/NonAssociatedCacheSynchronizer.java
sonar-batch/src/main/java/org/sonar/batch/cache/ProjectCacheSynchronizer.java
sonar-batch/src/test/java/org/sonar/batch/cache/ProjectCacheSynchronizerTest.java
sonar-batch/src/test/java/org/sonar/batch/mediumtest/cache/CacheSyncTest.java
sonar-home/src/main/java/org/sonar/home/cache/PersistentCacheBuilder.java

index 2df946dc0aea897ecd8c269012b375128ce6baf6..592ad0ed305a2d015c85441c9bd096b7dacbeefb 100644 (file)
@@ -55,13 +55,11 @@ public class NonAssociatedCacheSynchronizer {
       } else {
         LOG.info("-- Found cache [{}], synchronizing data..", lastSync);
       }
-      cacheStatus.delete();
     } else {
       LOG.info("-- Cache not found, synchronizing data..");
     }
 
     loadData();
-
     cacheStatus.save();
     LOG.info("-- Succesfully synchronized cache");
   }
index fbba13fbbc83b10568d1a7c6e096b6141fcdd42e..c6366cfce6dce07ba1ec32747d53c3c1b1e5d19d 100644 (file)
@@ -20,7 +20,6 @@
 package org.sonar.batch.cache;
 
 import org.sonar.batch.repository.ProjectRepositoriesLoader;
-
 import org.sonarqube.ws.QualityProfiles.WsSearchResponse.QualityProfile;
 import com.google.common.base.Function;
 import org.apache.commons.lang.StringUtils;
@@ -36,6 +35,7 @@ import org.sonar.batch.repository.user.UserRepositoryLoader;
 import org.sonar.batch.rule.ActiveRulesLoader;
 
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collection;
 import java.util.Date;
 import java.util.HashSet;
@@ -63,22 +63,48 @@ public class ProjectCacheSynchronizer {
     this.cacheStatus = cacheStatus;
   }
 
+  private static boolean isToday(Date d) {
+    Calendar c1 = Calendar.getInstance();
+    Calendar c2 = Calendar.getInstance();
+    c2.setTime(d);
+
+    return c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR) &&
+      c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR);
+  }
+
+  private static boolean shouldUpdate(Date lastUpdate) {
+    return !isToday(lastUpdate);
+  }
+
   public void load(String projectKey, boolean force) {
     Date lastSync = cacheStatus.getSyncStatus();
+    boolean failOnError = true;
 
     if (lastSync != null) {
-      if (!force) {
+      if (force) {
+        LOG.info("-- Found project [{}] cache [{}], synchronizing data (forced)..", projectKey, lastSync);
+      } else if (shouldUpdate(lastSync)) {
+        LOG.info("-- Found project [{}] cache [{}], synchronizing data..", projectKey, lastSync);
+        failOnError = false;
+      } else {
         LOG.info("Found project [{}] cache [{}]", projectKey, lastSync);
         return;
-      } else {
-        LOG.info("-- Found project [{}] cache [{}], synchronizing data..", projectKey, lastSync);
       }
-      cacheStatus.delete();
     } else {
       LOG.info("-- Cache for project [{}] not found, synchronizing data..", projectKey);
     }
 
-    loadData(projectKey);
+    try {
+      loadData(projectKey);
+    } catch (Exception e) {
+      if (failOnError) {
+        throw e;
+      }
+
+      LOG.warn("-- Cache update for project [{}] failed, continuing from cache..", projectKey, e);
+      return;
+    }
+
     saveStatus();
   }
 
@@ -121,7 +147,7 @@ public class ProjectCacheSynchronizer {
       issuesLoader.load(projectKey, consumer);
       profiler.stopInfo();
 
-      profiler.startInfo("Load user information (" + consumer.loginSet.size() + " users)");
+      profiler.startInfo("Load user information");
       for (String login : consumer.loginSet) {
         userRepository.load(login, null);
       }
index 6098850be55c0e20921733be901b3b40b80e8bf0..ebaa797cc43427fdcd5b6d526f8d58fbe33b8add 100644 (file)
@@ -147,4 +147,52 @@ public class ProjectCacheSynchronizerTest {
 
     verifyNoMoreInteractions(issuesLoader, userRepositoryLoader, qualityProfileLoader, activeRulesLoader, projectRepositoriesLoader);
   }
+
+  @Test
+  public void testLastAnalysisToday() {
+    ProjectCacheSynchronizer synchronizer = createMockedLoaders(true, new Date());
+    
+    when(cacheStatus.getSyncStatus()).thenReturn(new Date());
+    synchronizer.load(PROJECT_KEY, false);
+
+    verify(cacheStatus).getSyncStatus();
+    verifyNoMoreInteractions(issuesLoader, userRepositoryLoader, qualityProfileLoader, activeRulesLoader, projectRepositoriesLoader, cacheStatus);
+  }
+
+  @Test
+  public void testLastAnalysisYesterday() {
+    ProjectCacheSynchronizer synchronizer = createMockedLoaders(true, new Date());
+    
+    Date d = new Date(new Date().getTime() - 60 * 60 * 24 * 1000);
+    when(cacheStatus.getSyncStatus()).thenReturn(d);
+    synchronizer.load(PROJECT_KEY, false);
+
+    verify(cacheStatus).save();
+    verify(cacheStatus).getSyncStatus();
+  }
+  
+  @Test
+  public void testDontFailOnError() {
+    ProjectCacheSynchronizer synchronizer = createMockedLoaders(true, new Date());
+    
+    Date d = new Date(new Date().getTime() - 60 * 60 * 24 * 1000);
+    when(cacheStatus.getSyncStatus()).thenReturn(d);
+    
+    when(projectRepositoriesLoader.load(anyString(), anyBoolean(), any(MutableBoolean.class))).thenThrow(IllegalStateException.class);
+    synchronizer.load(PROJECT_KEY, false);
+    
+    verify(cacheStatus).getSyncStatus();
+    verifyNoMoreInteractions(cacheStatus);
+  }
+  
+  @Test
+  public void testForce() {
+    ProjectCacheSynchronizer synchronizer = createMockedLoaders(true, new Date());
+    
+    when(cacheStatus.getSyncStatus()).thenReturn(new Date());
+    synchronizer.load(PROJECT_KEY, true);
+
+    verify(cacheStatus).save();
+    verify(cacheStatus).getSyncStatus();
+  }
 }
index 41c5eda71cf07ec3a1ce718261f8ca9c8962c59e..052e33a43e2fbb037366ddf0c532f56d39dedc0e 100644 (file)
@@ -119,7 +119,7 @@ public class CacheSyncTest {
     tester.syncProject("test-project");
     assertThat(logOutput.getAsString()).contains("-- Found project [test-project]");
     assertThat(logOutput.getAsString()).contains("not found, synchronizing data");
-    assertThat(logOutput.getAsString()).contains("], synchronizing data..");
+    assertThat(logOutput.getAsString()).contains("], synchronizing data (forced)..");
   }
 
   @Test
index 152f17fc40204088f1ff81b49875044de7afaf6c..b58102cbf8c2afee98806e577ee6e1eb4f628f8a 100644 (file)
@@ -37,7 +37,7 @@ import javax.annotation.Nullable;
  * </pre>
  */
 public class PersistentCacheBuilder {
-  private static final long DEFAULT_EXPIRE_DURATION = TimeUnit.MILLISECONDS.convert(1L, TimeUnit.DAYS);
+  private static final long DEFAULT_EXPIRE_DURATION = TimeUnit.MILLISECONDS.convert(9999L, TimeUnit.DAYS);
   private static final String DIR_NAME = "ws_cache";
 
   private Path cacheBasePath;