diff --git a/extensions-core/druid-bloom-filter/src/test/java/org/apache/druid/query/aggregation/bloom/sql/BloomFilterSqlAggregatorTest.java b/extensions-core/druid-bloom-filter/src/test/java/org/apache/druid/query/aggregation/bloom/sql/BloomFilterSqlAggregatorTest.java
index ceb8c42a83c4..ad4f90acf6f1 100644
--- a/extensions-core/druid-bloom-filter/src/test/java/org/apache/druid/query/aggregation/bloom/sql/BloomFilterSqlAggregatorTest.java
+++ b/extensions-core/druid-bloom-filter/src/test/java/org/apache/druid/query/aggregation/bloom/sql/BloomFilterSqlAggregatorTest.java
@@ -54,7 +54,7 @@
import org.apache.druid.query.expression.TestExprMacroTable;
import org.apache.druid.query.extraction.SubstringDimExtractionFn;
import org.apache.druid.query.filter.BloomKFilter;
-import org.apache.druid.query.lookup.LookupReferencesManager;
+import org.apache.druid.query.lookup.LookupExtractorFactoryContainerProvider;
import org.apache.druid.query.spec.MultipleIntervalSegmentSpec;
import org.apache.druid.segment.IndexBuilder;
import org.apache.druid.segment.QueryableIndex;
@@ -99,7 +99,7 @@ public class BloomFilterSqlAggregatorTest
private static final Injector injector = Guice.createInjector(
binder -> {
binder.bind(Key.get(ObjectMapper.class, Json.class)).toInstance(TestHelper.makeJsonMapper());
- binder.bind(LookupReferencesManager.class).toInstance(
+ binder.bind(LookupExtractorFactoryContainerProvider.class).toInstance(
LookupEnabledTestExprMacroTable.createTestLookupReferencesManager(
ImmutableMap.of(
"a", "xa",
diff --git a/extensions-core/druid-bloom-filter/src/test/java/org/apache/druid/query/filter/sql/BloomDimFilterSqlTest.java b/extensions-core/druid-bloom-filter/src/test/java/org/apache/druid/query/filter/sql/BloomDimFilterSqlTest.java
index c8243dc29abe..be32f01b78f6 100644
--- a/extensions-core/druid-bloom-filter/src/test/java/org/apache/druid/query/filter/sql/BloomDimFilterSqlTest.java
+++ b/extensions-core/druid-bloom-filter/src/test/java/org/apache/druid/query/filter/sql/BloomDimFilterSqlTest.java
@@ -44,7 +44,7 @@
import org.apache.druid.query.filter.BloomKFilterHolder;
import org.apache.druid.query.filter.ExpressionDimFilter;
import org.apache.druid.query.filter.OrDimFilter;
-import org.apache.druid.query.lookup.LookupReferencesManager;
+import org.apache.druid.query.lookup.LookupExtractorFactoryContainerProvider;
import org.apache.druid.segment.TestHelper;
import org.apache.druid.segment.column.ValueType;
import org.apache.druid.server.security.AuthenticationResult;
@@ -67,7 +67,7 @@ public class BloomDimFilterSqlTest extends BaseCalciteQueryTest
private static final Injector injector = Guice.createInjector(
binder -> {
binder.bind(Key.get(ObjectMapper.class, Json.class)).toInstance(TestHelper.makeJsonMapper());
- binder.bind(LookupReferencesManager.class).toInstance(
+ binder.bind(LookupExtractorFactoryContainerProvider.class).toInstance(
LookupEnabledTestExprMacroTable.createTestLookupReferencesManager(
ImmutableMap.of(
"a", "xa",
diff --git a/integration-tests/docker/broker.conf b/integration-tests/docker/broker.conf
index 39b8a7f94d41..f075558afcf2 100644
--- a/integration-tests/docker/broker.conf
+++ b/integration-tests/docker/broker.conf
@@ -5,21 +5,19 @@ command=java
-Xms512m
-XX:NewSize=256m
-XX:MaxNewSize=256m
- -XX:+UseConcMarkSweepGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
+ -XX:+UseG1GC
-Duser.timezone=UTC
-Dfile.encoding=UTF-8
-Ddruid.host=%(ENV_HOST_IP)s
-Ddruid.zk.service.host=druid-zookeeper-kafka
-Ddruid.processing.buffer.sizeBytes=25000000
- -Ddruid.server.http.numThreads=100
+ -Ddruid.server.http.numThreads=40
-Ddruid.processing.numThreads=1
- -Ddruid.broker.http.numConnections=30
+ -Ddruid.broker.http.numConnections=20
-Ddruid.broker.http.readTimeout=PT5M
-Ddruid.broker.cache.useCache=true
-Ddruid.broker.cache.populateCache=true
- -Ddruid.cache.type=local
+ -Ddruid.lookup.namespace.cache.type=onHeap
-Ddruid.cache.sizeInBytes=40000000
-Ddruid.lookup.numLookupLoadingThreads=1
-Ddruid.auth.authenticatorChain="[\"basic\"]"
@@ -63,3 +61,4 @@ redirect_stderr=true
autorestart=false
priority=100
stdout_logfile=/shared/logs/broker.log
+environment=AWS_REGION=us-east-1
diff --git a/integration-tests/docker/coordinator.conf b/integration-tests/docker/coordinator.conf
index e05c924e9473..e92f2d5068e4 100644
--- a/integration-tests/docker/coordinator.conf
+++ b/integration-tests/docker/coordinator.conf
@@ -3,13 +3,11 @@ command=java
-server
-Xmx128m
-Xms128m
- -XX:+UseConcMarkSweepGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
+ -XX:+UseG1GC
-Duser.timezone=UTC
-Dfile.encoding=UTF-8
-Ddruid.host=%(ENV_HOST_IP)s
- -Ddruid.server.http.numThreads=100
+ -Ddruid.server.http.numThreads=20
-Ddruid.metadata.storage.type=mysql
-Ddruid.metadata.storage.connector.connectURI=jdbc:mysql://druid-metadata-storage/druid
-Ddruid.metadata.storage.connector.user=druid
@@ -17,6 +15,9 @@ command=java
-Ddruid.zk.service.host=druid-zookeeper-kafka
-Ddruid.coordinator.startDelay=PT5S
-Ddruid.lookup.numLookupLoadingThreads=1
+ -Ddruid.manager.lookups.hostUpdateTimeout=PT30S
+ -Ddruid.manager.lookups.period=10000
+ -Ddruid.manager.lookups.threadPoolSize=2
-Ddruid.auth.authenticatorChain="[\"basic\"]"
-Ddruid.auth.authenticator.basic.type=basic
-Ddruid.auth.authenticator.basic.initialAdminPassword=priest
@@ -57,3 +58,4 @@ redirect_stderr=true
priority=100
autorestart=false
stdout_logfile=/shared/logs/coordinator.log
+environment=AWS_REGION=us-east-1
diff --git a/integration-tests/docker/historical.conf b/integration-tests/docker/historical.conf
index 335b8c3901e4..964e75561431 100644
--- a/integration-tests/docker/historical.conf
+++ b/integration-tests/docker/historical.conf
@@ -5,9 +5,7 @@ command=java
-Xms512m
-XX:NewSize=256m
-XX:MaxNewSize=256m
- -XX:+UseConcMarkSweepGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
+ -XX:+UseG1GC
-Duser.timezone=UTC
-Dfile.encoding=UTF-8
-Ddruid.host=%(ENV_HOST_IP)s
@@ -16,7 +14,7 @@ command=java
-Ddruid.s3.secretKey=OBaLISDFjKLajSTrJ53JoTtzTZLjPlRePcwa+Pjv
-Ddruid.processing.buffer.sizeBytes=25000000
-Ddruid.processing.numThreads=2
- -Ddruid.server.http.numThreads=100
+ -Ddruid.server.http.numThreads=20
-Ddruid.segmentCache.locations="[{\"path\":\"/shared/druid/indexCache\",\"maxSize\":5000000000}]"
-Ddruid.server.maxSize=5000000000
-Ddruid.lookup.numLookupLoadingThreads=1
diff --git a/integration-tests/docker/middlemanager.conf b/integration-tests/docker/middlemanager.conf
index 40adf19339b6..35cfbb18c02d 100644
--- a/integration-tests/docker/middlemanager.conf
+++ b/integration-tests/docker/middlemanager.conf
@@ -3,9 +3,7 @@ command=java
-server
-Xmx64m
-Xms64m
- -XX:+UseConcMarkSweepGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
+ -XX:+UseG1GC
-Duser.timezone=UTC
-Dfile.encoding=UTF-8
-Ddruid.host=%(ENV_HOST_IP)s
@@ -14,10 +12,10 @@ command=java
-Ddruid.worker.capacity=3
-Ddruid.indexer.logs.directory=/shared/tasklogs
-Ddruid.storage.storageDirectory=/shared/storage
- -Ddruid.indexer.runner.javaOpts="-server -Xmx256m -Xms256m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Dlog4j.configurationFile=/shared/docker/lib/log4j2.xml"
+ -Ddruid.indexer.runner.javaOpts="-server -Xmx256m -Xms256m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Dlog4j.configurationFile=/shared/docker/lib/log4j2.xml"
-Ddruid.indexer.fork.property.druid.processing.buffer.sizeBytes=25000000
-Ddruid.indexer.fork.property.druid.processing.numThreads=1
- -Ddruid.indexer.fork.server.http.numThreads=100
+ -Ddruid.indexer.fork.server.http.numThreads=20
-Ddruid.s3.accessKey=AKIAJI7DG7CDECGBQ6NA
-Ddruid.s3.secretKey=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
-Ddruid.worker.ip=%(ENV_HOST_IP)s
diff --git a/integration-tests/docker/overlord.conf b/integration-tests/docker/overlord.conf
index 77514b1c253c..5af40d6a8e75 100644
--- a/integration-tests/docker/overlord.conf
+++ b/integration-tests/docker/overlord.conf
@@ -3,13 +3,11 @@ command=java
-server
-Xmx128m
-Xms128m
- -XX:+UseConcMarkSweepGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
+ -XX:+UseG1GC
-Duser.timezone=UTC
-Dfile.encoding=UTF-8
-Ddruid.host=%(ENV_HOST_IP)s
- -Ddruid.server.http.numThreads=100
+ -Ddruid.server.http.numThreads=20
-Ddruid.metadata.storage.type=mysql
-Ddruid.metadata.storage.connector.connectURI=jdbc:mysql://druid-metadata-storage/druid
-Ddruid.metadata.storage.connector.user=druid
@@ -58,3 +56,4 @@ redirect_stderr=true
priority=100
autorestart=false
stdout_logfile=/shared/logs/overlord.log
+environment=AWS_REGION=us-east-1
\ No newline at end of file
diff --git a/integration-tests/docker/router.conf b/integration-tests/docker/router.conf
index 29bb6b52385e..98a7a97222c0 100644
--- a/integration-tests/docker/router.conf
+++ b/integration-tests/docker/router.conf
@@ -2,14 +2,12 @@
command=java
-server
-Xmx128m
- -XX:+UseConcMarkSweepGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
+ -XX:+UseG1GC
-Duser.timezone=UTC
-Dfile.encoding=UTF-8
-Ddruid.host=%(ENV_HOST_IP)s
-Ddruid.zk.service.host=druid-zookeeper-kafka
- -Ddruid.server.http.numThreads=100
+ -Ddruid.server.http.numThreads=20
-Ddruid.lookup.numLookupLoadingThreads=1
-Ddruid.auth.authenticatorChain="[\"basic\"]"
-Ddruid.auth.authenticator.basic.type=basic
@@ -52,3 +50,4 @@ redirect_stderr=true
priority=100
autorestart=false
stdout_logfile=/shared/logs/router.log
+environment=AWS_REGION=us-east-1
diff --git a/integration-tests/docker/wiki-simple-lookup.json b/integration-tests/docker/wiki-simple-lookup.json
new file mode 100644
index 000000000000..a3de9b1ea9de
--- /dev/null
+++ b/integration-tests/docker/wiki-simple-lookup.json
@@ -0,0 +1 @@
+{"Wikipedia:Vandalismusmeldung":"lookup!"}
\ No newline at end of file
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 6159021d9e6b..91209cea646a 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -77,6 +77,11 @@
druid-basic-security
${project.parent.version}
+
+ org.apache.druid.extensions
+ druid-lookups-cached-global
+ ${project.parent.version}
+
org.apache.druid.extensions
simple-client-sslcontext
diff --git a/integration-tests/run_cluster.sh b/integration-tests/run_cluster.sh
index 49d046ac6b97..25078eb44c8c 100755
--- a/integration-tests/run_cluster.sh
+++ b/integration-tests/run_cluster.sh
@@ -56,6 +56,7 @@ cp target/druid-integration-tests*.jar $SHARED_DIR/docker/lib
# one of the integration tests needs the wikiticker sample data
mkdir -p $SHARED_DIR/wikiticker-it
cp ../examples/quickstart/tutorial/wikiticker-2015-09-12-sampled.json.gz $SHARED_DIR/wikiticker-it/wikiticker-2015-09-12-sampled.json.gz
+cp docker/wiki-simple-lookup.json $SHARED_DIR/wikiticker-it/wiki-simple-lookup.json
docker network create --subnet=172.172.172.0/24 druid-it-net
diff --git a/integration-tests/src/main/java/org/apache/druid/testing/clients/CoordinatorResourceTestClient.java b/integration-tests/src/main/java/org/apache/druid/testing/clients/CoordinatorResourceTestClient.java
index 6974b44a35f4..babb9e3ead3d 100644
--- a/integration-tests/src/main/java/org/apache/druid/testing/clients/CoordinatorResourceTestClient.java
+++ b/integration-tests/src/main/java/org/apache/druid/testing/clients/CoordinatorResourceTestClient.java
@@ -21,6 +21,8 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.net.HostAndPort;
import com.google.inject.Inject;
import org.apache.druid.java.util.common.ISE;
import org.apache.druid.java.util.common.RE;
@@ -29,6 +31,8 @@
import org.apache.druid.java.util.http.client.Request;
import org.apache.druid.java.util.http.client.response.StatusResponseHandler;
import org.apache.druid.java.util.http.client.response.StatusResponseHolder;
+import org.apache.druid.query.lookup.LookupsState;
+import org.apache.druid.server.lookup.cache.LookupExtractorFactoryMapContainer;
import org.apache.druid.testing.IntegrationTestingConfig;
import org.apache.druid.testing.guice.TestClient;
import org.apache.druid.timeline.DataSegment;
@@ -218,6 +222,90 @@ public HttpResponseStatus getProxiedOverlordScalingResponseStatus()
}
}
+ public Map initializeLookups(String filePath) throws Exception
+ {
+ String url = StringUtils.format("%slookups/config", getCoordinatorURL());
+ StatusResponseHolder response = httpClient.go(
+ new Request(HttpMethod.POST, new URL(url)).setContent(
+ "application/json",
+ jsonMapper.writeValueAsBytes(ImmutableMap.of())
+ ), responseHandler
+ ).get();
+
+ if (!response.getStatus().equals(HttpResponseStatus.ACCEPTED)) {
+ throw new ISE(
+ "Error while querying[%s] status[%s] content[%s]",
+ url,
+ response.getStatus(),
+ response.getContent()
+ );
+ }
+
+ Map results = jsonMapper.readValue(
+ response.getContent(),
+ new TypeReference