diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2014-12-03 17:34:21 +0100 |
---|---|---|
committer | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2014-12-03 18:51:45 +0100 |
commit | 1c6c5ac69aed0f7dd35f5007105ed9ac6f1f568d (patch) | |
tree | 236386654e5787d1d04c4a714ef3ac78ff7c1fdb /server | |
parent | c1388e9acd68a7ea0544eaab7ece033c8715ef6c (diff) | |
download | sonarqube-1c6c5ac69aed0f7dd35f5007105ed9ac6f1f568d.tar.gz sonarqube-1c6c5ac69aed0f7dd35f5007105ed9ac6f1f568d.zip |
compute engine – move ProjectPurgeTask on the server side
Diffstat (limited to 'server')
6 files changed, 182 insertions, 7 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/DataCleanerStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/DataCleanerStep.java index 8636b0ae74c..bcb7b7f4454 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/DataCleanerStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/DataCleanerStep.java @@ -23,7 +23,7 @@ package org.sonar.server.computation; import org.sonar.api.config.Settings; import org.sonar.core.component.ComponentDto; import org.sonar.core.computation.db.AnalysisReportDto; -import org.sonar.core.computation.dbcleaner.ProjectPurgeTask; +import org.sonar.server.computation.dbcleaner.ProjectPurgeTask; import org.sonar.core.persistence.DbSession; import org.sonar.core.purge.PurgeConfiguration; import org.sonar.server.issue.index.IssueIndex; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/dbcleaner/ProjectPurgeTask.java b/server/sonar-server/src/main/java/org/sonar/server/computation/dbcleaner/ProjectPurgeTask.java new file mode 100644 index 00000000000..d6e13f36e37 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/dbcleaner/ProjectPurgeTask.java @@ -0,0 +1,84 @@ +/* + * 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.dbcleaner; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonar.api.CoreProperties; +import org.sonar.api.ServerComponent; +import org.sonar.api.config.Settings; +import org.sonar.api.utils.TimeUtils; +import org.sonar.server.computation.dbcleaner.period.DefaultPeriodCleaner; +import org.sonar.core.persistence.DbSession; +import org.sonar.core.purge.PurgeConfiguration; +import org.sonar.core.purge.PurgeDao; +import org.sonar.core.purge.PurgeProfiler; + +import java.util.List; + +public class ProjectPurgeTask implements ServerComponent { + private static final Logger LOG = LoggerFactory.getLogger(ProjectPurgeTask.class); + private final PurgeProfiler profiler; + private final PurgeDao purgeDao; + private final DefaultPeriodCleaner periodCleaner; + + public ProjectPurgeTask(PurgeDao purgeDao, DefaultPeriodCleaner periodCleaner, PurgeProfiler profiler) { + this.purgeDao = purgeDao; + this.periodCleaner = periodCleaner; + this.profiler = profiler; + } + + public ProjectPurgeTask purge(DbSession session, PurgeConfiguration configuration, Settings settings) { + long start = System.currentTimeMillis(); + profiler.reset(); + cleanHistoricalData(session, configuration.rootProjectId(), settings); + doPurge(session, configuration); + if (settings.getBoolean(CoreProperties.PROFILING_LOG_PROPERTY)) { + long duration = System.currentTimeMillis() - start; + LOG.info("\n -------- Profiling for purge: " + TimeUtils.formatDuration(duration) + " --------\n"); + profiler.dump(duration, LOG); + LOG.info("\n -------- End of profiling for purge --------\n"); + } + return this; + } + + private void cleanHistoricalData(DbSession session, long resourceId, Settings settings) { + try { + periodCleaner.clean(session, resourceId, settings); + } catch (Exception e) { + // purge errors must no fail the batch + LOG.error("Fail to clean historical data [id=" + resourceId + "]", e); + } + } + + private void doPurge(DbSession session, PurgeConfiguration configuration) { + try { + purgeDao.purge(session, configuration); + } catch (Exception e) { + // purge errors must no fail the report analysis + LOG.error("Fail to purge data [id=" + configuration.rootProjectId() + "]", e); + } + } + + public List<String> findUuidsToDisable(DbSession session, Long projectId) { + return purgeDao.selectPurgeableFiles(session, projectId); + } +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java index 922cdc96ae0..a68960db2eb 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java @@ -37,9 +37,9 @@ import org.sonar.api.utils.System2; import org.sonar.api.utils.UriReader; import org.sonar.api.utils.internal.TempFolderCleaner; import org.sonar.core.component.SnapshotPerspectives; -import org.sonar.core.computation.dbcleaner.DefaultPurgeTask; -import org.sonar.core.computation.dbcleaner.ProjectPurgeTask; -import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner; +import org.sonar.server.computation.dbcleaner.DefaultPurgeTask; +import org.sonar.server.computation.dbcleaner.ProjectPurgeTask; +import org.sonar.server.computation.dbcleaner.period.DefaultPeriodCleaner; import org.sonar.core.config.CorePropertyDefinitions; import org.sonar.core.config.Logback; import org.sonar.core.i18n.DefaultI18n; diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/DataCleanerStepMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/DataCleanerStepMediumTest.java index 7e6cfbefa71..512285c8911 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/DataCleanerStepMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/DataCleanerStepMediumTest.java @@ -29,8 +29,8 @@ import org.sonar.core.component.ComponentDto; import org.sonar.core.component.SnapshotDto; import org.sonar.core.computation.db.AnalysisReportDto; import org.sonar.core.computation.db.AnalysisReportDto.Status; -import org.sonar.core.computation.dbcleaner.DbCleanerConstants; -import org.sonar.core.computation.dbcleaner.ProjectPurgeTask; +import org.sonar.server.computation.dbcleaner.DbCleanerConstants; +import org.sonar.server.computation.dbcleaner.ProjectPurgeTask; import org.sonar.core.persistence.DbSession; import org.sonar.core.persistence.MyBatis; import org.sonar.core.properties.PropertyDto; diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/DataCleanerStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/DataCleanerStepTest.java index 3c6523d6d95..800b1f7ff47 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/DataCleanerStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/DataCleanerStepTest.java @@ -25,7 +25,7 @@ import org.junit.Test; import org.sonar.api.config.Settings; import org.sonar.core.component.ComponentDto; import org.sonar.core.computation.db.AnalysisReportDto; -import org.sonar.core.computation.dbcleaner.ProjectPurgeTask; +import org.sonar.server.computation.dbcleaner.ProjectPurgeTask; import org.sonar.core.persistence.DbSession; import org.sonar.core.purge.PurgeConfiguration; import org.sonar.server.issue.index.IssueIndex; diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/dbcleaner/ProjectPurgeTaskTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/dbcleaner/ProjectPurgeTaskTest.java new file mode 100644 index 00000000000..74cafe743f7 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/dbcleaner/ProjectPurgeTaskTest.java @@ -0,0 +1,91 @@ +/* + * 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.dbcleaner; + +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.sonar.api.CoreProperties; +import org.sonar.api.config.Settings; +import org.sonar.server.computation.dbcleaner.period.DefaultPeriodCleaner; +import org.sonar.core.persistence.DbSession; +import org.sonar.core.purge.PurgeConfiguration; +import org.sonar.core.purge.PurgeDao; +import org.sonar.core.purge.PurgeProfiler; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Mockito.*; + +public class ProjectPurgeTaskTest { + + private ProjectPurgeTask sut; + private PurgeDao dao; + private PurgeProfiler profiler; + private DefaultPeriodCleaner periodCleaner; + + @Before + public void before() throws Exception { + this.dao = mock(PurgeDao.class); + this.profiler = mock(PurgeProfiler.class); + this.periodCleaner = mock(DefaultPeriodCleaner.class); + + this.sut = new ProjectPurgeTask(dao, periodCleaner, profiler); + } + + @Test + public void no_profiling_when_property_is_false() throws Exception { + Settings settings = mock(Settings.class); + when(settings.getBoolean(CoreProperties.PROFILING_LOG_PROPERTY)).thenReturn(false); + + sut.purge(mock(DbSession.class), mock(PurgeConfiguration.class), settings); + + verify(profiler, never()).dump(anyLong(), any(Logger.class)); + } + + @Test + public void profiling_when_property_is_true() throws Exception { + Settings settings = mock(Settings.class); + when(settings.getBoolean(CoreProperties.PROFILING_LOG_PROPERTY)).thenReturn(true); + + sut.purge(mock(DbSession.class), mock(PurgeConfiguration.class), settings); + + verify(profiler, times(1)).dump(anyLong(), any(Logger.class)); + } + + @Test + public void if_dao_purge_fails_it_should_not_interrupt_program_execution() throws Exception { + doThrow(RuntimeException.class).when(dao).purge(any(DbSession.class), any(PurgeConfiguration.class)); + + sut.purge(mock(DbSession.class), mock(PurgeConfiguration.class), mock(Settings.class)); + + verify(dao, times(1)).purge(any(DbSession.class), any(PurgeConfiguration.class)); + } + + @Test + public void if_profiler_cleaning_fails_it_should_not_interrupt_program_execution() throws Exception { + doThrow(RuntimeException.class).when(periodCleaner).clean(any(DbSession.class), anyLong(), any(Settings.class)); + + sut.purge(mock(DbSession.class), mock(PurgeConfiguration.class), mock(Settings.class)); + + verify(periodCleaner, times(1)).clean(any(DbSession.class), anyLong(), any(Settings.class)); + } +} |