} 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");
}
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;
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;
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();
}
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);
}
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();
+ }
}
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
* </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;