Skip to content

Commit

Permalink
SONAR-7844 persist scanner context in DB instead of logging it
Browse files Browse the repository at this point in the history
  • Loading branch information
sns-seb committed Aug 22, 2016
1 parent e9ac521 commit 786a99c
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 30 deletions.
Expand Up @@ -19,36 +19,38 @@
*/ */
package org.sonar.server.computation.task.projectanalysis.step; 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.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.projectanalysis.batch.BatchReportReader;
import org.sonar.server.computation.task.step.ComputationStep; import org.sonar.server.computation.task.step.ComputationStep;


public class LogScannerContextStep implements ComputationStep { public class PersistScannerContextStep implements ComputationStep {

private static final Logger LOGGER = Loggers.get(LogScannerContextStep.class);

private final BatchReportReader reportReader; 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.reportReader = reportReader;
this.analysisMetadataHolder = analysisMetadataHolder;
this.dbClient = dbClient;
} }


@Override @Override
public void execute() { public void execute() {
CloseableIterator<String> logs = reportReader.readScannerLogs(); try (CloseableIterator<String> logsIterator = reportReader.readScannerLogs()) {
try { if (logsIterator.hasNext()) {
while (logs.hasNext()) { try (DbSession dbSession = dbClient.openSession(false)) {
LOGGER.debug(logs.next()); dbClient.scannerContextDao().insert(dbSession, analysisMetadataHolder.getUuid(), logsIterator);
dbSession.commit();
}
} }
} finally {
logs.close();
} }
} }


@Override @Override
public String getDescription() { public String getDescription() {
return "Log scanner context"; return "Persist scanner context";
} }
} }
Expand Up @@ -38,7 +38,6 @@ public class ReportComputationSteps extends AbstractComputationSteps {


private static final List<Class<? extends ComputationStep>> STEPS = Arrays.asList( private static final List<Class<? extends ComputationStep>> STEPS = Arrays.asList(
ExtractReportStep.class, ExtractReportStep.class,
LogScannerContextStep.class,
GenerateAnalysisUuid.class, GenerateAnalysisUuid.class,


// Builds Component tree // Builds Component tree
Expand Down Expand Up @@ -97,6 +96,7 @@ public class ReportComputationSteps extends AbstractComputationSteps {
PersistFileSourcesStep.class, PersistFileSourcesStep.class,
PersistTestsStep.class, PersistTestsStep.class,
PersistCrossProjectDuplicationIndexStep.class, PersistCrossProjectDuplicationIndexStep.class,
PersistScannerContextStep.class,
EnableAnalysisStep.class, EnableAnalysisStep.class,


UpdateQualityProfilesLastUsedDateStep.class, UpdateQualityProfilesLastUsedDateStep.class,
Expand Down
Expand Up @@ -24,6 +24,7 @@
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import org.sonar.api.utils.System2; import org.sonar.api.utils.System2;
import org.sonar.core.util.CloseableIterator;
import org.sonar.core.util.Protobuf; import org.sonar.core.util.Protobuf;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.ce.CeActivityDto; import org.sonar.db.ce.CeActivityDto;
Expand All @@ -39,6 +40,7 @@
import org.sonarqube.ws.MediaTypes; import org.sonarqube.ws.MediaTypes;
import org.sonarqube.ws.WsCe; import org.sonarqube.ws.WsCe;


import static java.util.Collections.singleton;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.core.permission.GlobalPermissions.PROVISIONING; import static org.sonar.core.permission.GlobalPermissions.PROVISIONING;
import static org.sonar.core.permission.GlobalPermissions.SCAN_EXECUTION; import static org.sonar.core.permission.GlobalPermissions.SCAN_EXECUTION;
Expand Down Expand Up @@ -293,9 +295,15 @@ private void persist(CeQueueDto queueDto) {
dbTester.commit(); dbTester.commit();
} }


private void persist(CeActivityDto activityDto) { private CeActivityDto persist(CeActivityDto activityDto) {
dbTester.getDbClient().ceActivityDao().insert(dbTester.getSession(), activityDto); dbTester.getDbClient().ceActivityDao().insert(dbTester.getSession(), activityDto);
dbTester.commit(); 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();
} }


} }
Expand Up @@ -19,32 +19,46 @@
*/ */
package org.sonar.server.computation.task.projectanalysis.step; package org.sonar.server.computation.task.projectanalysis.step;


import org.junit.ClassRule;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.sonar.api.utils.log.LogTester; import org.sonar.api.utils.System2;
import org.sonar.api.utils.log.LoggerLevel; 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 org.sonar.server.computation.task.projectanalysis.batch.BatchReportReaderRule;


import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat; 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 @Rule
public BatchReportReaderRule reportReader = new BatchReportReaderRule(); public BatchReportReaderRule reportReader = new BatchReportReaderRule();

@Rule @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 @Test
public void log_scanner_logs() { public void log_scanner_logs() {
reportReader.setScannerLogs(asList("log1", "log2")); reportReader.setScannerLogs(asList("log1", "log2"));


underTest.execute(); underTest.execute();


assertThat(logTester.logs(LoggerLevel.DEBUG)).containsExactly("log1", "log2"); assertThat(dbClient.scannerContextDao().selectScannerContext(dbTester.getSession(), ANALYSIS_UUID))
.contains("log1" + '\n' + "log2");
} }


} }
Expand Up @@ -52,7 +52,7 @@ public void populateContainer(TaskContainer container) {
@Test @Test
public void instances_throws_ISE_if_container_does_not_have_second_step() throws Exception { public void instances_throws_ISE_if_container_does_not_have_second_step() throws Exception {
expectedException.expect(IllegalStateException.class); 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); final ExtractReportStep reportExtractionStep = mock(ExtractReportStep.class);
ComponentContainer componentContainer = new ComponentContainer() { ComponentContainer componentContainer = new ComponentContainer() {
Expand Down
21 changes: 15 additions & 6 deletions sonar-db/src/test/java/org/sonar/db/ce/CeActivityDaoTest.java
Expand Up @@ -22,13 +22,14 @@
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.sonar.api.utils.internal.TestSystem2; 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.DbSession;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;


Expand All @@ -42,13 +43,13 @@ public class CeActivityDaoTest {


private static final String AN_ANALYSIS_UUID = "U1"; 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 @Rule
public DbTester db = DbTester.create(system2); 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 @Test
public void test_insert() { public void test_insert() {
Expand Down Expand Up @@ -330,7 +331,7 @@ private CeActivityDto createActivityDto(String uuid, String type, String compone
return dto; return dto;
} }


private void insertWithCreationDate(String uuid, long date) { private CeActivityDto insertWithCreationDate(String uuid, long date) {
CeQueueDto queueDto = new CeQueueDto(); CeQueueDto queueDto = new CeQueueDto();
queueDto.setUuid(uuid); queueDto.setUuid(uuid);
queueDto.setTaskType("fake"); queueDto.setTaskType("fake");
Expand All @@ -339,10 +340,18 @@ private void insertWithCreationDate(String uuid, long date) {
dto.setStatus(CeActivityDto.Status.SUCCESS); dto.setStatus(CeActivityDto.Status.SUCCESS);
system2.setNow(date); system2.setNow(date);
underTest.insert(db.getSession(), dto); 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<String> selectPageOfUuids(int offset, int pageSize) { private List<String> 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<CeActivityDto, String> { private enum CeActivityToUuid implements Function<CeActivityDto, String> {
Expand Down

0 comments on commit 786a99c

Please sign in to comment.