gerrit/gerrit-server/BUCK
Shawn Pearce ed001d7f69 Limit number of reductions made by Prolog
Allow site administrators to place an upper bound on how much CPU
time will be spent evaluating rules for a single change. This covers
not just the project rules, but also all filters up to All-Projects.

Reduction counting and not wall-clock time is used to be fair to
rules that are running on a temporarily overloaded system. It also
permits builtin predicates that are expensive like commit_edits/2
to count only once per result made to Prolog, and not charge time
waiting for JGit to populate the PatchListCache.

The default is configured to be 100,000 reductions. This value was
experimentally determined on a Intel Core i7 running at 2.3 GHz and
Java 1.6.0_37. On that system reaching the limit of reductions and
aborting an infinite loop in a user predicate takes about 14 ms.

Any rules taking 14 ms to run will add ~350 ms to the latency of the
All > Open changes screen. Because of this, Administrators already
have sufficient incentives to keep rule running time low.

Change-Id: I2cd5660fc556e6aeeb61606a850ce45c98157c96
2014-12-18 04:35:28 +00:00

225 lines
5.2 KiB
Python

CONSTANTS_SRC = [
'src/main/java/com/google/gerrit/server/documentation/Constants.java',
]
SRCS = glob(
['src/main/java/**/*.java'],
excludes = CONSTANTS_SRC,
)
RESOURCES = glob(['src/main/resources/**/*'])
java_library(
name = 'constants',
srcs = CONSTANTS_SRC,
visibility = ['PUBLIC'],
)
# TODO(sop) break up gerrit-server java_library(), its too big
java_library(
name = 'server',
srcs = SRCS,
resources = RESOURCES,
deps = [
':constants',
'//gerrit-antlr:query_exception',
'//gerrit-antlr:query_parser',
'//gerrit-common:annotations',
'//gerrit-common:server',
'//gerrit-extension-api:api',
'//gerrit-patch-commonsnet:commons-net',
'//gerrit-patch-jgit:server',
'//gerrit-prettify:server',
'//gerrit-reviewdb:server',
'//gerrit-util-cli:cli',
'//gerrit-util-ssl:ssl',
'//lib:args4j',
'//lib:automaton',
'//lib:gson',
'//lib:guava',
'//lib:gwtjsonrpc',
'//lib:gwtorm',
'//lib:jsch',
'//lib:juniversalchardet',
'//lib:mime-util',
'//lib:parboiled-core',
'//lib:pegdown',
'//lib:protobuf',
'//lib:velocity',
'//lib/antlr:java_runtime',
'//lib/auto:auto-value',
'//lib/commons:codec',
'//lib/commons:dbcp',
'//lib/commons:lang',
'//lib/commons:net',
'//lib/commons:validator',
'//lib/guice:guice',
'//lib/guice:guice-assistedinject',
'//lib/guice:guice-servlet',
'//lib/jgit:jgit',
'//lib/jgit:jgit-archive',
'//lib/joda:joda-time',
'//lib/log:api',
'//lib/log:log4j',
'//lib/lucene:analyzers-common',
'//lib/lucene:core',
'//lib/lucene:query-parser',
'//lib/ow2:ow2-asm',
'//lib/ow2:ow2-asm-tree',
'//lib/ow2:ow2-asm-util',
'//lib/prolog:prolog-cafe',
],
provided_deps = [
'//lib:servlet-api-3_1',
'//lib/bouncycastle:bcprov',
'//lib/bouncycastle:bcpg',
'//lib/bouncycastle:bcpkix',
],
visibility = ['PUBLIC'],
)
java_sources(
name = 'server-src',
srcs = SRCS + RESOURCES,
visibility = ['PUBLIC'],
)
TESTUTIL = glob([
'src/test/java/com/google/gerrit/testutil/**/*.java',
'src/test/java/com/google/gerrit/server/project/Util.java',
])
java_library(
name = 'testutil',
srcs = TESTUTIL,
deps = [
':server',
'//gerrit-common:server',
'//gerrit-cache-h2:cache-h2',
'//gerrit-lucene:lucene',
'//gerrit-reviewdb:server',
'//lib:guava',
'//lib:gwtorm',
'//lib:h2',
'//lib:junit',
'//lib/guice:guice',
'//lib/guice:guice-servlet',
'//lib/jgit:jgit',
'//lib/jgit:junit',
'//lib/log:impl_log4j',
'//lib/log:log4j',
],
exported_deps = [
'//lib/easymock:easymock',
'//lib/powermock:powermock-api-easymock',
'//lib/powermock:powermock-api-support',
'//lib/powermock:powermock-core',
'//lib/powermock:powermock-module-junit4',
'//lib/powermock:powermock-module-junit4-common',
],
visibility = ['PUBLIC'],
)
PROLOG_TEST_CASE = [
'src/test/java/com/google/gerrit/rules/PrologTestCase.java',
]
PROLOG_TESTS = glob(
['src/test/java/com/google/gerrit/rules/**/*.java'],
excludes = PROLOG_TEST_CASE,
)
java_library(
name = 'prolog_test_case',
srcs = PROLOG_TEST_CASE,
deps = [
':server',
'//gerrit-common:server',
'//lib:junit',
'//lib/guice:guice',
'//lib/prolog:prolog-cafe',
],
)
java_test(
name = 'prolog_tests',
srcs = PROLOG_TESTS,
resources = glob(['src/test/resources/com/google/gerrit/rules/**/*']),
deps = [
':prolog_test_case',
':server',
':testutil',
'//gerrit-common:server',
'//gerrit-reviewdb:server',
'//gerrit-server/src/main/prolog:common',
'//lib:guava',
'//lib:gwtorm',
'//lib:junit',
'//lib:truth',
'//lib/jgit:jgit',
'//lib/guice:guice',
'//lib/prolog:prolog-cafe',
],
)
QUERY_TESTS = glob(
['src/test/java/com/google/gerrit/server/query/**/*.java'],
)
java_test(
name = 'query_tests',
srcs = QUERY_TESTS,
deps = [
':server',
':testutil',
'//gerrit-antlr:query_exception',
'//gerrit-antlr:query_parser',
'//gerrit-common:annotations',
'//gerrit-common:server',
'//gerrit-extension-api:api',
'//gerrit-reviewdb:server',
'//gerrit-server/src/main/prolog:common',
'//lib:guava',
'//lib:gwtorm',
'//lib:junit',
'//lib:truth',
'//lib/antlr:java_runtime',
'//lib/guice:guice',
'//lib/jgit:jgit',
'//lib/jgit:junit',
'//lib/joda:joda-time',
],
source_under_test = [':server'],
)
java_test(
name = 'server_tests',
labels = ['server'],
srcs = glob(
['src/test/java/**/*.java'],
excludes = TESTUTIL + PROLOG_TESTS + PROLOG_TEST_CASE + QUERY_TESTS
),
deps = [
':server',
':testutil',
'//gerrit-antlr:query_exception',
'//gerrit-common:annotations',
'//gerrit-common:server',
'//gerrit-extension-api:api',
'//gerrit-reviewdb:server',
'//gerrit-server/src/main/prolog:common',
'//lib:args4j',
'//lib:guava',
'//lib:gwtorm',
'//lib:junit',
'//lib:truth',
'//lib/guice:guice',
'//lib/guice:guice-assistedinject',
'//lib/jgit:jgit',
'//lib/jgit:junit',
'//lib/joda:joda-time',
'//lib:parboiled-core',
'//lib:parboiled-java',
'//lib/prolog:prolog-cafe',
],
source_under_test = [':server'],
visibility = ['//tools/eclipse:classpath'],
)