Merge branch 'stable-2.15' into stable-2.16
* stable-2.15: ReceiveCommits: Fix comparison to ensure correct log message Set sshd.threads to at least 4. Add assertThrows method compatible with future JUnit 4.13 ReceiveCommits: Bypass commit count when skip-validation is used Update git submodules Update git submodules Update git submodules Update git submodules Update git submodules Update git submodules Change-Id: Iea0dc2d5f28c0c8e0489e7ce2bb429064ce7aca3
This commit is contained in:
@@ -4441,7 +4441,8 @@ Number of threads to use when executing SSH command requests.
|
|||||||
If additional requests are received while all threads are busy they
|
If additional requests are received while all threads are busy they
|
||||||
are queued and serviced in a first-come-first-served order.
|
are queued and serviced in a first-come-first-served order.
|
||||||
+
|
+
|
||||||
By default, 2x the number of CPUs available to the JVM.
|
By default, 2x the number of CPUs available to the JVM (but at least 4
|
||||||
|
threads).
|
||||||
+
|
+
|
||||||
[NOTE]
|
[NOTE]
|
||||||
When SSH daemon is enabled then this setting also defines the max number of
|
When SSH daemon is enabled then this setting also defines the max number of
|
||||||
|
@@ -28,7 +28,7 @@ public class ThreadSettingsConfig {
|
|||||||
@Inject
|
@Inject
|
||||||
ThreadSettingsConfig(@GerritServerConfig Config cfg) {
|
ThreadSettingsConfig(@GerritServerConfig Config cfg) {
|
||||||
int cores = Runtime.getRuntime().availableProcessors();
|
int cores = Runtime.getRuntime().availableProcessors();
|
||||||
sshdThreads = cfg.getInt("sshd", "threads", 2 * cores);
|
sshdThreads = cfg.getInt("sshd", "threads", Math.max(4, 2 * cores));
|
||||||
httpdMaxThreads = cfg.getInt("httpd", "maxThreads", 25);
|
httpdMaxThreads = cfg.getInt("httpd", "maxThreads", 25);
|
||||||
int defaultDatabasePoolLimit = sshdThreads + httpdMaxThreads + 2;
|
int defaultDatabasePoolLimit = sshdThreads + httpdMaxThreads + 2;
|
||||||
databasePoolLimit = cfg.getInt("database", "poolLimit", defaultDatabasePoolLimit);
|
databasePoolLimit = cfg.getInt("database", "poolLimit", defaultDatabasePoolLimit);
|
||||||
|
@@ -3048,6 +3048,9 @@ class ReceiveCommits {
|
|||||||
int limit = receiveConfig.maxBatchCommits;
|
int limit = receiveConfig.maxBatchCommits;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
for (RevCommit c; (c = walk.next()) != null; ) {
|
for (RevCommit c; (c = walk.next()) != null; ) {
|
||||||
|
// Even if skipValidation is set, we still get here when at least one plugin
|
||||||
|
// commit validator requires to validate all commits. In this case, however,
|
||||||
|
// we don't need to check the commit limit.
|
||||||
if (++n > limit && !skipValidation) {
|
if (++n > limit && !skipValidation) {
|
||||||
logger.atFine().log("Number of new commits exceeds limit of %d", limit);
|
logger.atFine().log("Number of new commits exceeds limit of %d", limit);
|
||||||
reject(
|
reject(
|
||||||
|
67
java/com/google/gerrit/testing/GerritJUnit.java
Normal file
67
java/com/google/gerrit/testing/GerritJUnit.java
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
// Copyright (C) 2019 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.testing;
|
||||||
|
|
||||||
|
/** Static JUnit utility methods. */
|
||||||
|
public class GerritJUnit {
|
||||||
|
/**
|
||||||
|
* Assert that an exception is thrown by a block of code.
|
||||||
|
*
|
||||||
|
* <p>This method is source-compatible with <a
|
||||||
|
* href="https://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThrows(java.lang.Class,%20org.junit.function.ThrowingRunnable)">JUnit
|
||||||
|
* 4.13 beta</a>.
|
||||||
|
*
|
||||||
|
* <p>This construction is recommended by the Truth team for use in conjunction with asserting
|
||||||
|
* over a {@code ThrowableSubject} on the return type:
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* MyException e = assertThrows(MyException.class, () -> doSomething(foo));
|
||||||
|
* assertThat(e).isInstanceOf(MySubException.class);
|
||||||
|
* assertThat(e).hasMessageThat().contains("sub-exception occurred");
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @param throwableClass expected exception type.
|
||||||
|
* @param runnable runnable containing arbitrary code.
|
||||||
|
* @return exception that was thrown.
|
||||||
|
*/
|
||||||
|
public static <T extends Throwable> T assertThrows(
|
||||||
|
Class<T> throwableClass, ThrowingRunnable runnable) {
|
||||||
|
try {
|
||||||
|
runnable.run();
|
||||||
|
} catch (Throwable t) {
|
||||||
|
if (!throwableClass.isInstance(t)) {
|
||||||
|
throw new AssertionError(
|
||||||
|
"expected "
|
||||||
|
+ throwableClass.getName()
|
||||||
|
+ " but "
|
||||||
|
+ t.getClass().getName()
|
||||||
|
+ " was thrown",
|
||||||
|
t);
|
||||||
|
}
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
T toReturn = (T) t;
|
||||||
|
return toReturn;
|
||||||
|
}
|
||||||
|
throw new AssertionError(
|
||||||
|
"expected " + throwableClass.getName() + " but no exception was thrown");
|
||||||
|
}
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface ThrowingRunnable {
|
||||||
|
void run() throws Throwable;
|
||||||
|
}
|
||||||
|
|
||||||
|
private GerritJUnit() {}
|
||||||
|
}
|
90
java/com/google/gerrit/testing/GerritJUnitTest.java
Normal file
90
java/com/google/gerrit/testing/GerritJUnitTest.java
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
// Copyright (C) 2019 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.testing;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static com.google.common.truth.Truth.assert_;
|
||||||
|
import static com.google.gerrit.testing.GerritJUnit.assertThrows;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class GerritJUnitTest {
|
||||||
|
private static class MyException extends Exception {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
MyException(String msg) {
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class MySubException extends MyException {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
MySubException(String msg) {
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void assertThrowsCatchesSpecifiedExceptionType() {
|
||||||
|
MyException e =
|
||||||
|
assertThrows(
|
||||||
|
MyException.class,
|
||||||
|
() -> {
|
||||||
|
throw new MyException("foo");
|
||||||
|
});
|
||||||
|
assertThat(e).hasMessageThat().isEqualTo("foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void assertThrowsCatchesSubclassOfSpecifiedExceptionType() {
|
||||||
|
MyException e =
|
||||||
|
assertThrows(
|
||||||
|
MyException.class,
|
||||||
|
() -> {
|
||||||
|
throw new MySubException("foo");
|
||||||
|
});
|
||||||
|
assertThat(e).isInstanceOf(MySubException.class);
|
||||||
|
assertThat(e).hasMessageThat().isEqualTo("foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void assertThrowsConvertsUnexpectedExceptionTypeToAssertionError() {
|
||||||
|
try {
|
||||||
|
assertThrows(
|
||||||
|
IllegalStateException.class,
|
||||||
|
() -> {
|
||||||
|
throw new MyException("foo");
|
||||||
|
});
|
||||||
|
assert_().fail("expected AssertionError");
|
||||||
|
} catch (AssertionError e) {
|
||||||
|
assertThat(e).hasMessageThat().contains(IllegalStateException.class.getSimpleName());
|
||||||
|
assertThat(e).hasMessageThat().contains(MyException.class.getSimpleName());
|
||||||
|
assertThat(e).hasCauseThat().isInstanceOf(MyException.class);
|
||||||
|
assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("foo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void assertThrowsThrowsAssertionErrorWhenNothingThrown() {
|
||||||
|
try {
|
||||||
|
assertThrows(MyException.class, () -> {});
|
||||||
|
assert_().fail("expected AssertionError");
|
||||||
|
} catch (AssertionError e) {
|
||||||
|
assertThat(e).hasMessageThat().contains(MyException.class.getSimpleName());
|
||||||
|
assertThat(e).hasCauseThat().isNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -2252,6 +2252,34 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
|
|||||||
@GerritConfig(name = "receive.maxBatchCommits", value = "2")
|
@GerritConfig(name = "receive.maxBatchCommits", value = "2")
|
||||||
@Test
|
@Test
|
||||||
public void maxBatchCommits() throws Exception {
|
public void maxBatchCommits() throws Exception {
|
||||||
|
testMaxBatchCommits();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GerritConfig(name = "receive.maxBatchCommits", value = "2")
|
||||||
|
@Test
|
||||||
|
public void maxBatchCommitsWithDefaultValidator() throws Exception {
|
||||||
|
TestValidator validator = new TestValidator();
|
||||||
|
RegistrationHandle handle = commitValidators.add("test-validator", validator);
|
||||||
|
try {
|
||||||
|
testMaxBatchCommits();
|
||||||
|
} finally {
|
||||||
|
handle.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GerritConfig(name = "receive.maxBatchCommits", value = "2")
|
||||||
|
@Test
|
||||||
|
public void maxBatchCommitsWithValidateAllCommitsValidator() throws Exception {
|
||||||
|
TestValidator validator = new TestValidator(true);
|
||||||
|
RegistrationHandle handle = commitValidators.add("test-validator", validator);
|
||||||
|
try {
|
||||||
|
testMaxBatchCommits();
|
||||||
|
} finally {
|
||||||
|
handle.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testMaxBatchCommits() throws Exception {
|
||||||
List<RevCommit> commits = new ArrayList<>();
|
List<RevCommit> commits = new ArrayList<>();
|
||||||
commits.addAll(initChanges(2));
|
commits.addAll(initChanges(2));
|
||||||
String master = "refs/heads/master";
|
String master = "refs/heads/master";
|
||||||
|
Submodule plugins/replication updated: a3cf8a6198...423547441a
Reference in New Issue
Block a user