diff --git a/.github/labeler.yml b/.github/labeler.yml index b669a83dc5be..a9bfc45a86ec 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -18,9 +18,50 @@ # # -# Pull Request Labeler Github Action Configuration: https://github.com/marketplace/actions/labeler +# Pull Request Labeler GitHub Action Configuration: https://github.com/marketplace/actions/labeler -"Area - Documentation": - - "docs/**/*" - - "website/**" - - "examples/quickstart/jupyter-notebooks/**" \ No newline at end of file +'Area - Batch Ingestion': + - 'indexing-hadoop/**' + - 'extensions-core/multi-stage-query/**' + +'Area - Dependencies': + - '**/pom.xml' + - 'licenses.yaml' + +'Area - Documentation': + - 'docs/**/*' + - 'website/**' + - 'examples/quickstart/jupyter-notebooks/**' + +'Area - Ingestion': + - 'indexing-service/**' + +'Area - Lookups': + - 'extensions-core/lookups-cached-global/**' + - 'extensions-core/lookups-cached-single/**' + - 'extensions-core/kafka-extraction-namespace/**' + +'Area - Metrics/Event Emitting': + - 'processing/src/main/java/org/apache/druid/java/util/metrics/**' + - 'processing/src/main/java/org/apache/druid/java/util/emitter/**' + - 'extensions-contrib/*-emitter/**' + +'Area - MSQ': + - 'extensions-core/multi-stage-query/**' + +'Area - Querying': + - 'sql/**' + - 'extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/**' + +'Area - Segment Format and Ser/De': + - 'processing/src/main/java/org/apache/druid/segment/**' + +'Area - Streaming Ingestion': + - 'extensions-core/kafka-indexing-service/**' + - 'extensions-core/kinesis-indexing-service/**' + +'Area - Web Console': + - 'web-console/**' + +'Kubernetes': + - 'extensions-contrib/kubernetes-overlord-extensions/**' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 4e13d31de0a8..262d7ad80f85 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -29,6 +29,12 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '8' + cache: 'maven' + # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v2 @@ -42,7 +48,6 @@ jobs: # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs queries: +security-and-quality - - run: | echo "Building using custom commands" mvn clean package -f "pom.xml" -B -V -e -Dfindbugs.skip -Dcheckstyle.skip -Dpmd.skip=true -Denforcer.skip -Dmaven.javadoc.skip -DskipTests -Dmaven.test.skip.exec -Dlicense.skip=true -Dweb.console.skip=true -Dcyclonedx.skip=true diff --git a/.github/workflows/cron-job-its.yml b/.github/workflows/cron-job-its.yml index 65471ad81b05..0a5c2f45ce24 100644 --- a/.github/workflows/cron-job-its.yml +++ b/.github/workflows/cron-job-its.yml @@ -34,8 +34,11 @@ jobs: - name: Checkout branch uses: actions/checkout@v3 - - name: Setup java - run: export JAVA_HOME=$JAVA_HOME_8_X64 + - name: setup java + uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'zulu' - name: Cache Maven m2 repository id: maven diff --git a/.github/workflows/reusable-revised-its.yml b/.github/workflows/reusable-revised-its.yml index 49887db14c59..60b5261b3038 100644 --- a/.github/workflows/reusable-revised-its.yml +++ b/.github/workflows/reusable-revised-its.yml @@ -77,9 +77,11 @@ jobs: - name: Checkout branch uses: actions/checkout@v3 - - name: Setup java - run: | - echo "JAVA_HOME=$JAVA_HOME_${{ inputs.build_jdk }}_X64" >> $GITHUB_ENV + - name: setup java + uses: actions/setup-java@v3 + with: + java-version: ${{ inputs.build_jdk }} + distribution: 'zulu' - name: Restore Maven repository id: maven-restore @@ -132,4 +134,37 @@ jobs: docker images - name: Run IT + id: run-it run: ${{ inputs.script }} + + - name: Collect docker logs on failure + if: ${{ failure() && steps.run-it.conclusion == 'failure' }} + run: | + mkdir docker-logs + for c in $(docker ps -a --format="{{.Names}}") + do + docker logs $c > ./docker-logs/$c.log + done + + - name: Tar docker logs + if: ${{ failure() && steps.run-it.conclusion == 'failure' }} + run: tar cvzf ./docker-logs.tgz ./docker-logs + + - name: Upload docker logs to GitHub + if: ${{ failure() && steps.run-it.conclusion == 'failure' }} + uses: actions/upload-artifact@master + with: + name: IT-${{ inputs.it }} docker logs (Compile=jdk${{ inputs.build_jdk }}, Run=jdk${{ inputs.runtime_jdk }}, Indexer=${{ inputs.use_indexer }}, Mysql=${{ inputs.mysql_driver }}) + path: docker-logs.tgz + + - name: Collect service logs on failure + if: ${{ failure() && steps.run-it.conclusion == 'failure' }} + run: | + tar cvzf ./service-logs.tgz integration-tests-ex/cases/target/${{ inputs.it }}/logs + + - name: Upload Druid service logs to GitHub + if: ${{ failure() && steps.run-it.conclusion == 'failure' }} + uses: actions/upload-artifact@master + with: + name: IT-${{ inputs.it }} service logs (Compile=jdk${{ inputs.build_jdk }}, Run=jdk${{ inputs.runtime_jdk }}, Indexer=${{ inputs.use_indexer }}, Mysql=${{ inputs.mysql_driver }}) + path: service-logs.tgz diff --git a/.github/workflows/reusable-standard-its.yml b/.github/workflows/reusable-standard-its.yml index d4b0de1c0cfd..821ecd625863 100644 --- a/.github/workflows/reusable-standard-its.yml +++ b/.github/workflows/reusable-standard-its.yml @@ -62,9 +62,11 @@ jobs: - name: Checkout branch uses: actions/checkout@v3 - - name: Setup java - run: | - echo "JAVA_HOME=$JAVA_HOME_${{ inputs.runtime_jdk }}_X64" >> $GITHUB_ENV + - name: setup java + uses: actions/setup-java@v3 + with: + java-version: ${{ inputs.runtime_jdk }} + distribution: 'zulu' - name: Restore Maven repository id: maven-restore @@ -88,13 +90,34 @@ jobs: echo "${MVN} verify -pl integration-tests -P integration-tests ${{ inputs.testing_groups }} -Djvm.runtime=${{ inputs.runtime_jdk }} -Dit.indexer=${{ inputs.use_indexer }} ${MAVEN_SKIP} -Doverride.config.path=${{ inputs.override_config_path }}" ${MVN} verify -pl integration-tests -P integration-tests ${{ inputs.testing_groups }} -Djvm.runtime=${{ inputs.runtime_jdk }} -Dit.indexer=${{ inputs.use_indexer }} ${MAVEN_SKIP} -Doverride.config.path=${{ inputs.override_config_path }} - - name: Debug IT + - name: Collect docker logs on failure if: ${{ failure() && steps.run-it.conclusion == 'failure' }} run: | - for v in broker router ${{ inputs.use_indexer }} historical coordinator overlord; do - echo "=======================druid-"$v"========================"; - echo "-----------------------docker logs-----------------------"; - sudo docker logs druid-"$v" 2>&1 | tail -1000 ||:; - echo "-----------------------service logs----------------------"; - sudo docker exec druid-"$v" tail -1000 /shared/logs/"$v".log 2>&1 ||:; + mkdir docker-logs + for c in $(docker ps -a --format="{{.Names}}") + do + docker logs $c > ./docker-logs/$c.log done + + - name: Tar docker logs + if: ${{ failure() && steps.run-it.conclusion == 'failure' }} + run: tar cvzf ./docker-logs.tgz ./docker-logs + + - name: Upload docker logs to GitHub + if: ${{ failure() && steps.run-it.conclusion == 'failure' }} + uses: actions/upload-artifact@master + with: + name: IT-${{ inputs.group }} docker logs (Compile=jdk${{ inputs.build_jdk }}, Run=jdk${{ inputs.runtime_jdk }}, Indexer=${{ inputs.use_indexer }}, Mysql=${{ inputs.mysql_driver }}) + path: docker-logs.tgz + + - name: Collect service logs on failure + if: ${{ failure() && steps.run-it.conclusion == 'failure' }} + run: | + tar cvzf ./service-logs.tgz ~/shared/logs + + - name: Upload Druid service logs to GitHub + if: ${{ failure() && steps.run-it.conclusion == 'failure' }} + uses: actions/upload-artifact@master + with: + name: IT-${{ inputs.group }} service logs (Compile=jdk${{ inputs.build_jdk }}, Run=jdk${{ inputs.runtime_jdk }}, Indexer=${{ inputs.use_indexer }}, Mysql=${{ inputs.mysql_driver }}) + path: service-logs.tgz diff --git a/.github/workflows/reusable-unit-tests.yml b/.github/workflows/reusable-unit-tests.yml index 34d992c397c2..06a48362c404 100644 --- a/.github/workflows/reusable-unit-tests.yml +++ b/.github/workflows/reusable-unit-tests.yml @@ -59,9 +59,15 @@ jobs: with: fetch-depth: 0 - - name: setup jdk${{ inputs.jdk }} - run: echo "JAVA_HOME=$JAVA_HOME_${{ inputs.jdk }}_X64" >> $GITHUB_ENV + # skip the "cache: maven" step from setup-java. We explicitly use a + # different cache key since we cannot reuse it across commits. + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: ${{ inputs.jdk }} + # the build step produces SNAPSHOT artifacts into the local maven repository, + # we include github.sha in the cache key to make it specific to that build/jdk - name: Restore Maven repository id: maven-restore uses: actions/cache/restore@v3 diff --git a/.github/workflows/standard-its.yml b/.github/workflows/standard-its.yml index f44dee04bdf8..b10351986468 100644 --- a/.github/workflows/standard-its.yml +++ b/.github/workflows/standard-its.yml @@ -77,7 +77,7 @@ jobs: strategy: fail-fast: false matrix: - testing_group: [query, query-retry, query-error, security, high-availability] + testing_group: [query, query-retry, query-error, security, high-availability, centralized-table-schema] uses: ./.github/workflows/reusable-standard-its.yml if: ${{ needs.changes.outputs.core == 'true' || needs.changes.outputs.common-extensions == 'true' }} with: @@ -93,7 +93,7 @@ jobs: strategy: fail-fast: false matrix: - jdk: [8, 17] + jdk: [8, 17, 21] uses: ./.github/workflows/reusable-standard-its.yml if: ${{ needs.changes.outputs.core == 'true' || needs.changes.outputs.common-extensions == 'true' }} with: @@ -150,15 +150,21 @@ jobs: - name: Checkout branch uses: actions/checkout@v3 - - name: Setup java - run: export JAVA_HOME=$JAVA_HOME_8_X64 + - name: setup java + uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'zulu' + # the build step produces SNAPSHOT artifacts into the local maven repository, + # we include github.sha in the cache key to make it specific to that build/jdk - name: Restore Maven repository id: maven-restore uses: actions/cache/restore@v3 with: path: ~/.m2/repository key: maven-${{ runner.os }}-8-${{ github.sha }} + restore-keys: setup-java-Linux-maven-${{ hashFiles('**/pom.xml') }} - name: Maven build if: steps.maven-restore.outputs.cache-hit != 'true' @@ -189,6 +195,6 @@ jobs: with: build_jdk: 8 runtime_jdk: 8 - testing_groups: -DexcludedGroups=batch-index,input-format,input-source,perfect-rollup-parallel-batch-index,kafka-index,query,query-retry,query-error,realtime-index,security,ldap-security,s3-deep-storage,gcs-deep-storage,azure-deep-storage,hdfs-deep-storage,s3-ingestion,kinesis-index,kinesis-data-format,kafka-transactional-index,kafka-index-slow,kafka-transactional-index-slow,kafka-data-format,hadoop-s3-to-s3-deep-storage,hadoop-s3-to-hdfs-deep-storage,hadoop-azure-to-azure-deep-storage,hadoop-azure-to-hdfs-deep-storage,hadoop-gcs-to-gcs-deep-storage,hadoop-gcs-to-hdfs-deep-storage,aliyun-oss-deep-storage,append-ingestion,compaction,high-availability,upgrade,shuffle-deep-store,custom-coordinator-duties + testing_groups: -DexcludedGroups=batch-index,input-format,input-source,perfect-rollup-parallel-batch-index,kafka-index,query,query-retry,query-error,realtime-index,security,ldap-security,s3-deep-storage,gcs-deep-storage,azure-deep-storage,hdfs-deep-storage,s3-ingestion,kinesis-index,kinesis-data-format,kafka-transactional-index,kafka-index-slow,kafka-transactional-index-slow,kafka-data-format,hadoop-s3-to-s3-deep-storage,hadoop-s3-to-hdfs-deep-storage,hadoop-azure-to-azure-deep-storage,hadoop-azure-to-hdfs-deep-storage,hadoop-gcs-to-gcs-deep-storage,hadoop-gcs-to-hdfs-deep-storage,aliyun-oss-deep-storage,append-ingestion,compaction,high-availability,upgrade,shuffle-deep-store,custom-coordinator-duties,centralized-table-schema use_indexer: ${{ matrix.indexer }} group: other diff --git a/.github/workflows/static-checks.yml b/.github/workflows/static-checks.yml index 0140b37cada4..49cd516f5cae 100644 --- a/.github/workflows/static-checks.yml +++ b/.github/workflows/static-checks.yml @@ -41,20 +41,17 @@ jobs: strategy: fail-fast: false matrix: - java: [ 'jdk8', 'jdk11', 'jdk17' ] + java: [ '8', '11', '17', '21' ] runs-on: ubuntu-latest steps: - name: checkout branch uses: actions/checkout@v3 - - name: set java version - run: | - export jdk=${{ matrix.java }} - echo "java_version=${jdk:3}" >> $GITHUB_ENV - - - name: setup ${{ matrix.java }} - run: | - echo "JAVA_HOME=$JAVA_HOME_${{ env.java_version }}_X64" >> $GITHUB_ENV + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: ${{ matrix.java }} + cache: 'maven' - name: packaging check run: | @@ -66,53 +63,53 @@ jobs: - name: script checks # who watches the watchers? - if: ${{ matrix.java == 'jdk8' }} + if: ${{ matrix.java == '8' }} run: ./check_test_suite_test.py - name: (openjdk17) strict compilation - if: ${{ matrix.java == 'jdk17' }} + if: ${{ matrix.java == '17' }} # errorprone requires JDK 11+ # Strict compilation requires more than 2 GB run: ${MVN} clean -DstrictCompile compile test-compile --fail-at-end ${MAVEN_SKIP} ${MAVEN_SKIP_TESTS} - name: maven install - if: ${{ matrix.java == 'jdk8' }} + if: ${{ matrix.java == '8' }} run: | echo 'Running Maven install...' && ${MVN} clean install -q -ff -pl '!distribution,!:druid-it-image,!:druid-it-cases' ${MAVEN_SKIP} ${MAVEN_SKIP_TESTS} -T1C && ${MVN} install -q -ff -pl 'distribution' ${MAVEN_SKIP} ${MAVEN_SKIP_TESTS} - name: checkstyle - if: ${{ matrix.java == 'jdk8' }} + if: ${{ matrix.java == '8' }} run: ${MVN} checkstyle:checkstyle --fail-at-end - name: license checks - if: ${{ matrix.java == 'jdk8' }} + if: ${{ matrix.java == '8' }} run: ./.github/scripts/license_checks_script.sh - name: analyze dependencies - if: ${{ matrix.java == 'jdk8' }} + if: ${{ matrix.java == '8' }} run: | ./.github/scripts/analyze_dependencies_script.sh - name: animal sniffer checks - if: ${{ matrix.java == 'jdk8' }} + if: ${{ matrix.java == '8' }} run: ${MVN} animal-sniffer:check --fail-at-end - name: enforcer checks - if: ${{ matrix.java == 'jdk8' }} + if: ${{ matrix.java == '8' }} run: ${MVN} enforcer:enforce --fail-at-end - name: forbidden api checks - if: ${{ matrix.java == 'jdk8' }} + if: ${{ matrix.java == '8' }} run: ${MVN} forbiddenapis:check forbiddenapis:testCheck --fail-at-end - name: pmd checks - if: ${{ matrix.java == 'jdk8' }} + if: ${{ matrix.java == '8' }} run: ${MVN} pmd:check --fail-at-end # TODO: consider adding pmd:cpd-check - name: spotbugs checks - if: ${{ matrix.java == 'jdk8' }} + if: ${{ matrix.java == '8' }} run: ${MVN} spotbugs:check --fail-at-end -pl '!benchmarks' intellij-inspections: @@ -123,9 +120,11 @@ jobs: - name: checkout branch uses: actions/checkout@v3 - - name: setup JDK8 - run: | - echo "JAVA_HOME=$JAVA_HOME_8_X64" >> $GITHUB_ENV + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '8' + cache: 'maven' - name: maven install run: | @@ -153,9 +152,11 @@ jobs: - name: checkout branch uses: actions/checkout@v3 - - name: setup JDK17 - run: | - echo "JAVA_HOME=$JAVA_HOME_17_X64" >> $GITHUB_ENV + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '17' + cache: 'maven' - name: setup node uses: actions/setup-node@v3 diff --git a/.github/workflows/unit-and-integration-tests-unified.yml b/.github/workflows/unit-and-integration-tests-unified.yml index ff963dac7718..59ea3f95a585 100644 --- a/.github/workflows/unit-and-integration-tests-unified.yml +++ b/.github/workflows/unit-and-integration-tests-unified.yml @@ -56,22 +56,28 @@ jobs: strategy: fail-fast: false matrix: - jdk: [ '8', '11', '17' ] + jdk: [ '8', '11', '17', '21' ] runs-on: ubuntu-latest steps: - name: Checkout branch uses: actions/checkout@v3 - - name: setup jdk${{ matrix.jdk }} - run: | - echo "JAVA_HOME=$JAVA_HOME_${{ matrix.jdk }}_X64" >> $GITHUB_ENV + # skip the "cache: maven" step from setup-java. We explicitly use a + # different cache key since we cannot reuse it across commits. + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: ${{ matrix.jdk }} + # the build step produces SNAPSHOT artifacts into the local maven repository, + # we include github.sha in the cache key to make it specific to that build/jdk - name: Cache Maven m2 repository id: maven uses: actions/cache@v3 with: path: ~/.m2/repository key: maven-${{ runner.os }}-${{ matrix.jdk }}-${{ github.sha }} + restore-keys: setup-java-Linux-maven-${{ hashFiles('**/pom.xml') }} - name: Cache targets id: target @@ -111,10 +117,11 @@ jobs: strategy: fail-fast: false matrix: - jdk: [ 11, 17 ] + jdk: [ 11, 17, 21 ] name: "unit tests (jdk${{ matrix.jdk }}, sql-compat=true)" uses: ./.github/workflows/unit-tests.yml needs: unit-tests + if: ${{ always() && (needs.unit-tests.result == 'success' || needs.unit-tests.outputs.continue_tests) }} with: jdk: ${{ matrix.jdk }} sql_compatibility: true diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index fdada96d98a6..416d18c7f442 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -27,7 +27,7 @@ org.apache.druid druid - 28.0.0-SNAPSHOT + 29.0.0-SNAPSHOT diff --git a/benchmarks/src/test/java/org/apache/druid/benchmark/DruidSchemaInternRowSignatureBenchmark.java b/benchmarks/src/test/java/org/apache/druid/benchmark/DruidSchemaInternRowSignatureBenchmark.java index 138509a1a80e..dbf9d39c2a17 100644 --- a/benchmarks/src/test/java/org/apache/druid/benchmark/DruidSchemaInternRowSignatureBenchmark.java +++ b/benchmarks/src/test/java/org/apache/druid/benchmark/DruidSchemaInternRowSignatureBenchmark.java @@ -22,8 +22,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; -import org.apache.druid.client.BrokerInternalQueryConfig; +import org.apache.druid.client.InternalQueryConfig; import org.apache.druid.client.TimelineServerView; +import org.apache.druid.client.coordinator.NoopCoordinatorClient; import org.apache.druid.java.util.common.Intervals; import org.apache.druid.java.util.common.guava.Sequence; import org.apache.druid.java.util.common.guava.Sequences; @@ -37,9 +38,9 @@ import org.apache.druid.server.coordination.ServerType; import org.apache.druid.server.metrics.NoopServiceEmitter; import org.apache.druid.server.security.Escalator; -import org.apache.druid.sql.calcite.planner.PlannerConfig; -import org.apache.druid.sql.calcite.planner.SegmentMetadataCacheConfig; -import org.apache.druid.sql.calcite.schema.SegmentMetadataCache; +import org.apache.druid.sql.calcite.schema.BrokerSegmentMetadataCache; +import org.apache.druid.sql.calcite.schema.BrokerSegmentMetadataCacheConfig; +import org.apache.druid.sql.calcite.schema.PhysicalDatasourceMetadataFactory; import org.apache.druid.timeline.DataSegment; import org.apache.druid.timeline.SegmentId; import org.apache.druid.timeline.partition.LinearShardSpec; @@ -71,27 +72,26 @@ public class DruidSchemaInternRowSignatureBenchmark { private SegmentMetadataCacheForBenchmark cache; - private static class SegmentMetadataCacheForBenchmark extends SegmentMetadataCache + private static class SegmentMetadataCacheForBenchmark extends BrokerSegmentMetadataCache { public SegmentMetadataCacheForBenchmark( final QueryLifecycleFactory queryLifecycleFactory, final TimelineServerView serverView, final SegmentManager segmentManager, final JoinableFactory joinableFactory, - final PlannerConfig config, final Escalator escalator, - final BrokerInternalQueryConfig brokerInternalQueryConfig + final InternalQueryConfig brokerInternalQueryConfig ) { super( queryLifecycleFactory, serverView, - segmentManager, - joinableFactory, - SegmentMetadataCacheConfig.create(), + BrokerSegmentMetadataCacheConfig.create(), escalator, brokerInternalQueryConfig, - new NoopServiceEmitter() + new NoopServiceEmitter(), + new PhysicalDatasourceMetadataFactory(joinableFactory, segmentManager), + new NoopCoordinatorClient() ); } @@ -109,7 +109,7 @@ public void addSegment(final DruidServerMetadata server, final DataSegment segme } @Override - protected Sequence runSegmentMetadataQuery(Iterable segments) + public Sequence runSegmentMetadataQuery(Iterable segments) { final int numColumns = 1000; LinkedHashMap columnToAnalysisMap = new LinkedHashMap<>(); @@ -178,10 +178,10 @@ public void setup() EasyMock.mock(TimelineServerView.class), null, null, - EasyMock.mock(PlannerConfig.class), null, null ); + DruidServerMetadata serverMetadata = new DruidServerMetadata( "dummy", "dummy", diff --git a/benchmarks/src/test/java/org/apache/druid/benchmark/FlattenJSONBenchmarkUtilTest.java b/benchmarks/src/test/java/org/apache/druid/benchmark/FlattenJSONBenchmarkUtilTest.java index a81e07cfde1f..f4b79108f407 100644 --- a/benchmarks/src/test/java/org/apache/druid/benchmark/FlattenJSONBenchmarkUtilTest.java +++ b/benchmarks/src/test/java/org/apache/druid/benchmark/FlattenJSONBenchmarkUtilTest.java @@ -20,6 +20,7 @@ package org.apache.druid.benchmark; import org.apache.druid.java.util.common.parsers.Parser; +import org.apache.druid.utils.JvmUtils; import org.junit.Assert; import org.junit.Test; @@ -64,15 +65,31 @@ public void checkEvent1(Map event) Assert.assertEquals("129047958", event.get("e2.ad1[0]").toString()); Assert.assertEquals("1658972185", event.get("e2.ad1[1]").toString()); Assert.assertEquals("-997010830", event.get("e2.ad1[2]").toString()); - Assert.assertEquals("-5.8772014847368817E18", event.get("e3.m1").toString()); + + // Java 19 changes some floating point string representation + // https://bugs.openjdk.org/browse/JDK-8291475 + if (JvmUtils.majorVersion() < 19) { + Assert.assertEquals("-5.8772014847368817E18", event.get("e3.m1").toString()); + } else { + Assert.assertEquals("-5.877201484736882E18", event.get("e3.m1").toString()); + } + Assert.assertEquals("0.4375433369079904", event.get("e3.m2").toString()); Assert.assertEquals("0.8510482953607659", event.get("e3.m3").toString()); Assert.assertEquals("-2.3832626488759337E18", event.get("e3.m4").toString()); - Assert.assertEquals("7.9789762132607068E18", event.get("e3.am1[0]").toString()); - Assert.assertEquals("-7.8634787235005573E18", event.get("e3.am1[1]").toString()); - Assert.assertEquals("8.7372945568982446E18", event.get("e3.am1[2]").toString()); - Assert.assertEquals("3.1928124802414899E18", event.get("e3.am1[3]").toString()); - Assert.assertEquals("-3.9806631713718011E18", event.get("e4.e4.m4").toString()); + if (JvmUtils.majorVersion() < 19) { + Assert.assertEquals("7.9789762132607068E18", event.get("e3.am1[0]").toString()); + Assert.assertEquals("-7.8634787235005573E18", event.get("e3.am1[1]").toString()); + Assert.assertEquals("8.7372945568982446E18", event.get("e3.am1[2]").toString()); + Assert.assertEquals("3.1928124802414899E18", event.get("e3.am1[3]").toString()); + Assert.assertEquals("-3.9806631713718011E18", event.get("e4.e4.m4").toString()); + } else { + Assert.assertEquals("7.978976213260707E18", event.get("e3.am1[0]").toString()); + Assert.assertEquals("-7.863478723500557E18", event.get("e3.am1[1]").toString()); + Assert.assertEquals("8.737294556898245E18", event.get("e3.am1[2]").toString()); + Assert.assertEquals("3.19281248024149E18", event.get("e3.am1[3]").toString()); + Assert.assertEquals("-3.980663171371801E18", event.get("e4.e4.m4").toString()); + } Assert.assertEquals("-1915243040", event.get("ae1[0].d1").toString()); Assert.assertEquals("-2020543641", event.get("ae1[1].d1").toString()); Assert.assertEquals("1414285347", event.get("ae1[2].e1.d2").toString()); diff --git a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlBenchmark.java b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlBenchmark.java index 1172d823e024..9bfe925ccf32 100644 --- a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlBenchmark.java +++ b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlBenchmark.java @@ -46,6 +46,7 @@ import org.apache.druid.segment.generator.GeneratorSchemaInfo; import org.apache.druid.segment.generator.SegmentGenerator; import org.apache.druid.server.QueryStackTests; +import org.apache.druid.server.SpecificSegmentsQuerySegmentWalker; import org.apache.druid.server.security.AuthConfig; import org.apache.druid.server.security.AuthTestUtils; import org.apache.druid.sql.calcite.aggregation.ApproxCountDistinctSqlAggregator; @@ -63,7 +64,6 @@ import org.apache.druid.sql.calcite.run.SqlEngine; import org.apache.druid.sql.calcite.schema.DruidSchemaCatalog; import org.apache.druid.sql.calcite.util.CalciteTests; -import org.apache.druid.sql.calcite.util.SpecificSegmentsQuerySegmentWalker; import org.apache.druid.timeline.DataSegment; import org.apache.druid.timeline.partition.LinearShardSpec; import org.openjdk.jmh.annotations.Benchmark; diff --git a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlExpressionBenchmark.java b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlExpressionBenchmark.java index 6f96a2cde568..dbdd4ea19620 100644 --- a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlExpressionBenchmark.java +++ b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlExpressionBenchmark.java @@ -36,6 +36,7 @@ import org.apache.druid.segment.generator.GeneratorSchemaInfo; import org.apache.druid.segment.generator.SegmentGenerator; import org.apache.druid.server.QueryStackTests; +import org.apache.druid.server.SpecificSegmentsQuerySegmentWalker; import org.apache.druid.server.security.AuthConfig; import org.apache.druid.server.security.AuthTestUtils; import org.apache.druid.sql.calcite.SqlVectorizedExpressionSanityTest; @@ -48,7 +49,6 @@ import org.apache.druid.sql.calcite.run.SqlEngine; import org.apache.druid.sql.calcite.schema.DruidSchemaCatalog; import org.apache.druid.sql.calcite.util.CalciteTests; -import org.apache.druid.sql.calcite.util.SpecificSegmentsQuerySegmentWalker; import org.apache.druid.timeline.DataSegment; import org.apache.druid.timeline.partition.LinearShardSpec; import org.openjdk.jmh.annotations.Benchmark; @@ -197,7 +197,7 @@ public String getFormatString() "SELECT TIME_SHIFT(MILLIS_TO_TIMESTAMP(long4), 'PT1H', 1), string2, SUM(long1 * double4) FROM foo GROUP BY 1,2 ORDER BY 3", // 37: time shift + expr agg (group by), uniform distribution high cardinality "SELECT TIME_SHIFT(MILLIS_TO_TIMESTAMP(long5), 'PT1H', 1), string2, SUM(long1 * double4) FROM foo GROUP BY 1,2 ORDER BY 3", - // 38: LATEST aggregator + // 38: LATEST aggregator long "SELECT LATEST(long1) FROM foo", // 39: LATEST aggregator double "SELECT LATEST(double4) FROM foo", @@ -207,7 +207,13 @@ public String getFormatString() "SELECT LATEST(float3), LATEST(long1), LATEST(double4) FROM foo", // 42,43: filter numeric nulls "SELECT SUM(long5) FROM foo WHERE long5 IS NOT NULL", - "SELECT string2, SUM(long5) FROM foo WHERE long5 IS NOT NULL GROUP BY 1" + "SELECT string2, SUM(long5) FROM foo WHERE long5 IS NOT NULL GROUP BY 1", + // 44: EARLIEST aggregator long + "SELECT EARLIEST(long1) FROM foo", + // 45: EARLIEST aggregator double + "SELECT EARLIEST(double4) FROM foo", + // 46: EARLIEST aggregator float + "SELECT EARLIEST(float3) FROM foo" ); @Param({"5000000"}) @@ -265,7 +271,11 @@ public String getFormatString() "40", "41", "42", - "43" + "43", + "44", + "45", + "46", + "47" }) private String query; diff --git a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlNestedDataBenchmark.java b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlNestedDataBenchmark.java index e1d866a4ba36..1915776dbca3 100644 --- a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlNestedDataBenchmark.java +++ b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlNestedDataBenchmark.java @@ -45,6 +45,7 @@ import org.apache.druid.segment.transform.ExpressionTransform; import org.apache.druid.segment.transform.TransformSpec; import org.apache.druid.server.QueryStackTests; +import org.apache.druid.server.SpecificSegmentsQuerySegmentWalker; import org.apache.druid.server.security.AuthConfig; import org.apache.druid.server.security.AuthTestUtils; import org.apache.druid.sql.calcite.SqlVectorizedExpressionSanityTest; @@ -57,7 +58,6 @@ import org.apache.druid.sql.calcite.run.SqlEngine; import org.apache.druid.sql.calcite.schema.DruidSchemaCatalog; import org.apache.druid.sql.calcite.util.CalciteTests; -import org.apache.druid.sql.calcite.util.SpecificSegmentsQuerySegmentWalker; import org.apache.druid.timeline.DataSegment; import org.apache.druid.timeline.partition.LinearShardSpec; import org.openjdk.jmh.annotations.Benchmark; diff --git a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlVsNativeBenchmark.java b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlVsNativeBenchmark.java index de3db00accf5..e4f8b5570bf0 100644 --- a/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlVsNativeBenchmark.java +++ b/benchmarks/src/test/java/org/apache/druid/benchmark/query/SqlVsNativeBenchmark.java @@ -38,6 +38,7 @@ import org.apache.druid.segment.generator.GeneratorSchemaInfo; import org.apache.druid.segment.generator.SegmentGenerator; import org.apache.druid.server.QueryStackTests; +import org.apache.druid.server.SpecificSegmentsQuerySegmentWalker; import org.apache.druid.server.security.AuthConfig; import org.apache.druid.server.security.AuthTestUtils; import org.apache.druid.sql.calcite.planner.CalciteRulesManager; @@ -49,7 +50,6 @@ import org.apache.druid.sql.calcite.run.SqlEngine; import org.apache.druid.sql.calcite.schema.DruidSchemaCatalog; import org.apache.druid.sql.calcite.util.CalciteTests; -import org.apache.druid.sql.calcite.util.SpecificSegmentsQuerySegmentWalker; import org.apache.druid.timeline.DataSegment; import org.apache.druid.timeline.partition.LinearShardSpec; import org.openjdk.jmh.annotations.Benchmark; diff --git a/cloud/aws-common/pom.xml b/cloud/aws-common/pom.xml index 4bad5332ceef..50bf6d92bf13 100644 --- a/cloud/aws-common/pom.xml +++ b/cloud/aws-common/pom.xml @@ -28,7 +28,7 @@ org.apache.druid druid - 28.0.0-SNAPSHOT + 29.0.0-SNAPSHOT ../../pom.xml diff --git a/cloud/gcp-common/pom.xml b/cloud/gcp-common/pom.xml index 14179c4095be..31e421033790 100644 --- a/cloud/gcp-common/pom.xml +++ b/cloud/gcp-common/pom.xml @@ -28,7 +28,7 @@ org.apache.druid druid - 28.0.0-SNAPSHOT + 29.0.0-SNAPSHOT ../../pom.xml diff --git a/codestyle/druid-forbidden-apis.txt b/codestyle/druid-forbidden-apis.txt index a99654f12126..b35bdede7749 100644 --- a/codestyle/druid-forbidden-apis.txt +++ b/codestyle/druid-forbidden-apis.txt @@ -44,6 +44,13 @@ java.util.LinkedList @ Use ArrayList or ArrayDeque instead java.util.Random#() @ Use ThreadLocalRandom.current() or the constructor with a seed (the latter in tests only!) java.lang.Math#random() @ Use ThreadLocalRandom.current() java.util.regex.Pattern#matches(java.lang.String,java.lang.CharSequence) @ Use String.startsWith(), endsWith(), contains(), or compile and cache a Pattern explicitly +org.apache.calcite.sql.type.OperandTypes#LITERAL @ LITERAL type checker throws when literals with CAST are passed. Use org.apache.druid.sql.calcite.expression.DefaultOperandTypeChecker instead. +org.apache.calcite.sql.type.OperandTypes#BOOLEAN_LITERAL @ Create a type checker like org.apache.calcite.sql.type.POSITIVE_INTEGER_LITERAL and use that instead +org.apache.calcite.sql.type.OperandTypes#ARRAY_BOOLEAN_LITERAL @ Create a type checker like org.apache.calcite.sql.type.POSITIVE_INTEGER_LITERAL and use that instead +org.apache.calcite.sql.type.OperandTypes#POSITIVE_INTEGER_LITERAL @ Use org.apache.calcite.sql.type.POSITIVE_INTEGER_LITERAL instead +org.apache.calcite.sql.type.OperandTypes#UNIT_INTERVAL_NUMERIC_LITERAL @ Create a type checker like org.apache.calcite.sql.type.POSITIVE_INTEGER_LITERAL and use that instead +org.apache.calcite.sql.type.OperandTypes#NUMERIC_UNIT_INTERVAL_NUMERIC_LITERAL @ Create a type checker like org.apache.calcite.sql.type.POSITIVE_INTEGER_LITERAL and use that instead +org.apache.calcite.sql.type.OperandTypes#NULLABLE_LITERAL @ Create an instance of org.apache.calcite.sql.type.CastedLiteralOperandTypeChecker that allows nulls and use that instead org.apache.commons.io.FileUtils#getTempDirectory() @ Use org.junit.rules.TemporaryFolder for tests instead org.apache.commons.io.FileUtils#deleteDirectory(java.io.File) @ Use org.apache.druid.java.util.common.FileUtils#deleteDirectory() org.apache.commons.io.FileUtils#forceMkdir(java.io.File) @ Use org.apache.druid.java.util.common.FileUtils.mkdirp instead diff --git a/dev/druid_intellij_formatting.xml b/dev/druid_intellij_formatting.xml index 6e0a33c9fd21..7771b2654721 100644 --- a/dev/druid_intellij_formatting.xml +++ b/dev/druid_intellij_formatting.xml @@ -74,6 +74,10 @@