@ServerSide | @ServerSide | ||||
@ComputeEngineSide | @ComputeEngineSide | ||||
public class ProjectCleaner { | public class ProjectCleaner { | ||||
private static final Logger LOG = Loggers.get(ProjectCleaner.class); | |||||
private final PurgeProfiler profiler; | private final PurgeProfiler profiler; | ||||
private final PurgeListener purgeListener; | private final PurgeListener purgeListener; | ||||
private final PurgeDao purgeDao; | private final PurgeDao purgeDao; | ||||
} | } | ||||
public ProjectCleaner purge(DbSession session, String rootUuid, String projectUuid, Configuration projectConfig, Set<String> disabledComponentUuids) { | public ProjectCleaner purge(DbSession session, String rootUuid, String projectUuid, Configuration projectConfig, Set<String> disabledComponentUuids) { | ||||
long start = System.currentTimeMillis(); | |||||
profiler.reset(); | profiler.reset(); | ||||
periodCleaner.clean(session, rootUuid, projectConfig); | periodCleaner.clean(session, rootUuid, projectConfig); | ||||
purgeDao.purge(session, configuration, purgeListener, profiler); | purgeDao.purge(session, configuration, purgeListener, profiler); | ||||
session.commit(); | session.commit(); | ||||
logProfiling(start, projectConfig); | |||||
return this; | return this; | ||||
} | } | ||||
private void logProfiling(long start, Configuration config) { | |||||
if (config.getBoolean(CoreProperties.PROFILING_LOG_PROPERTY).orElse(false)) { | |||||
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"); | |||||
} | |||||
} | |||||
} | } |
package org.sonar.ce.task.projectanalysis.purge; | package org.sonar.ce.task.projectanalysis.purge; | ||||
import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; | import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; | ||||
import org.sonar.ce.task.projectanalysis.component.Component; | |||||
import org.sonar.ce.task.projectanalysis.component.ConfigurationRepository; | import org.sonar.ce.task.projectanalysis.component.ConfigurationRepository; | ||||
import org.sonar.ce.task.projectanalysis.component.DepthTraversalTypeAwareCrawler; | |||||
import org.sonar.ce.task.projectanalysis.component.DisabledComponentsHolder; | import org.sonar.ce.task.projectanalysis.component.DisabledComponentsHolder; | ||||
import org.sonar.ce.task.projectanalysis.component.TreeRootHolder; | import org.sonar.ce.task.projectanalysis.component.TreeRootHolder; | ||||
import org.sonar.ce.task.projectanalysis.component.TypeAwareVisitorAdapter; | |||||
import org.sonar.ce.task.step.ComputationStep; | import org.sonar.ce.task.step.ComputationStep; | ||||
import org.sonar.db.DbClient; | import org.sonar.db.DbClient; | ||||
import org.sonar.db.DbSession; | import org.sonar.db.DbSession; | ||||
import static org.sonar.ce.task.projectanalysis.component.Component.Type.PROJECT; | |||||
import static org.sonar.ce.task.projectanalysis.component.Component.Type.VIEW; | |||||
import static org.sonar.ce.task.projectanalysis.component.ComponentVisitor.Order.PRE_ORDER; | |||||
import static org.sonar.ce.task.projectanalysis.component.CrawlerDepthLimit.reportMaxDepth; | |||||
public class PurgeDatastoresStep implements ComputationStep { | public class PurgeDatastoresStep implements ComputationStep { | ||||
private final ProjectCleaner projectCleaner; | private final ProjectCleaner projectCleaner; | ||||
@Override | @Override | ||||
public void execute(ComputationStep.Context context) { | public void execute(ComputationStep.Context context) { | ||||
new DepthTraversalTypeAwareCrawler( | |||||
new TypeAwareVisitorAdapter(reportMaxDepth(PROJECT).withViewsMaxDepth(VIEW), PRE_ORDER) { | |||||
@Override | |||||
public void visitProject(Component project) { | |||||
execute(project); | |||||
} | |||||
@Override | |||||
public void visitView(Component view) { | |||||
execute(view); | |||||
} | |||||
}).visit(treeRootHolder.getRoot()); | |||||
} | |||||
private void execute(Component root) { | |||||
try (DbSession dbSession = dbClient.openSession(true)) { | try (DbSession dbSession = dbClient.openSession(true)) { | ||||
// applies to views and projects | |||||
String projectUuid = analysisMetadataHolder.getProject().getUuid(); | String projectUuid = analysisMetadataHolder.getProject().getUuid(); | ||||
projectCleaner.purge(dbSession, root.getUuid(), projectUuid, configRepository.getConfiguration(), disabledComponentsHolder.getUuids()); | |||||
projectCleaner.purge(dbSession, treeRootHolder.getRoot().getUuid(), projectUuid, configRepository.getConfiguration(), disabledComponentsHolder.getUuids()); | |||||
dbSession.commit(); | dbSession.commit(); | ||||
} | } | ||||
} | } |
this.underTest = new ProjectCleaner(dao, periodCleaner, profiler, purgeListener); | this.underTest = new ProjectCleaner(dao, periodCleaner, profiler, purgeListener); | ||||
} | } | ||||
@Test | |||||
public void no_profiling_when_property_is_false() { | |||||
settings.setProperty(CoreProperties.PROFILING_LOG_PROPERTY, false); | |||||
underTest.purge(mock(DbSession.class), "root", "project", settings.asConfig(), emptySet()); | |||||
verify(profiler, never()).dump(anyLong(), any()); | |||||
} | |||||
@Test | |||||
public void profiling_when_property_is_true() { | |||||
settings.setProperty(CoreProperties.PROFILING_LOG_PROPERTY, true); | |||||
underTest.purge(mock(DbSession.class), "root", "project", settings.asConfig(), emptySet()); | |||||
verify(profiler).dump(anyLong(), any()); | |||||
} | |||||
@Test | @Test | ||||
public void call_period_cleaner_index_client_and_purge_dao() { | public void call_period_cleaner_index_client_and_purge_dao() { | ||||
settings.setProperty(PurgeConstants.DAYS_BEFORE_DELETING_CLOSED_ISSUES, 5); | settings.setProperty(PurgeConstants.DAYS_BEFORE_DELETING_CLOSED_ISSUES, 5); |
@Deprecated | @Deprecated | ||||
String SCAN_TASK = "scan"; | String SCAN_TASK = "scan"; | ||||
/** | |||||
* @since 3.6 | |||||
*/ | |||||
// TODO remove? | |||||
String PROFILING_LOG_PROPERTY = "sonar.showProfiling"; | |||||
/** | /** | ||||
* @since 4.0 | * @since 4.0 | ||||
*/ | */ |