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;

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<String> logs = reportReader.readScannerLogs();
try {
while (logs.hasNext()) {
LOGGER.debug(logs.next());
try (CloseableIterator<String> 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";
}
}
Expand Up @@ -38,7 +38,6 @@ public class ReportComputationSteps extends AbstractComputationSteps {

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

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

UpdateQualityProfilesLastUsedDateStep.class,
Expand Down
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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();
}

}
Expand Up @@ -19,32 +19,46 @@
*/
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() {
reportReader.setScannerLogs(asList("log1", "log2"));

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
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() {
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.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;

Expand All @@ -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() {
Expand Down Expand Up @@ -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");
Expand All @@ -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<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> {
Expand Down

0 comments on commit 786a99c

Please sign in to comment.