Skip to content

Commit b8a9f4a

Browse files
joke1196sonartech
authored andcommitted
SONARPY-3287: Introduce alias boolean property 'sonar.python.analysis.parallel' (#487)
GitOrigin-RevId: 95190c61590396607aa6085ccf8b95315f8952f0
1 parent 528fb18 commit b8a9f4a

2 files changed

Lines changed: 37 additions & 12 deletions

File tree

python-commons/src/main/java/org/sonar/plugins/python/Scanner.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
public abstract class Scanner {
3333
private static final Logger LOG = LoggerFactory.getLogger(Scanner.class);
3434
private static final String FAIL_FAST_PROPERTY_NAME = "sonar.internal.analysis.failFast";
35+
private static final int MAX_NUMBER_OF_THREADS = 6;
3536
public static final String THREADS_PROPERTY_NAME = "sonar.python.analysis.threads";
37+
public static final String PARALLEL_PROPERTY_NAME = "sonar.python.analysis.parallel";
3638
protected final SensorContext context;
3739

3840
protected Scanner(SensorContext context) {
@@ -65,8 +67,7 @@ protected void processFiles(List<PythonInputFile> files, SensorContext context,
6567
var allTasks = CompletableFuture.allOf(
6668
files.stream()
6769
.map(file -> CompletableFuture.runAsync(() -> processFile(context, file, progressReport, numScannedWithoutParsing), executor))
68-
.toArray(CompletableFuture[]::new)
69-
);
70+
.toArray(CompletableFuture[]::new));
7071
allTasks.join();
7172
} catch (CompletionException e) {
7273
var cause = e.getCause();
@@ -143,15 +144,18 @@ private static boolean isParseErrorOnTestFile(PythonInputFile file, Exception e)
143144
}
144145

145146
protected int getNumberOfThreads(SensorContext context) {
146-
int minNumOfThreads = 1;
147-
int maxNumOfThreads = 6;
148-
int availableProcessors = (int) Math.round(Runtime.getRuntime().availableProcessors() * 0.9);
149-
150-
// Disabling parallelization if threads property is not setup properly
151-
return context.config()
152-
.getInt(THREADS_PROPERTY_NAME)
153-
.map(threads -> threads < 1 ? 1 : threads)
154-
.orElse(Math.max(minNumOfThreads, Math.min(availableProcessors, maxNumOfThreads)));
147+
boolean isParallelizationEnabled = context.config().getBoolean(PARALLEL_PROPERTY_NAME).orElse(true);
148+
if (isParallelizationEnabled) {
149+
int minNumOfThreads = 1;
150+
int availableProcessors = (int) Math.round(Runtime.getRuntime().availableProcessors() * 0.9);
151+
152+
// Disabling parallelization if threads property is not setup properly
153+
return context.config()
154+
.getInt(THREADS_PROPERTY_NAME)
155+
.map(threads -> threads < 1 ? 1 : threads)
156+
.orElse(Math.max(minNumOfThreads, Math.min(availableProcessors, MAX_NUMBER_OF_THREADS)));
157+
}
158+
return 1;
155159
}
156160

157161
}

python-commons/src/test/java/org/sonar/plugins/python/ScannerTest.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ void setUp() {
7474
@Test
7575
void testGetNumberOfThreads_whenPropertySetToValidValue_shouldReturnConfiguredValue() {
7676
when(configuration.getInt("sonar.python.analysis.threads")).thenReturn(Optional.of(4));
77-
7877
int numberOfThreads = scanner.getNumberOfThreads(context);
7978
assertThat(numberOfThreads).isEqualTo(4);
8079
}
@@ -87,4 +86,26 @@ void testGetNumberOfThreads_whenPropertySetIncorrectly_shouldReturnOne(int threa
8786
int numberOfThreads = scanner.getNumberOfThreads(context);
8887
assertThat(numberOfThreads).isEqualTo(1);
8988
}
89+
90+
@Test
91+
void testGetNumberOfThreads_whenParallelPropertyIsFalse_shouldReturnOne() {
92+
when(configuration.getInt("sonar.python.analysis.threads")).thenReturn(Optional.of(4));
93+
when(configuration.getBoolean("sonar.python.analysis.parallel")).thenReturn(Optional.of(false));
94+
95+
int numberOfThreads = scanner.getNumberOfThreads(context);
96+
assertThat(numberOfThreads).isEqualTo(1);
97+
}
98+
99+
@Test
100+
void testGetNumberOfThreads_whenParallelPropertyIsTrueOrNotSet_shouldReturnConfiguredValue() {
101+
when(configuration.getInt("sonar.python.analysis.threads")).thenReturn(Optional.of(4));
102+
when(configuration.getBoolean("sonar.python.analysis.parallel")).thenReturn(Optional.empty());
103+
int numberOfThreads = scanner.getNumberOfThreads(context);
104+
assertThat(numberOfThreads).isEqualTo(4);
105+
106+
when(configuration.getBoolean("sonar.python.analysis.parallel")).thenReturn(Optional.of(true));
107+
numberOfThreads = scanner.getNumberOfThreads(context);
108+
assertThat(numberOfThreads).isEqualTo(4);
109+
110+
}
90111
}

0 commit comments

Comments
 (0)