From 786a99c5e17606169f2a9c2784582f367d9084ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Lesaint?= Date: Wed, 17 Aug 2016 17:39:39 +0200 Subject: [PATCH] SONAR-7844 persist scanner context in DB instead of logging it --- ...ep.java => PersistScannerContextStep.java} | 30 ++++++++++--------- .../step/ReportComputationSteps.java | 2 +- .../sonar/server/ce/ws/TaskActionTest.java | 10 ++++++- ...ava => PersistScannerContextStepTest.java} | 28 ++++++++++++----- .../step/ReportComputationStepsTest.java | 2 +- .../org/sonar/db/ce/CeActivityDaoTest.java | 21 +++++++++---- 6 files changed, 63 insertions(+), 30 deletions(-) rename server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/{LogScannerContextStep.java => PersistScannerContextStep.java} (58%) rename server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/{LogScannerContextStepTest.java => PersistScannerContextStepTest.java} (58%) diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LogScannerContextStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistScannerContextStep.java similarity index 58% rename from server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LogScannerContextStep.java rename to server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistScannerContextStep.java index 868107ffe7cf..5a49cff1e884 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LogScannerContextStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistScannerContextStep.java @@ -19,36 +19,38 @@ */ package org.sonar.server.computation.task.projectanalysis.step; -import org.sonar.api.utils.log.Logger; -import org.sonar.api.utils.log.Loggers; import org.sonar.core.util.CloseableIterator; +import org.sonar.db.DbClient; +import org.sonar.db.DbSession; +import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder; import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReader; import org.sonar.server.computation.task.step.ComputationStep; -public class LogScannerContextStep implements ComputationStep { - - private static final Logger LOGGER = Loggers.get(LogScannerContextStep.class); - +public class PersistScannerContextStep implements ComputationStep { private final BatchReportReader reportReader; + private final AnalysisMetadataHolder analysisMetadataHolder; + private final DbClient dbClient; - public LogScannerContextStep(BatchReportReader reportReader) { + public PersistScannerContextStep(BatchReportReader reportReader, AnalysisMetadataHolder analysisMetadataHolder, DbClient dbClient) { this.reportReader = reportReader; + this.analysisMetadataHolder = analysisMetadataHolder; + this.dbClient = dbClient; } @Override public void execute() { - CloseableIterator logs = reportReader.readScannerLogs(); - try { - while (logs.hasNext()) { - LOGGER.debug(logs.next()); + try (CloseableIterator logsIterator = reportReader.readScannerLogs()) { + if (logsIterator.hasNext()) { + try (DbSession dbSession = dbClient.openSession(false)) { + dbClient.scannerContextDao().insert(dbSession, analysisMetadataHolder.getUuid(), logsIterator); + dbSession.commit(); + } } - } finally { - logs.close(); } } @Override public String getDescription() { - return "Log scanner context"; + return "Persist scanner context"; } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ReportComputationSteps.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ReportComputationSteps.java index 6c244f5d007b..217d4cc45058 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ReportComputationSteps.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ReportComputationSteps.java @@ -38,7 +38,6 @@ public class ReportComputationSteps extends AbstractComputationSteps { private static final List> STEPS = Arrays.asList( ExtractReportStep.class, - LogScannerContextStep.class, GenerateAnalysisUuid.class, // Builds Component tree @@ -97,6 +96,7 @@ public class ReportComputationSteps extends AbstractComputationSteps { PersistFileSourcesStep.class, PersistTestsStep.class, PersistCrossProjectDuplicationIndexStep.class, + PersistScannerContextStep.class, EnableAnalysisStep.class, UpdateQualityProfilesLastUsedDateStep.class, diff --git a/server/sonar-server/src/test/java/org/sonar/server/ce/ws/TaskActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/ce/ws/TaskActionTest.java index 7ed877581dcd..5a9e1893a739 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/ce/ws/TaskActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/ce/ws/TaskActionTest.java @@ -24,6 +24,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.api.utils.System2; +import org.sonar.core.util.CloseableIterator; import org.sonar.core.util.Protobuf; import org.sonar.db.DbTester; import org.sonar.db.ce.CeActivityDto; @@ -39,6 +40,7 @@ import org.sonarqube.ws.MediaTypes; import org.sonarqube.ws.WsCe; +import static java.util.Collections.singleton; import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.core.permission.GlobalPermissions.PROVISIONING; import static org.sonar.core.permission.GlobalPermissions.SCAN_EXECUTION; @@ -293,9 +295,15 @@ private void persist(CeQueueDto queueDto) { dbTester.commit(); } - private void persist(CeActivityDto activityDto) { + private CeActivityDto persist(CeActivityDto activityDto) { dbTester.getDbClient().ceActivityDao().insert(dbTester.getSession(), activityDto); dbTester.commit(); + return activityDto; + } + + private void persistScannerContext(String analysisUuid, String scannerContext) { + dbTester.getDbClient().scannerContextDao().insert(dbTester.getSession(), analysisUuid, CloseableIterator.from(singleton(scannerContext).iterator())); + dbTester.commit(); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LogScannerContextStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistScannerContextStepTest.java similarity index 58% rename from server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LogScannerContextStepTest.java rename to server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistScannerContextStepTest.java index 9627e664b171..0dafc1374999 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LogScannerContextStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistScannerContextStepTest.java @@ -19,24 +19,37 @@ */ package org.sonar.server.computation.task.projectanalysis.step; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; -import org.sonar.api.utils.log.LogTester; -import org.sonar.api.utils.log.LoggerLevel; +import org.sonar.api.utils.System2; +import org.sonar.db.DbClient; +import org.sonar.db.DbTester; +import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderRule; import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReaderRule; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; -public class LogScannerContextStepTest { +public class PersistScannerContextStepTest { + private static final String ANALYSIS_UUID = "UUID"; + + @ClassRule + public static final DbTester dbTester = DbTester.create(System2.INSTANCE); @Rule public BatchReportReaderRule reportReader = new BatchReportReaderRule(); - @Rule - public LogTester logTester = new LogTester(); + public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule() + .setUuid(ANALYSIS_UUID); + + private DbClient dbClient = dbTester.getDbClient(); + private PersistScannerContextStep underTest = new PersistScannerContextStep(reportReader, analysisMetadataHolder, dbClient); - LogScannerContextStep underTest = new LogScannerContextStep(reportReader); + @Test + public void getDescription() { + assertThat(underTest.getDescription()).isEqualTo("Persist scanner context"); + } @Test public void log_scanner_logs() { @@ -44,7 +57,8 @@ public void log_scanner_logs() { underTest.execute(); - assertThat(logTester.logs(LoggerLevel.DEBUG)).containsExactly("log1", "log2"); + assertThat(dbClient.scannerContextDao().selectScannerContext(dbTester.getSession(), ANALYSIS_UUID)) + .contains("log1" + '\n' + "log2"); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ReportComputationStepsTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ReportComputationStepsTest.java index da6a95418fbf..f8ff545f980e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ReportComputationStepsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ReportComputationStepsTest.java @@ -52,7 +52,7 @@ public void populateContainer(TaskContainer container) { @Test public void instances_throws_ISE_if_container_does_not_have_second_step() throws Exception { expectedException.expect(IllegalStateException.class); - expectedException.expectMessage("Component not found: class org.sonar.server.computation.task.projectanalysis.step.LogScannerContextStep"); + expectedException.expectMessage("Component not found: class org.sonar.server.computation.task.projectanalysis.step.GenerateAnalysisUuid"); final ExtractReportStep reportExtractionStep = mock(ExtractReportStep.class); ComponentContainer componentContainer = new ComponentContainer() { diff --git a/sonar-db/src/test/java/org/sonar/db/ce/CeActivityDaoTest.java b/sonar-db/src/test/java/org/sonar/db/ce/CeActivityDaoTest.java index 885d9b11ed2c..fed7575080f6 100644 --- a/sonar-db/src/test/java/org/sonar/db/ce/CeActivityDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/ce/CeActivityDaoTest.java @@ -22,13 +22,14 @@ import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Strings; -import com.google.common.collect.FluentIterable; import java.util.Collections; import java.util.List; import javax.annotation.Nonnull; import org.junit.Rule; import org.junit.Test; import org.sonar.api.utils.internal.TestSystem2; +import org.sonar.core.util.CloseableIterator; +import org.sonar.core.util.stream.Collectors; import org.sonar.db.DbSession; import org.sonar.db.DbTester; @@ -42,13 +43,13 @@ public class CeActivityDaoTest { private static final String AN_ANALYSIS_UUID = "U1"; - TestSystem2 system2 = new TestSystem2().setNow(1_450_000_000_000L); + private TestSystem2 system2 = new TestSystem2().setNow(1_450_000_000_000L); @Rule public DbTester db = DbTester.create(system2); - DbSession dbSession = db.getSession(); - CeActivityDao underTest = new CeActivityDao(system2); + private DbSession dbSession = db.getSession(); + private CeActivityDao underTest = new CeActivityDao(system2); @Test public void test_insert() { @@ -330,7 +331,7 @@ private CeActivityDto createActivityDto(String uuid, String type, String compone return dto; } - private void insertWithCreationDate(String uuid, long date) { + private CeActivityDto insertWithCreationDate(String uuid, long date) { CeQueueDto queueDto = new CeQueueDto(); queueDto.setUuid(uuid); queueDto.setTaskType("fake"); @@ -339,10 +340,18 @@ private void insertWithCreationDate(String uuid, long date) { dto.setStatus(CeActivityDto.Status.SUCCESS); system2.setNow(date); underTest.insert(db.getSession(), dto); + return dto; + } + + private void insertScannerContext(String analysisUuid) { + db.getDbClient().scannerContextDao().insert(dbSession, analysisUuid, CloseableIterator.from(singletonList("scanner context of " + analysisUuid).iterator())); + dbSession.commit(); } private List selectPageOfUuids(int offset, int pageSize) { - return FluentIterable.from(underTest.selectByQuery(db.getSession(), new CeTaskQuery(), offset, pageSize)).transform(CeActivityToUuid.INSTANCE).toList(); + return underTest.selectByQuery(db.getSession(), new CeTaskQuery(), offset, pageSize).stream() + .map(CeActivityToUuid.INSTANCE::apply) + .collect(Collectors.toList()); } private enum CeActivityToUuid implements Function {