From 39582664789237c669e953a23980ccd05570a501 Mon Sep 17 00:00:00 2001 From: Pierre Laporte Date: Thu, 20 Feb 2025 19:03:27 +0100 Subject: [PATCH 1/9] Add benchmarks that rely on the REST APIs --- .scalafmt.conf | 25 ++ benchmarks/README.md | 177 ++++++++++++ benchmarks/authenticate.sh | 25 ++ benchmarks/build.gradle.kts | 37 +++ benchmarks/docs/dataset-shape-1-1000-7.png | Bin 0 -> 21704 bytes benchmarks/docs/dataset-shape-1-1000-7.puml | 49 ++++ benchmarks/docs/dataset-shape-10-2-3.png | Bin 0 -> 35984 bytes benchmarks/docs/dataset-shape-10-2-3.puml | 90 ++++++ benchmarks/docs/dataset-shape-2-3-5.png | Bin 0 -> 34368 bytes benchmarks/docs/dataset-shape-2-3-5.puml | 74 +++++ benchmarks/docs/dataset-size.png | Bin 0 -> 32043 bytes benchmarks/docs/dataset-size.puml | 41 +++ benchmarks/docs/gatling-report.png | Bin 0 -> 167425 bytes .../src/gatling/resources/logback-test.xml | 19 ++ .../DatasetCreationSimulation.scala | 28 ++ .../DatasetVerificationSimulation.scala | 28 ++ .../polaris/benchmarks/NAryTreeBuilder.scala | 88 ++++++ .../polaris/benchmarks/RetryOnHttpCodes.scala | 65 +++++ .../actions/AuthenticationActions.scala | 99 +++++++ .../benchmarks/actions/CatalogActions.scala | 135 +++++++++ .../benchmarks/actions/EntityProperties.scala | 29 ++ .../benchmarks/actions/NamespaceActions.scala | 221 +++++++++++++++ .../benchmarks/actions/TableActions.scala | 256 ++++++++++++++++++ .../benchmarks/actions/ViewActions.scala | 243 +++++++++++++++++ .../parameters/ConnectionParameters.scala | 47 ++++ .../parameters/DatasetParameters.scala | 107 ++++++++ .../benchmarks/parameters/Explainable.scala | 27 ++ .../parameters/WorkloadParameters.scala | 35 +++ .../simulations/CreateTreeDataset.scala | 121 +++++++++ .../CreateTreeDatasetConcurrent.scala | 57 ++++ .../CreateTreeDatasetSequential.scala | 56 ++++ .../simulations/ReadTreeDataset.scala | 150 ++++++++++ .../simulations/ReadUpdateTreeDataset.scala | 117 ++++++++ .../ReadUpdateTreeDatasetConcurrent.scala | 41 +++ .../ReadUpdateTreeDatasetSequential.scala | 47 ++++ .../benchmarks/util/CircularIterator.scala | 52 ++++ .../assets/polaris/create-catalog.sh | 2 +- .../dremio-polaris-mongo/docker-compose.yml | 31 +++ .../eclipselink-3-replicas/README.md | 71 +++++ .../eclipselink-3-replicas/docker-compose.yml | 152 +++++++++++ .../eclipselink-3-replicas/nginx.conf | 25 ++ .../eclipselink-3-replicas/postgresql.conf | 46 ++++ gradle/libs.versions.toml | 1 + gradle/projects.main.properties | 1 + 44 files changed, 2914 insertions(+), 1 deletion(-) create mode 100644 .scalafmt.conf create mode 100644 benchmarks/README.md create mode 100755 benchmarks/authenticate.sh create mode 100644 benchmarks/build.gradle.kts create mode 100644 benchmarks/docs/dataset-shape-1-1000-7.png create mode 100644 benchmarks/docs/dataset-shape-1-1000-7.puml create mode 100644 benchmarks/docs/dataset-shape-10-2-3.png create mode 100644 benchmarks/docs/dataset-shape-10-2-3.puml create mode 100644 benchmarks/docs/dataset-shape-2-3-5.png create mode 100644 benchmarks/docs/dataset-shape-2-3-5.puml create mode 100644 benchmarks/docs/dataset-size.png create mode 100644 benchmarks/docs/dataset-size.puml create mode 100644 benchmarks/docs/gatling-report.png create mode 100644 benchmarks/src/gatling/resources/logback-test.xml create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetCreationSimulation.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetVerificationSimulation.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/NAryTreeBuilder.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/RetryOnHttpCodes.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/AuthenticationActions.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/CatalogActions.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/EntityProperties.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/NamespaceActions.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/TableActions.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/ViewActions.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/ConnectionParameters.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/DatasetParameters.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/Explainable.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/WorkloadParameters.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDataset.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDatasetConcurrent.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDatasetSequential.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadTreeDataset.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDataset.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDatasetConcurrent.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDatasetSequential.scala create mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/util/CircularIterator.scala create mode 100644 getting-started/dremio-polaris-mongo/docker-compose.yml create mode 100644 getting-started/eclipselink-3-replicas/README.md create mode 100644 getting-started/eclipselink-3-replicas/docker-compose.yml create mode 100644 getting-started/eclipselink-3-replicas/nginx.conf create mode 100644 getting-started/eclipselink-3-replicas/postgresql.conf diff --git a/.scalafmt.conf b/.scalafmt.conf new file mode 100644 index 0000000000..52d1b35c34 --- /dev/null +++ b/.scalafmt.conf @@ -0,0 +1,25 @@ +# Scalafmt is used to reformat Gatling benchmarks from the benchmarks/ directory + +version = 3.9.3 +runner.dialect = scala213 + +maxColumn = 100 + +preset = default +align.preset = some + +assumeStandardLibraryStripMargin = true +align.stripMargin = true + +rewrite.rules = [ + AvoidInfix + RedundantBraces + RedundantParens + SortModifiers + PreferCurlyFors + Imports +] + +rewrite.imports.sort = original +docstrings.style = Asterisk +docstrings.wrap = fold \ No newline at end of file diff --git a/benchmarks/README.md b/benchmarks/README.md new file mode 100644 index 0000000000..2e3e68d9b6 --- /dev/null +++ b/benchmarks/README.md @@ -0,0 +1,177 @@ +# Polaris Benchmarks + +This repository contains benchmarks for the Polaris service using Gatling. + +## Available Benchmarks + +### Dataset Creation Benchmark + +The CreateTreeDataset benchmark creates a test dataset with a specific structure. It exists in two variants: + +- `org.apache.polaris.benchmarks.simulations.CreateTreeDatasetSequential`: Creates entities one at a time +- `org.apache.polaris.benchmarks.simulations.CreateTreeDatasetConcurrent`: Creates up to 50 entities simultaneously + +These are write-only workloads designed to populate the system for subsequent benchmarks. + +### Read/Update Benchmark + +The ReadUpdateTreeDataset benchmark tests read and update operations on an existing dataset. It exists in two variants: + +- `org.apache.polaris.benchmarks.simulations.ReadUpdateTreeDatasetSequential`: Performs read/update operations one at a time +- `org.apache.polaris.benchmarks.simulations.ReadUpdateTreeDatasetConcurrent`: Performs up to 20 read/update operations simultaneously + +These benchmarks can only be run after using CreateTreeDataset to populate the system. + +## Parameters + +### Dataset Structure Parameters + +These parameters must be consistent across all benchmarks: + +- `NUM_CATALOGS`: Number of catalogs to create (default: 1) +- `NAMESPACE_WIDTH`: Width of the namespace tree (default: 2) +- `NAMESPACE_DEPTH`: Depth of the namespace tree (default: 4) +- `NUM_TABLES_PER_NAMESPACE`: Tables per namespace (default: 5) +- `NUM_VIEWS_PER_NAMESPACE`: Views per namespace (default: 3) +- `NUM_COLUMNS`: Columns per table (default: 10) +- `DEFAULT_BASE_LOCATION`: Base location for datasets (default: file:///tmp/polaris) + +### Workload Parameters + +These parameters can vary between benchmarks: + +- `CLIENT_ID`: Required OAuth2 client ID +- `CLIENT_SECRET`: Required OAuth2 client secret +- `BASE_URL`: Service URL (default: http://localhost:8181) +- `READ_WRITE_RATIO`: Ratio of read to write operations (for ReadUpdateTreeDataset only) + +## Running the Benchmarks + +Required environment variables: +```bash +export CLIENT_ID=your_client_id +export CLIENT_SECRET=your_client_secret +export BASE_URL=http://your-polaris-instance:8181 +``` + +To run the sequential dataset creation benchmark: +```bash +./gradlew gatlingRun-org.apache.polaris.benchmarks.simulations.CreateTreeDatasetSequential +``` + +To run the concurrent dataset creation benchmark: +```bash +./gradlew gatlingRun-org.apache.polaris.benchmarks.simulations.CreateTreeDatasetConcurrent +``` + +To run the sequential read/update benchmark: +```bash +export READ_WRITE_RATIO=0.8 # 80% reads, 20% writes +./gradlew gatlingRun-org.apache.polaris.benchmarks.simulations.ReadUpdateTreeDatasetSequential +``` + +To run the concurrent read/update benchmark: +```bash +export READ_WRITE_RATIO=0.8 # 80% reads, 20% writes +./gradlew gatlingRun-org.apache.polaris.benchmarks.simulations.ReadUpdateTreeDatasetConcurrent +``` + +A message will show the location of the Gatling report: +``` +Reports generated in: ./benchmarks/build/reports/gatling//index.html +``` + +# Test Dataset + +The benchmarks use synthetic procedural datasets that are generated deterministically at runtime. This means that given the same input parameters, the exact same dataset structure will always be generated. This approach allows generating large volumes of test data without having to store it, while ensuring reproducible benchmark results across different runs. + +The diagrams below describe the data sets that are used in benchmarks. Note that the benchmark dataset may not cover all Polaris features. + +## Generation rules + +The dataset has a tree shape. At the root of the tree is a Polaris realm that must exist before the dataset is created. + +An arbitrary number of catalogs can be created under the realm. However, only the first catalog (`C_0`) is used for the rest of the dataset. + +The namespaces part of the dataset is a complete `N`-ary tree. That is, it starts with a root namespace (`NS_0`) and then, each namespace contains exactly `0` or `N` children namespaces. The width as well as the depth of the namespaces tree are configurable. The total number of namespaces can easily be calculated with the following formulae, where `N` is the tree arity and `D` is the total tree depth, including the root: + +$$\text{Total number of namespaces} = +\begin{cases} + \frac{N^{D} - 1}{N - 1} & \mbox{if } N \gt 1 \\ + D & \mbox{if } N = 1 +\end{cases}$$ + +The tables are created under the leaves of the tree. That is, they are put under the namespaces with no child namespace. The number of tables that is created under each leaf namespace is configurable. The total number of tables can easily be calculated with the following formulae, where `N` is the tree arity, `D` is the total tree depth, and `T` is the number of tables per leaf namespace: + +Total number of tables = *N**D* − 1 \* *T* + +The views are created alongside the tables. The number of views that is created under each leaf namespace is also configurable. The total number of views can easily be calculated with the following formulae, where `N` is the tree arity, `D` is the total tree depth, `V` is the number of views per leaf namespace: + +Total number of tables = *N**D* − 1 \* *V* + +## Binary tree example + +The diagram below shows an example of a test dataset with the following properties: + +- Number of catalogs: `3` +- Namespace tree width (`N`): `2` (a binary tree) +- Namespace tree depth (`D`): `3` +- Tables per namespace (`T`): `5` +- Views per namespace (`V`): `3` + +![Binary tree dataset example with width 2, depth 3, and 5 tables per namespace](docs/dataset-shape-2-3-5.png) + +Using the formula from the previous section, we can calculate the total number of namespaces and the total number of tables as follows: + +$$\text{Total number of namespaces} = \frac{2^{3} - 1}{2 - 1} = 7$$ + +Total number of tables = 23 − 1 \* 5 = 20 + +## 10-ary tree example + +The diagram below shows an example of a test dataset with the following properties: + +- Number of catalogs: `1` +- Namespace tree width (`N`): `10` +- Namespace tree depth (`D`): `2` +- Tables per namespace (`T`): `3` +- Views per namespace (`V`): `3` + +![10-ary tree dataset example with width 10, depth 2, and 3 tables per namespace](docs/dataset-shape-10-2-3.png) + +Using the formula from the previous section, we can calculate the total number of namespaces and the total number of tables as follows: + +$$\text{Total number of namespaces} = \frac{10^{2} - 1}{10 - 1} = 11$$ + +Total number of tables = 102 − 1 \* 3 = 30 + +## 1-ary tree example + +The diagram below shows an example of a test dataset with the following properties: + +- Number of catalogs: `1` +- Namespace tree width (`N`): `1` +- Namespace tree depth (`D`): `1000` +- Tables per namespace (`T`): `7` +- Views per namespace (`V`): `4` + +![1-ary tree dataset example with width 1, depth 1000, and 7 tables per namespace](docs/dataset-shape-1-1000-7.png) + +Using the formula from the previous section, we can calculate the total number of namespaces and the total number of tables as follows: + +Total number of namespaces = 1000 + +Total number of tables = 11000 − 1 \* 7 = 7 + +## Size + +The data set size can be adjusted as well. Each namespace is associated with an arbitrary number of dummy properties. Similarly, each table is associated with an arbitrary number of dummy columns and properties. + +The diagram below shows sample catalog, namespace and table definition given the following properties: + +- Default base location: `file:///tmp/polaris` +- Number of namespace properties: `100` +- Number of columns per table: `999` +- Number of table properties: `59` + +![Dataset size example showing catalog, namespace, and table definitions](docs/dataset-size.png) diff --git a/benchmarks/authenticate.sh b/benchmarks/authenticate.sh new file mode 100755 index 0000000000..e8d7f87bf2 --- /dev/null +++ b/benchmarks/authenticate.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +if [ $# -eq 1 ]; then + export CLIENT_ID=$(echo "$1" | cut -d: -f1) CLIENT_SECRET=$(echo "$1" | cut -d: -f2) +elif [ $# -eq 2 ]; then + export CLIENT_ID=$1 CLIENT_SECRET=$2 +else + export CLIENT_ID=root CLIENT_SECRET=s3cr3t +fi + +# eval $(grep -aEo 'realm: [^:]*:[^:]*:[^:]*' /tmp/polaris.log | perl -pe 's/realm: [^:]*: ([^:]*):([^:]*)/export CLIENT_ID=$1 CLIENT_SECRET=$2/') + +echo export CLIENT_ID=$CLIENT_ID +echo export CLIENT_SECRET=$CLIENT_SECRET +echo export TOKEN=$( + curl \ + -s \ + -X POST \ + "http://${POLARIS_HOST:-localhost}:8181/api/catalog/v1/oauth/tokens" \ + -d "grant_type=client_credentials" \ + -d "client_id=$CLIENT_ID" \ + -d "client_secret=$CLIENT_SECRET" \ + -d "scope=PRINCIPAL_ROLE:ALL" | + jq -r .access_token +) diff --git a/benchmarks/build.gradle.kts b/benchmarks/build.gradle.kts new file mode 100644 index 0000000000..c302d818de --- /dev/null +++ b/benchmarks/build.gradle.kts @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +plugins { + id("scala") + id("io.gatling.gradle") version "3.13.4.1" + id("com.diffplug.spotless") +} + +dependencies { + gatling("com.typesafe.play:play-json_2.13:2.9.4") +} + +description = "Polaris Iceberg REST API performance tests" + +spotless { + scala { + // Use scalafmt for Scala formatting + scalafmt("3.9.3").configFile("../.scalafmt.conf") + } +} diff --git a/benchmarks/docs/dataset-shape-1-1000-7.png b/benchmarks/docs/dataset-shape-1-1000-7.png new file mode 100644 index 0000000000000000000000000000000000000000..23e464ec12783c5ae109de3193fdc35c70d9722e GIT binary patch literal 21704 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 W3KGUS;4(_A7f)rL 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 z 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�+p~zD> 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 qvGVBhoYy5A@KC){@ckZ C_0 + defaultBaseLocation => file:///tmp/polaris/C_0 +} + +json NS_4 { + "namespace": ["NS_0", "NS_1", "NS_4"], + "properties": { + "Attribute_0": "Value_0", + "Attribute_1": "Value_1", + "...": "...", + "Attribute_100": "Value_100" + } +} + +json T_15 { + "name": "T_15", + "schema": { + "type": "struct", + "fields": [ + {"id": 0, "name": "column0", "type": "int", "required": true}, + {"id": 1, "name": "column1", "type": "int", "required": true}, + "...", + {"id": 999, "name": "column999", "type": "int", "required": true} + ], + "identifier-field-ids": [0] + }, + "properties": { + "Attribute_0": "Value_0", + "Attribute_1": "Value_1", + "...": "...", + "Attribute_59": "Value_59" + } +} + +C_0 -[hidden]- NS_4 +NS_4 -[hidden]- T_15 + +@enduml diff --git a/benchmarks/docs/gatling-report.png b/benchmarks/docs/gatling-report.png new file mode 100644 index 0000000000000000000000000000000000000000..77688de8ccaf8ec829b1547dd53e1e208332fc8b GIT binary patch literal 167425 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

H{PuFOEOf;od?XR1nFH_cE#_E#0zYV4v@e+o`2 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 z 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

`oZKMM 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 b4{ouXrO!wBH8{fV0beo_@5GBl4L|)q7t#43 literal 0 HcmV?d00001 diff --git a/benchmarks/src/gatling/resources/logback-test.xml b/benchmarks/src/gatling/resources/logback-test.xml new file mode 100644 index 0000000000..a2fb46ea3a --- /dev/null +++ b/benchmarks/src/gatling/resources/logback-test.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx + + false + + + + + + + + + + + + diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetCreationSimulation.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetCreationSimulation.scala new file mode 100644 index 0000000000..a1650ccfe8 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetCreationSimulation.scala @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks + +import org.apache.polaris.benchmarks.simulations.CreateTreeDatasetConcurrent + +/** + * This simulation is only kept for compatibility reasons. It is recommended to use the + * CreateTreeDataset class directly instead. + */ +class DatasetCreationSimulation extends CreateTreeDatasetConcurrent {} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetVerificationSimulation.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetVerificationSimulation.scala new file mode 100644 index 0000000000..c92e3d94aa --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetVerificationSimulation.scala @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks + +import org.apache.polaris.benchmarks.simulations.ReadUpdateTreeDatasetConcurrent + +/** + * This simulation is only kept for compatibility reasons. It is recommended to use the + * ReadTreeDataset class directly instead. + */ +class DatasetVerificationSimulation extends ReadUpdateTreeDatasetConcurrent {} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/NAryTreeBuilder.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/NAryTreeBuilder.scala new file mode 100644 index 0000000000..b270230aa8 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/NAryTreeBuilder.scala @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks + +case class NAryTreeBuilder(nsWidth: Int, nsDepth: Int) { + + /** + * Computes the path from the root node to the given ordinal. + * + * @param ordinal the ordinal of the node + * @param acc the accumulator for the path + * @return the path from the root node (included) to the given ordinal (included) + */ + @scala.annotation.tailrec + final def pathToRoot(ordinal: Int, acc: List[Int] = Nil): List[Int] = + if (ordinal == 0) { + ordinal :: acc + } else { + val parent = (ordinal - 1) / nsWidth + pathToRoot(parent, ordinal :: acc) + } + + /** + * Calculates the depth of a node in the n-ary tree based on its ordinal. + * + * @param ordinal The ordinal of the node. + * @return The depth of the node in the tree. + */ + def depthOf(ordinal: Int): Int = { + if (ordinal == 0) return 0 + if (nsWidth == 1) return ordinal + + // Using the formula: floor(log_n((x * (n-1)) + 1)) + val numerator = (ordinal * (nsWidth - 1)) + 1 + (math.log(numerator) / math.log(nsWidth)).floor.toInt + } + + /** + * Calculate the total number of nodes in a complete n-ary tree. + * + * @return The total number of nodes in the tree. + */ + val numberOfNodes: Int = + // The sum of nodes from level 0 to level d is (n^(d+1) - 1) / (n - 1) + ((math.pow(nsWidth, nsDepth) - 1) / (nsWidth - 1)).toInt + + /** + * Returns a range of ordinals for the nodes on the last level of a complete n-ary tree. + * + * @return The range of ordinals for the nodes on the last level of the tree. + */ + val lastLevelOrdinals: Range = { + val lastLevel = nsDepth - 1 + if (nsWidth == 1) { + // For a unary tree, the only node at depth d is simply the node with ordinal d. + Range.inclusive(lastLevel, lastLevel) + } else { + // The sum of nodes from level 0 to level d-1 is (n^d - 1) / (n - 1) + val start = ((math.pow(nsWidth, lastLevel) - 1) / (nsWidth - 1)).toInt + // The sum of nodes from level 0 to level d is (n^(d+1) - 1) / (n - 1) + // Therefore, the last ordinal at depth d is: + val end = (((math.pow(nsWidth, lastLevel + 1) - 1) / (nsWidth - 1)).toInt) - 1 + Range.inclusive(start, end) + } + } + + val numberOfLastLevelElements: Int = { + val lastLevel = nsDepth - 1 + math.pow(nsWidth, lastLevel).toInt + } +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/RetryOnHttpCodes.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/RetryOnHttpCodes.scala new file mode 100644 index 0000000000..93656151c5 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/RetryOnHttpCodes.scala @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks + +import io.gatling.core.Predef._ +import io.gatling.core.structure.ChainBuilder +import io.gatling.http.Predef._ +import io.gatling.http.request.builder.HttpRequestBuilder +import org.slf4j.LoggerFactory + +object RetryOnHttpCodes { + private val logger = LoggerFactory.getLogger(getClass) + + implicit class HttpRequestBuilderWithStatusSave(val httpRequestBuilder: HttpRequestBuilder) { + def saveHttpStatusCode(): HttpRequestBuilder = + httpRequestBuilder.check(status.saveAs("lastHttpStatusCode")) + } + + def retryOnHttpStatus(maxRetries: Int, statusCodes: Set[Int], counterName: String = "httpRetry")( + httpRequestBuilder: HttpRequestBuilder + ): ChainBuilder = + exec(session => session.set(counterName, 0)) + .exec(session => session.set("lastHttpStatusCode", -1)) + .asLongAs(session => + session(counterName).as[Int] == 0 || ( + session(counterName).as[Int] < maxRetries && + statusCodes.contains(session("lastHttpStatusCode").as[Int]) + ) + ) { + exec(session => session.set(counterName, session(counterName).as[Int] + 1)) + .exec(httpRequestBuilder) + } + .doIf(session => + session(counterName).as[Int] >= maxRetries && statusCodes.contains( + session("lastHttpStatusCode").as[Int] + ) + ) { + exec { session => + logger.warn( + s"""Max retries (${maxRetries}) attempted for chain "${counterName}". Last HTTP status code: ${session( + "lastHttpStatusCode" + ).as[Int]}""" + ) + session + } + } + .exec(session => session.removeAll("lastHttpStatusCode", counterName)) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/AuthenticationActions.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/AuthenticationActions.scala new file mode 100644 index 0000000000..760d2652b5 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/AuthenticationActions.scala @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.actions + +import io.gatling.core.Predef._ +import io.gatling.core.feeder.Feeder +import io.gatling.core.structure.ChainBuilder +import io.gatling.http.Predef._ +import org.apache.polaris.benchmarks.RetryOnHttpCodes.{ + retryOnHttpStatus, + HttpRequestBuilderWithStatusSave +} +import org.apache.polaris.benchmarks.parameters.ConnectionParameters +import org.slf4j.LoggerFactory + +import java.util.concurrent.atomic.AtomicReference + +/** + * Actions for performance testing authentication operations. This class provides methods to + * authenticate and manage access tokens for API requests. + * + * @param cp Connection parameters containing client credentials + * @param accessToken Reference to the authentication token shared across actions + * @param maxRetries Maximum number of retry attempts for failed operations + * @param retryableHttpCodes HTTP status codes that should trigger a retry + */ +case class AuthenticationActions( + cp: ConnectionParameters, + accessToken: AtomicReference[String], + maxRetries: Int = 10, + retryableHttpCodes: Set[Int] = Set(500) +) { + private val logger = LoggerFactory.getLogger(getClass) + + /** + * Creates a Gatling Feeder that provides authentication credentials. The feeder continuously + * supplies client ID and client secret from the connection parameters for use in authentication + * requests. + * + * @return An iterator providing client credentials + */ + def feeder(): Feeder[String] = Iterator.continually( + Map( + "clientId" -> cp.clientId, + "clientSecret" -> cp.clientSecret + ) + ) + + /** + * Authenticates using client credentials and saves the access token as a session attribute. The + * credentials are defined in the [[AuthenticationActions.feeder]]. This operation performs an + * OAuth2 client credentials flow, requesting full principal roles, and stores the received access + * token in both the Gatling session and the shared AtomicReference. + * + * There is no limit to the maximum number of users that can authenticate concurrently. + */ + val authenticateAndSaveAccessToken: ChainBuilder = + retryOnHttpStatus(maxRetries, retryableHttpCodes, "Authenticate")( + http("Authenticate") + .post("/api/catalog/v1/oauth/tokens") + .header("Content-Type", "application/x-www-form-urlencoded") + .formParam("grant_type", "client_credentials") + .formParam("client_id", "#{clientId}") + .formParam("client_secret", "#{clientSecret}") + .formParam("scope", "PRINCIPAL_ROLE:ALL") + .saveHttpStatusCode() + .check(status.is(200)) + .check(jsonPath("$.access_token").saveAs("accessToken")) + ) + .exec { session => + accessToken.set(session("accessToken").as[String]) + session + } + + /** + * Restores the current access token from the shared reference into the Gatling session. This + * operation is useful when a scenario needs to reuse an authentication token from a previous + * scenario. + */ + val restoreAccessTokenInSession: ChainBuilder = + exec(session => session.set("accessToken", accessToken.get())) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/CatalogActions.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/CatalogActions.scala new file mode 100644 index 0000000000..8878b5a133 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/CatalogActions.scala @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.actions + +import io.gatling.core.Predef._ +import io.gatling.core.feeder.Feeder +import io.gatling.core.structure.ChainBuilder +import io.gatling.http.Predef._ +import org.apache.polaris.benchmarks.RetryOnHttpCodes.{ + retryOnHttpStatus, + HttpRequestBuilderWithStatusSave +} +import org.apache.polaris.benchmarks.parameters.DatasetParameters +import org.slf4j.LoggerFactory + +import java.util.concurrent.atomic.AtomicReference + +/** + * Actions for performance testing catalog operations in Apache Iceberg. This class provides methods + * to create and fetch catalogs. + * + * @param dp Dataset parameters controlling the dataset generation + * @param accessToken Reference to the authentication token for API requests + * @param maxRetries Maximum number of retry attempts for failed operations + * @param retryableHttpCodes HTTP status codes that should trigger a retry + */ +case class CatalogActions( + dp: DatasetParameters, + accessToken: AtomicReference[String], + maxRetries: Int = 10, + retryableHttpCodes: Set[Int] = Set(409, 500) +) { + private val logger = LoggerFactory.getLogger(getClass) + + /** + * Creates a Gatling Feeder that generates catalog names and their default storage locations. Each + * catalog will be named "C_n" where n is a sequential number, and will have a corresponding + * storage location under the configured base path. + * + * @return An iterator providing catalog names and their storage locations + */ + def feeder(): Feeder[String] = Iterator + .from(0) + .map { i => + val catalogName = s"C_$i" + Map( + "catalogName" -> catalogName, + "defaultBaseLocation" -> s"${dp.defaultBaseLocation}/$catalogName" + ) + } + .take(dp.numCatalogs) + + /** + * Creates a new Iceberg catalog with FILE storage type. The catalog is created as an INTERNAL + * type with a name and a default base location that are defined in the [[CatalogActions.feeder]]. + * This represents the fundamental operation of establishing a new catalog in an Iceberg + * deployment. + * + * There is no limit to the number of users that can create catalogs concurrently. + */ + val createCatalog: ChainBuilder = + retryOnHttpStatus(maxRetries, retryableHttpCodes, "Create catalog")( + http("Create Catalog") + .post("/api/management/v1/catalogs") + .header("Authorization", "Bearer #{accessToken}") + .header("Content-Type", "application/json") + .body( + StringBody( + """{ + | "catalog": { + | "type": "INTERNAL", + | "name": "#{catalogName}", + | "properties": { + | "default-base-location": "#{defaultBaseLocation}" + | }, + | "storageConfigInfo": { + | "storageType": "FILE" + | } + | } + |}""".stripMargin + ) + ) + .saveHttpStatusCode() + .check(status.is(201)) + ) + + /** + * Retrieves details of a specific Iceberg catalog by name. The catalog name is defined in the + * [[CatalogActions.feeder]]. Some basic properties are verified, like the catalog type, storage + * settings, and base location. + * + * There is no limit to the number of users that can fetch catalogs concurrently. + */ + val fetchCatalog: ChainBuilder = exec( + http("Fetch Catalog") + .get("/api/management/v1/catalogs/#{catalogName}") + .header("Authorization", "Bearer #{accessToken}") + .header("Content-Type", "application/json") + .check(status.is(200)) + .check(jsonPath("$.type").is("INTERNAL")) + .check(jsonPath("$.name").is("#{catalogName}")) + .check(jsonPath("$.properties.default-base-location").is("#{defaultBaseLocation}")) + .check(jsonPath("$.storageConfigInfo.storageType").is("FILE")) + .check(jsonPath("$.storageConfigInfo.allowedLocations[0]").is("#{defaultBaseLocation}")) + ) + + /** + * Lists all available Iceberg catalogs in the deployment. This operation does not rely on any + * feeder data. + */ + val fetchAllCatalogs: ChainBuilder = exec( + http("Fetch all Catalogs") + .get("/api/management/v1/catalogs") + .header("Authorization", "Bearer #{accessToken}") + .header("Content-Type", "application/json") + .check(status.is(200)) + ) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/EntityProperties.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/EntityProperties.scala new file mode 100644 index 0000000000..962651d583 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/EntityProperties.scala @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.actions + +import play.api.libs.json.Json + +object EntityProperties { + def filterMapByPrefix(json: String, prefix: String): Map[String, String] = + Json.parse(json).as[Map[String, String]].filter { case (k, _) => + k.startsWith(prefix) + } +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/NamespaceActions.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/NamespaceActions.scala new file mode 100644 index 0000000000..b33a9912cb --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/NamespaceActions.scala @@ -0,0 +1,221 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.actions + +import io.gatling.core.Predef._ +import io.gatling.core.feeder.Feeder +import io.gatling.core.structure.ChainBuilder +import io.gatling.http.Predef._ +import org.apache.polaris.benchmarks.RetryOnHttpCodes.{ + retryOnHttpStatus, + HttpRequestBuilderWithStatusSave +} +import org.apache.polaris.benchmarks.parameters.DatasetParameters +import org.slf4j.LoggerFactory +import play.api.libs.json.Json + +import java.util.concurrent.atomic.AtomicReference + +/** + * Actions for performance testing authentication operations. This class provides methods to + * authenticate and manage access tokens for API requests. + * + * @param dp Dataset parameters controlling the dataset generation + * @param accessToken Reference to the authentication token shared across actions + * @param maxRetries Maximum number of retry attempts for failed operations + * @param retryableHttpCodes HTTP status codes that should trigger a retry + */ +case class NamespaceActions( + dp: DatasetParameters, + accessToken: AtomicReference[String], + maxRetries: Int = 10, + retryableHttpCodes: Set[Int] = Set(409, 500) +) { + private val logger = LoggerFactory.getLogger(getClass) + + /** + * Creates a Gatling Feeder that generates namespace hierarchies. Each row is associated with a + * distinct namespace. Namespaces are named "NS_n" where n is derived from the n-ary tree + * position. The feeder provides catalog name, namespace id and namespace path. + * + * @return An iterator providing namespace details + */ + def namespaceIdentityFeeder(): Feeder[Any] = Iterator + .from(0) + .map { tableId => + val namespaceId = tableId + val namespacePath: Seq[String] = dp.nAryTree + .pathToRoot(namespaceId) + .map(ordinal => s"NS_$ordinal") + Map( + "catalogName" -> "C_0", + "namespaceId" -> tableId, + "namespacePath" -> namespacePath, + "namespaceJsonPath" -> Json.toJson(namespacePath).toString(), + "namespaceMultipartPath" -> namespacePath.mkString("%1F") + ) + } + .take(dp.nAryTree.numberOfNodes) + + /** + * Creates a Gatling Feeder that generates namespace hierarchies. Each row is associated with a + * distinct namespace and leverages the [[NamespaceActions.namespaceIdentityFeeder()]]. Additional + * attributes are added to each row, like namespace properties. + * + * @return An iterator providing namespace details and their properties + */ + def namespaceCreationFeeder(): Feeder[Any] = namespaceIdentityFeeder() + .map { row => + val properties: Map[String, String] = (0 until dp.numNamespaceProperties) + .map(id => s"InitialAttribute_$id" -> s"$id") + .toMap + row ++ Map( + "initialProperties" -> properties, + "initialJsonProperties" -> Json.toJson(properties).toString() + ) + } + + /** + * Creates a Gatling Feeder that generates expected namespace attributes. Each row is associated + * with a distinct namespace and leverages the [[NamespaceActions.namespaceCreationFeeder]]. + * Additional attributes are added to each row so that the payload returned by the server can be + * verified. The initial properties from the namespace creation feeder are used to verify the + * namespace properties. + * + * @return An iterator providing namespace details and their properties + */ + def namespaceFetchFeeder(): Feeder[Any] = namespaceCreationFeeder() + .map { row => + val catalogName = row("catalogName").asInstanceOf[String] + val namespaceUnixPath = row("namespacePath").asInstanceOf[Seq[String]].mkString("/") + val location = Map( + "location" -> s"${dp.defaultBaseLocation}/$catalogName/$namespaceUnixPath" + ) + row ++ Map( + "location" -> location + ) + } + + def namespacePropertiesUpdateFeeder(): Feeder[Any] = namespaceIdentityFeeder() + .flatMap { row => + (0 until dp.numNamespacePropertyUpdates).map { updateId => + val updates = Map(s"UpdatedAttribute_$updateId" -> s"$updateId") + row ++ Map( + "jsonPropertyUpdates" -> Json.toJson(updates).toString() + ) + } + } + + /** + * Creates a new namespace in a specified catalog. The namespace is created with a full path and + * properties that are defined in the [[NamespaceActions.namespaceCreationFeeder]]. + * + * Namespaces have a dependency on the existence of their parent namespaces. As a result, the + * namespace creation operation is expected to fail if too many concurrent users are run. It is + * possible that a user tries to create a namespace for which the parent has not been fully + * created yet. + * + * Therefore, the number of concurrent users should start with 1 and increase gradually. + * Typically, start 1 user and increase by 1 user every second until some arbitrary maximum value. + */ + val createNamespace: ChainBuilder = + retryOnHttpStatus(maxRetries, retryableHttpCodes, "Create namespace")( + http("Create Namespace") + .post("/api/catalog/v1/#{catalogName}/namespaces") + .header("Authorization", "Bearer #{accessToken}") + .header("Content-Type", "application/json") + .body( + StringBody( + """{ + | "namespace": #{namespaceJsonPath}, + | "properties": #{initialJsonProperties} + |}""".stripMargin + ) + ) + .saveHttpStatusCode() + .check(status.is(200)) + .check(jsonPath("$.namespace").is("#{namespaceJsonPath}")) + ) + + /** + * Retrieves details of a specific namespace by its path. The namespace path and properties are + * verified against the values defined in the [[NamespaceActions.namespaceFetchFeeder]]. This + * operation validates the namespace existence and its configuration. + * + * There is no limit to the number of users that can fetch namespaces concurrently. + */ + val fetchNamespace: ChainBuilder = exec( + http("Fetch Namespace") + .get("/api/catalog/v1/#{catalogName}/namespaces/#{namespaceMultipartPath}") + .header("Authorization", "Bearer #{accessToken}") + .check(status.is(200)) + .check(jsonPath("$.namespace").is("#{namespaceJsonPath}")) + .check( + jsonPath("$.properties") + .transform(str => EntityProperties.filterMapByPrefix(str, "InitialAttribute_")) + .is("#{initialProperties}") + ) + .check( + jsonPath("$.properties") + .transform(str => EntityProperties.filterMapByPrefix(str, "location")) + .is("#{location}") + ) + ) + + /** + * Checks if a specific namespace exists by its path. + */ + val checkNamespaceExists: ChainBuilder = exec( + http("Check Namespace Exists") + .head("/api/catalog/v1/#{catalogName}/namespaces/#{namespaceMultipartPath}") + .header("Authorization", "Bearer #{accessToken}") + .check(status.is(204)) + ) + + /** + * Lists all child namespaces under a specific parent namespace. This operation retrieves the + * immediate children of a given namespace, supporting the hierarchical nature of the namespace + * structure. + */ + val fetchAllChildrenNamespaces: ChainBuilder = exec( + http("Fetch all Namespaces under specific parent") + .get("/api/catalog/v1/#{catalogName}/namespaces?parent=#{namespaceMultipartPath}") + .header("Authorization", "Bearer #{accessToken}") + .check(status.is(200)) + ) + + val updateNamespaceProperties: ChainBuilder = + retryOnHttpStatus(maxRetries, retryableHttpCodes, "Update namespace properties")( + http("Update Namespace Properties") + .post("/api/catalog/v1/#{catalogName}/namespaces/#{namespaceMultipartPath}/properties") + .header("Authorization", "Bearer #{accessToken}") + .header("Content-Type", "application/json") + .body( + StringBody( + """{ + | "removals": [], + | "updates": #{jsonPropertyUpdates} + |}""".stripMargin + ) + ) + .saveHttpStatusCode() + .check(status.is(200)) + ) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/TableActions.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/TableActions.scala new file mode 100644 index 0000000000..fcfbe343bd --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/TableActions.scala @@ -0,0 +1,256 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.actions + +import io.gatling.core.Predef._ +import io.gatling.core.feeder.Feeder +import io.gatling.core.structure.ChainBuilder +import io.gatling.http.Predef._ +import org.apache.polaris.benchmarks.RetryOnHttpCodes.{ + retryOnHttpStatus, + HttpRequestBuilderWithStatusSave +} +import org.apache.polaris.benchmarks.parameters.DatasetParameters +import org.slf4j.LoggerFactory +import play.api.libs.json.Format.GenericFormat +import play.api.libs.json.OFormat.oFormatFromReadsAndOWrites +import play.api.libs.json.{Format, Json} + +import java.util.concurrent.atomic.AtomicReference + +/** + * Actions for performance testing table operations. This class provides methods to create and + * manage tables within namespaces. + * + * @param dp Dataset parameters controlling the dataset generation + * @param accessToken Reference to the authentication token shared across actions + * @param maxRetries Maximum number of retry attempts for failed operations + * @param retryableHttpCodes HTTP status codes that should trigger a retry + */ +case class TableActions( + dp: DatasetParameters, + accessToken: AtomicReference[String], + maxRetries: Int = 10, + retryableHttpCodes: Set[Int] = Set(409, 500) +) { + private val logger = LoggerFactory.getLogger(getClass) + + /** + * Creates a base Gatling Feeder that generates table identities. Each row contains the basic + * information needed to identify a table: catalog name, namespace path, and table name. Tables + * are named "T_n" where n is derived from the namespace and table position. + * + * @return An iterator providing table identity details + */ + def tableIdentityFeeder(): Feeder[Any] = dp.nAryTree.lastLevelOrdinals.iterator + .flatMap { namespaceId => + val positionInLevel = namespaceId - dp.nAryTree.lastLevelOrdinals.head + val parentNamespacePath: Seq[String] = dp.nAryTree + .pathToRoot(namespaceId) + .map(ordinal => s"NS_$ordinal") + Range(0, dp.numTablesPerNs) + .map { j => + val tableId = positionInLevel * dp.numTablesPerNs + j + Map( + "catalogName" -> "C_0", + "parentNamespacePath" -> parentNamespacePath, + "multipartNamespace" -> parentNamespacePath.mkString("%1F"), + "tableName" -> s"T_$tableId" + ) + } + } + .take(dp.numTables) + + /** + * Creates a Gatling Feeder that generates table creation details. Each row builds upon the table + * identity information of [[TableActions.tableIdentityFeeder]] and adds schema and property + * details needed for table creation. + * + * @return An iterator providing table creation details + */ + def tableCreationFeeder(): Feeder[Any] = tableIdentityFeeder() + .map { row => + // The field identifiers start at 1 because if they start at 0, they will be overwritten by Iceberg. + // See https://github.com/apache/iceberg/issues/10084 + val fields: Seq[TableField] = (1 to dp.numColumns) + .map(id => TableField(id = id, name = s"column$id", `type` = "int", required = true)) + val properties: Map[String, String] = (0 until dp.numTableProperties) + .map(id => s"InitialAttribute_$id" -> s"$id") + .toMap + row ++ Map( + "schemasType" -> "struct", + "schemasIdentifierFieldIds" -> "[1]", + "fieldsStr" -> Json.toJson(fields).toString(), + "fields" -> fields, + "initialJsonProperties" -> Json.toJson(properties).toString() + ) + } + + /** + * Creates a Gatling Feeder that generates table property updates. Each row contains a single + * property update targeting a specific table. + * + * @return An iterator providing table property update details + */ + def propertyUpdateFeeder(): Feeder[Any] = tableIdentityFeeder() + .flatMap(row => + Range(0, dp.numTablePropertyUpdates) + .map(k => row + ("newProperty" -> s"""{"NewAttribute_$k": "NewValue_$k"}""")) + ) + + /** + * Creates a Gatling Feeder that generates table details. Each row builds upon the table creation + * information and adds schema expectations for fetch verification. The details should be used to + * verify the table schema and properties after creation. + * + * @return An iterator providing table fetch details with expected response values + */ + def tableFetchFeeder(): Feeder[Any] = tableIdentityFeeder() + .map { row => + val catalogName: String = row("catalogName").asInstanceOf[String] + val parentNamespacePath: Seq[String] = row("parentNamespacePath").asInstanceOf[Seq[String]] + val tableName: String = row("tableName").asInstanceOf[String] + val initialProperties: Map[String, String] = (0 until dp.numTableProperties) + .map(id => s"InitialAttribute_$id" -> s"$id") + .toMap + row ++ Map( + "initialProperties" -> initialProperties, + "location" -> s"${dp.defaultBaseLocation}/$catalogName/${parentNamespacePath.mkString("/")}/$tableName" + ) + } + + /** + * Creates a new table in a specified namespace. The table is created with a name, schema + * definition, and properties that are defined in the [[TableActions.tableCreationFeeder]]. The + * operation includes retry logic for handling transient failures. + * + * There is no limit to the number of users that can create tables concurrently. + */ + val createTable: ChainBuilder = retryOnHttpStatus(maxRetries, retryableHttpCodes, "Create table")( + http("Create Table") + .post("/api/catalog/v1/#{catalogName}/namespaces/#{multipartNamespace}/tables") + .header("Authorization", "Bearer #{accessToken}") + .header("Content-Type", "application/json") + .body( + StringBody( + """{ + | "name": "#{tableName}", + | "stage-create": false, + | "schema": { + | "type": "#{schemasType}", + | "fields": #{fieldsStr}, + | "identifier-field-ids": #{schemasIdentifierFieldIds} + | }, + | "properties": #{initialJsonProperties} + |}""".stripMargin + ) + ) + .saveHttpStatusCode() + .check(status.is(200)) + ) + + /** + * Retrieves details of a specific table by its name and namespace path. The table location, + * schema, and properties are verified against the values defined in the + * [[TableActions.tableFetchFeeder]]. This operation validates the table existence and its + * configuration. + * + * There is no limit to the number of users that can fetch tables concurrently. + */ + val fetchTable: ChainBuilder = exec( + http("Fetch Table") + .get("/api/catalog/v1/#{catalogName}/namespaces/#{multipartNamespace}/tables/#{tableName}") + .header("Authorization", "Bearer #{accessToken}") + .check(status.is(200)) + .check(jsonPath("$.metadata.table-uuid").saveAs("tableUuid")) + .check(jsonPath("$.metadata.location").is("#{location}")) + .check( + jsonPath("$.metadata.properties") + .transform(str => EntityProperties.filterMapByPrefix(str, "InitialAttribute_")) + .is("#{initialProperties}") + ) + ) + + /** + * Checks if a specific table exists by its name and namespace path. + */ + val checkTableExists: ChainBuilder = exec( + http("Check Table Exists") + .head("/api/catalog/v1/#{catalogName}/namespaces/#{multipartNamespace}/tables/#{tableName}") + .header("Authorization", "Bearer #{accessToken}") + .check(status.is(204)) + ) + + /** + * Lists all tables under a specific namespace. This operation retrieves all tables within the + * given namespace, supporting bulk retrieval of table metadata. + */ + val fetchAllTables: ChainBuilder = exec( + http("Fetch all Tables under parent namespace") + .get("/api/catalog/v1/#{catalogName}/namespaces/#{multipartNamespace}/tables") + .header("Authorization", "Bearer #{accessToken}") + .check(status.is(200)) + ) + + /** + * Updates the properties of a specific table by its name and namespace path. The table properties + * are updated with new values defined in the [[TableActions.propertyUpdateFeeder]]. + * + * There is no limit to the number of users that can update table properties concurrently. + */ + val updateTable: ChainBuilder = + retryOnHttpStatus(maxRetries, retryableHttpCodes, "Update table metadata")( + http("Update table metadata") + .post("/api/catalog/v1/#{catalogName}/namespaces/#{multipartNamespace}/tables/#{tableName}") + .header("Authorization", "Bearer #{accessToken}") + .header("Content-Type", "application/json") + .body( + StringBody( + s"""{ + | "updates": [{ + | "action": "set-properties", + | "updates": #{newProperty} + | }] + |}""".stripMargin + ) + ) + .saveHttpStatusCode() + .check(status.is(200).saveAs("lastStatus")) + ) +} + +/** + * This object provides JSON serialization for the table field schema so that it can be used in + * Gatling response checks. + */ +object TableField { + implicit val format: Format[TableField] = Json.format[TableField] + + def fromList(json: String): Seq[TableField] = Json.parse(json).as[Seq[TableField]] +} + +/** + * A case class representing a table field schema. + * @param id Field identifier + * @param name Field name + * @param `type` Field type + * @param required Field requirement + */ +case class TableField(id: Int, name: String, `type`: String, required: Boolean) diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/ViewActions.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/ViewActions.scala new file mode 100644 index 0000000000..7af810f5b0 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/ViewActions.scala @@ -0,0 +1,243 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.actions + +import io.gatling.core.Predef._ +import io.gatling.core.feeder.Feeder +import io.gatling.core.structure.ChainBuilder +import io.gatling.http.Predef._ +import org.apache.polaris.benchmarks.RetryOnHttpCodes.{ + retryOnHttpStatus, + HttpRequestBuilderWithStatusSave +} +import org.apache.polaris.benchmarks.parameters.DatasetParameters +import org.slf4j.LoggerFactory +import play.api.libs.json.{Format, Json} + +import java.time.Instant +import java.util.concurrent.atomic.AtomicReference + +case class ViewActions( + dp: DatasetParameters, + accessToken: AtomicReference[String], + maxRetries: Int = 10, + retryableHttpCodes: Set[Int] = Set(409, 500) +) { + private val logger = LoggerFactory.getLogger(getClass) + + /** + * Creates a base Gatling Feeder that generates view identities. Each row contains the basic + * information needed to identify a view: catalog name, namespace path, and view name. + * + * @return An iterator providing view identity details + */ + def viewIdentityFeeder(): Feeder[Any] = dp.nAryTree.lastLevelOrdinals.iterator + .flatMap { namespaceId => + val catalogId = 0 + val parentNamespacePath: Seq[String] = dp.nAryTree + .pathToRoot(namespaceId) + .map(ordinal => s"NS_$ordinal") + val positionInLevel = namespaceId - dp.nAryTree.lastLevelOrdinals.head + + Range(0, dp.numViewsPerNs) + .map { j => + // Ensure the view ID matches that of the associated table + val viewId = positionInLevel * dp.numTablesPerNs + j + Map( + "catalogName" -> s"C_$catalogId", + "parentNamespacePath" -> parentNamespacePath, + "multipartNamespace" -> parentNamespacePath.mkString("%1F"), + "viewName" -> s"V_$viewId", + "viewId" -> viewId + ) + } + } + .take(dp.numViews) + + /** + * Creates a Gatling Feeder that generates view creation details. Each row builds upon the view + * identity information and adds schema and query details needed for view creation. + * + * @return An iterator providing view creation details + */ + def viewCreationFeeder(): Feeder[Any] = viewIdentityFeeder() + .map { row => + val viewId = row("viewId").asInstanceOf[Int] + val tableName = s"T_$viewId" + val fields: Seq[ViewField] = (1 to dp.numColumns) + .map(id => ViewField(id = id, name = s"column$id", `type` = "int", required = true)) + val properties: Map[String, String] = (0 until dp.numTableProperties) + .map(id => s"InitialAttribute_$id" -> s"$id") + .toMap + row ++ Map( + "tableName" -> tableName, // Reference the table at the same index as the view + "timestamp" -> Instant.now().toEpochMilli.toString, + "fieldsStr" -> Json.toJson(fields).toString(), + "fields" -> fields, + "sqlQuery" -> s"SELECT * FROM $tableName", + "initialJsonProperties" -> Json.toJson(properties).toString() + ) + } + + /** + * Creates a Gatling Feeder that generates view property updates. Each row contains a single + * property update targeting a specific view. + * + * @return An iterator providing view property update details + */ + def propertyUpdateFeeder(): Feeder[Any] = viewIdentityFeeder() + .flatMap(row => + Range(0, dp.numViewPropertyUpdates) + .map(k => row + ("newProperty" -> s"""{"NewAttribute_$k": "NewValue_$k"}""")) + ) + + /** + * Creates a Gatling Feeder that generates view details. Each row builds upon the view creation + * information and adds schema expectations for fetch verification. The details should be used to + * verify the view schema and properties after creation. + * + * @return An iterator providing view fetch details with expected response values + */ + def viewFetchFeeder(): Feeder[Any] = viewCreationFeeder() + .map { row => + val catalogName: String = row("catalogName").asInstanceOf[String] + val parentNamespacePath: Seq[String] = row("parentNamespacePath").asInstanceOf[Seq[String]] + val viewName: String = row("viewName").asInstanceOf[String] + val initialProperties: Map[String, String] = (0 until dp.numTableProperties) + .map(id => s"InitialAttribute_$id" -> s"$id") + .toMap + row ++ Map( + "initialProperties" -> initialProperties, + "location" -> s"${dp.defaultBaseLocation}/$catalogName/${parentNamespacePath.mkString("/")}/$viewName" + ) + } + + val createView: ChainBuilder = retryOnHttpStatus(maxRetries, retryableHttpCodes, "Create view")( + http("Create View") + .post("/api/catalog/v1/#{catalogName}/namespaces/#{multipartNamespace}/views") + .header("Authorization", "Bearer #{accessToken}") + .header("Content-Type", "application/json") + .body(StringBody("""{ + | "name": "#{viewName}", + | "view-version": { + | "version-id": 1, + | "timestamp-ms": #{timestamp}, + | "schema-id": 0, + | "summary": { + | "engine-version": "3.5.5", + | "app-id": "gatling-#{timestamp}", + | "engine-name": "spark", + | "iceberg-version": "Apache Iceberg 1.7.0" + | }, + | "default-namespace": ["#{multipartNamespace}"], + | "representations": [ + | { + | "type": "sql", + | "sql": "#{sqlQuery}", + | "dialect": "spark" + | } + | ] + | }, + | "schema": { + | "type": "struct", + | "schema-id": 0, + | "fields": #{fieldsStr} + | }, + | "properties": #{initialJsonProperties} + |}""".stripMargin)) + .check(status.is(200)) + ) + + val fetchView: ChainBuilder = exec( + http("Fetch View") + .get("/api/catalog/v1/#{catalogName}/namespaces/#{multipartNamespace}/views/#{viewName}") + .header("Authorization", "Bearer #{accessToken}") + .check(status.is(200)) + .check(jsonPath("$.metadata.view-uuid").saveAs("viewUuid")) + .check(jsonPath("$.metadata.location").is("#{location}")) + .check( + jsonPath("$.metadata.properties") + .transform(str => EntityProperties.filterMapByPrefix(str, "InitialAttribute_")) + .is("#{initialProperties}") + ) + ) + + /** + * Checks if a specific view exists by its name and namespace path. + */ + val checkViewExists: ChainBuilder = exec( + http("Check View Exists") + .head("/api/catalog/v1/#{catalogName}/namespaces/#{multipartNamespace}/views/#{viewName}") + .header("Authorization", "Bearer #{accessToken}") + .check(status.is(204)) + ) + + val fetchAllViews: ChainBuilder = exec( + http("Fetch all Views under parent namespace") + .get("/api/catalog/v1/#{catalogName}/namespaces/#{multipartNamespace}/views") + .header("Authorization", "Bearer #{accessToken}") + .check(status.is(200)) + ) + + /** + * Updates the properties of a specific view by its name and namespace path. The view properties + * are updated with new values defined in the [[ViewActions.propertyUpdateFeeder]]. + * + * There is no limit to the number of users that can update table properties concurrently. + */ + val updateView: ChainBuilder = + retryOnHttpStatus(maxRetries, retryableHttpCodes, "Update View metadata")( + http("Update View metadata") + .post("/api/catalog/v1/#{catalogName}/namespaces/#{multipartNamespace}/views/#{viewName}") + .header("Authorization", "Bearer #{accessToken}") + .header("Content-Type", "application/json") + .body( + StringBody( + s"""{ + | "updates": [{ + | "action": "set-properties", + | "updates": #{newProperty} + | }] + |}""".stripMargin + ) + ) + .saveHttpStatusCode() + .check(status.is(200).saveAs("lastStatus")) + ) +} + +/** + * This object provides JSON serialization for the view field schema so that it can be used in + * Gatling response checks. + */ +object ViewField { + implicit val format: Format[ViewField] = Json.format[ViewField] + + def fromList(json: String): Seq[ViewField] = Json.parse(json).as[Seq[ViewField]] +} + +/** + * A case class representing a view field schema. + * @param id Field identifier + * @param name Field name + * @param `type` Field type + * @param required Field requirement + */ +case class ViewField(id: Int, name: String, `type`: String, required: Boolean) diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/ConnectionParameters.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/ConnectionParameters.scala new file mode 100644 index 0000000000..2a097b0922 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/ConnectionParameters.scala @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.parameters + +/** + * Case class to hold the connection parameters for the benchmark. + * + * @param clientId The client ID for authentication. + * @param clientSecret The client secret for authentication. + * @param baseUrl The base URL of the Polaris service. + */ +case class ConnectionParameters(clientId: String, clientSecret: String, baseUrl: String) + extends Explainable { + override def explanations: List[String] = List( + s"The connection parameters point to the server at $baseUrl with client ID $clientId and client secret $clientSecret." + ) +} + +/** + * Object holding the `connectionParameters` instance, populated from environment variables. The + * `CLIENT_ID` and `CLIENT_SECRET` environment variables must be provided, otherwise authentication + * will fail. By default, the `BASE_URL` is "http://localhost:8181". + */ +object ConnectionParameters { + val connectionParameters: ConnectionParameters = ConnectionParameters( + sys.env("CLIENT_ID"), + sys.env("CLIENT_SECRET"), + sys.env.getOrElse("BASE_URL", "http://localhost:8181") + ) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/DatasetParameters.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/DatasetParameters.scala new file mode 100644 index 0000000000..b2ab84267c --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/DatasetParameters.scala @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.parameters + +import org.apache.polaris.benchmarks.NAryTreeBuilder + +/** + * Case class to hold the dataset parameters for the benchmark. + * + * @param numCatalogs The number of catalogs to create. + * @param defaultBaseLocation The default base location for the datasets. + * @param nsWidth The width of the namespace n-ary tree. + * @param nsDepth The depth of the namespace n-ary tree. + * @param numNamespaceProperties The number of namespace properties to create. + * @param numNamespacePropertyUpdates The number of namespace property updates to perform. + * @param numTablesPerNs The number of tables per namespace to create. + * @param numTablesMax The maximum number of tables to create. If set to -1, all tables are created. + * @param numColumns The number of columns per table to create. + * @param numTableProperties The number of table properties to create. + * @param numTablePropertyUpdates The number of table property updates to perform. + * @param numViewsPerNs The number of views per namespace to create. + * @param numViewsMax The maximum number of views to create. If set to -1, all views are created. + * @param numViewPropertyUpdates The number of view property updates to perform. + */ +case class DatasetParameters( + numCatalogs: Int, + defaultBaseLocation: String, + nsWidth: Int, + nsDepth: Int, + numNamespaceProperties: Int, + numNamespacePropertyUpdates: Int, + numTablesPerNs: Int, + numTablesMax: Int, + numColumns: Int, + numTableProperties: Int, + numTablePropertyUpdates: Int, + numViewsPerNs: Int, + numViewsMax: Int, + numViewPropertyUpdates: Int +) extends Explainable { + val nAryTree: NAryTreeBuilder = NAryTreeBuilder(nsWidth, nsDepth) + val numTables: Int = if (numTablesMax <= 0) { + nAryTree.numberOfLastLevelElements * numTablesPerNs + } else { + numTablesMax + } + + val numViews: Int = if (numViewsMax <= 0) { + nAryTree.numberOfLastLevelElements * numViewsPerNs + } else { + numViewsMax + } + + override def explanations: List[String] = List( + s"The dataset parameters describe $numCatalogs catalogs with a default base location of $defaultBaseLocation.", + s"In the first catalog, there is a complete n-ary tree of namespaces with width $nsWidth and depth $nsDepth, for a total of ${nAryTree.numberOfNodes} namespaces.", + s"Each namespace has $numNamespaceProperties properties and $numNamespacePropertyUpdates property updates.", + s"Each of the ${nAryTree.numberOfLastLevelElements} leaf namespaces has $numTablesPerNs tables, for a total of $numTables tables.", + s"Each of the ${nAryTree.numberOfLastLevelElements} leaf namespaces has $numViewsPerNs views, for a total of $numViews views.", + s"Each table has $numColumns columns and $numTableProperties properties.", + s"There are $numTablePropertyUpdates table property updates for each table, for a total of ${numTablePropertyUpdates * numTables} updates.", + s"There are $numViewPropertyUpdates view property updates for each view, for a total of ${numViewPropertyUpdates * numViews} updates." + ) +} + +/** + * Object holding the `datasetParameters` instance, populated from environment variables. Multiple + * catalogs can be created, but namespaces and other entities will only be created in the first + * catalog. Namespaces will be created in a complete n-ary tree structure. By default, we create one + * catalog and a complete n-ary tree of namespaces with width 2 and depth 4. Each namespace has 10 + * properties. Leaf namespaces have 5 tables with 10 columns and 10 properties each. + */ +object DatasetParameters { + val datasetParameters: DatasetParameters = DatasetParameters( + sys.env.getOrElse("NUM_CATALOGS", "1").toInt, + sys.env.getOrElse("DEFAULT_BASE_LOCATION", "file:///tmp/polaris"), + sys.env.getOrElse("NAMESPACE_WIDTH", "2").toInt, + sys.env.getOrElse("NAMESPACE_DEPTH", "4").toInt, + sys.env.getOrElse("NUM_NAMESPACE_PROPERTIES", "10").toInt, + sys.env.getOrElse("NUM_NAMESPACE_PROPERTY_UPDATES", "5").toInt, + sys.env.getOrElse("NUM_TABLES_PER_NAMESPACE", "5").toInt, + sys.env.getOrElse("NUM_TABLES_MAX", "-1").toInt, + sys.env.getOrElse("NUM_COLUMNS", "10").toInt, + sys.env.getOrElse("NUM_TABLE_PROPERTIES", "10").toInt, + sys.env.getOrElse("NUM_TABLE_PROPERTY_UPDATES", "10").toInt, + sys.env.getOrElse("NUM_VIEWS_PER_NAMESPACE", "3").toInt, + sys.env.getOrElse("NUM_VIEWS_MAX", "-1").toInt, + sys.env.getOrElse("NUM_VIEW_PROPERTY_UPDATES", "1").toInt + ) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/Explainable.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/Explainable.scala new file mode 100644 index 0000000000..49d63fe3cb --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/Explainable.scala @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.parameters + +/** + * Trait that provides a method to describe the parameters of a class. + */ +trait Explainable { + def explanations: List[String] +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/WorkloadParameters.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/WorkloadParameters.scala new file mode 100644 index 0000000000..78407ce0b9 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/WorkloadParameters.scala @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.parameters + +case class WorkloadParameters(readWriteRatio: Double) extends Explainable { + override def explanations: List[String] = List( + s"When applicable, the read/write ratio is ${gatlingReadRatio.round}% reads and ${gatlingWriteRatio.round}% writes." + ) + + val gatlingReadRatio: Double = readWriteRatio * 100 + val gatlingWriteRatio: Double = (1 - readWriteRatio) * 100 +} + +object WorkloadParameters { + val workloadParameters: WorkloadParameters = WorkloadParameters( + sys.env("READ_WRITE_RATIO").toDouble + ) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDataset.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDataset.scala new file mode 100644 index 0000000000..14d71782fb --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDataset.scala @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.simulations + +import io.gatling.core.Predef._ +import io.gatling.core.structure.ScenarioBuilder +import io.gatling.http.Predef._ +import org.apache.polaris.benchmarks.actions._ +import org.apache.polaris.benchmarks.parameters.ConnectionParameters.connectionParameters +import org.apache.polaris.benchmarks.parameters.DatasetParameters.datasetParameters +import org.apache.polaris.benchmarks.parameters.{ConnectionParameters, DatasetParameters} +import org.slf4j.LoggerFactory + +import java.util.concurrent.atomic.{AtomicInteger, AtomicReference} +import scala.concurrent.duration._ + +/** + * This simulation is a 100% write workload that creates a tree dataset in Polaris. It is intended + * to be used against an empty Polaris instance. + */ +class CreateTreeDataset extends Simulation { + private val logger = LoggerFactory.getLogger(getClass) + + // -------------------------------------------------------------------------------- + // Load parameters + // -------------------------------------------------------------------------------- + val cp: ConnectionParameters = connectionParameters + val dp: DatasetParameters = datasetParameters + cp.explanations.foreach(logger.info) + dp.explanations.foreach(logger.info) + + // -------------------------------------------------------------------------------- + // Helper values + // -------------------------------------------------------------------------------- + private val numNamespaces: Int = dp.nAryTree.numberOfNodes + private val accessToken: AtomicReference[String] = new AtomicReference() + + private val authenticationActions = AuthenticationActions(cp, accessToken, 5, Set(500)) + private val catalogActions = CatalogActions(dp, accessToken, 0, Set()) + private val namespaceActions = NamespaceActions(dp, accessToken, 5, Set(500)) + private val tableActions = TableActions(dp, accessToken, 0, Set()) + private val viewActions = ViewActions(dp, accessToken, 0, Set()) + + private val createdCatalogs = new AtomicInteger() + private val createdNamespaces = new AtomicInteger() + private val createdTables = new AtomicInteger() + private val createdViews = new AtomicInteger() + + // -------------------------------------------------------------------------------- + // Workload: Authenticate and store the access token for later use + // -------------------------------------------------------------------------------- + val authenticate: ScenarioBuilder = scenario("Authenticate using the OAuth2 REST API endpoint") + .feed(authenticationActions.feeder()) + .exec(authenticationActions.authenticateAndSaveAccessToken) + + // -------------------------------------------------------------------------------- + // Workload: Create catalogs + // -------------------------------------------------------------------------------- + val createCatalogs: ScenarioBuilder = + scenario("Create catalogs using the Polaris Management REST API") + .exec(authenticationActions.restoreAccessTokenInSession) + .asLongAs(session => + createdCatalogs.getAndIncrement() < dp.numCatalogs && session.contains("accessToken") + )( + feed(catalogActions.feeder()) + .exec(catalogActions.createCatalog) + ) + + // -------------------------------------------------------------------------------- + // Workload: Create namespaces + // -------------------------------------------------------------------------------- + val createNamespaces: ScenarioBuilder = scenario("Create namespaces using the Iceberg REST API") + .exec(authenticationActions.restoreAccessTokenInSession) + .asLongAs(session => + createdNamespaces.getAndIncrement() < numNamespaces && session.contains("accessToken") + )( + feed(namespaceActions.namespaceCreationFeeder()) + .exec(namespaceActions.createNamespace) + ) + + // -------------------------------------------------------------------------------- + // Workload: Create tables + // -------------------------------------------------------------------------------- + val createTables: ScenarioBuilder = scenario("Create tables using the Iceberg REST API") + .exec(authenticationActions.restoreAccessTokenInSession) + .asLongAs(session => + createdTables.getAndIncrement() < dp.numTables && session.contains("accessToken") + )( + feed(tableActions.tableCreationFeeder()) + .exec(tableActions.createTable) + ) + + // -------------------------------------------------------------------------------- + // Workload: Create views + // -------------------------------------------------------------------------------- + val createViews: ScenarioBuilder = scenario("Create views using the Iceberg REST API") + .exec(authenticationActions.restoreAccessTokenInSession) + .asLongAs(session => + createdViews.getAndIncrement() < dp.numViews && session.contains("accessToken") + )( + feed(viewActions.viewCreationFeeder()) + .exec(viewActions.createView) + ) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDatasetConcurrent.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDatasetConcurrent.scala new file mode 100644 index 0000000000..0f9dfd5e11 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDatasetConcurrent.scala @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.simulations + +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ +import org.slf4j.LoggerFactory + +import scala.concurrent.duration._ + +/** + * This simulation is a 100% write workload that creates a tree dataset in Polaris. It is intended + * to be used against an empty Polaris instance. It is a concurrent version of CreateTreeDataset, + * i.e. up to 50 requests are sent simultaneously. + */ +class CreateTreeDatasetConcurrent extends CreateTreeDataset { + private val logger = LoggerFactory.getLogger(getClass) + + // -------------------------------------------------------------------------------- + // Build up the HTTP protocol configuration and set up the simulation + // -------------------------------------------------------------------------------- + private val httpProtocol = http + .baseUrl(cp.baseUrl) + .acceptHeader("application/json") + .contentTypeHeader("application/json") + + setUp( + authenticate + .inject(atOnceUsers(1)) + .andThen(createCatalogs.inject(atOnceUsers(50))) + .andThen( + createNamespaces.inject( + constantUsersPerSec(1).during(1.seconds), + constantUsersPerSec(dp.nsWidth - 1).during(dp.nsDepth.seconds) + ) + ) + .andThen(createTables.inject(atOnceUsers(50))) + .andThen(createViews.inject(atOnceUsers(50))) + ).protocols(httpProtocol) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDatasetSequential.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDatasetSequential.scala new file mode 100644 index 0000000000..5818ee3c5f --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDatasetSequential.scala @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.simulations + +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ +import org.apache.polaris.benchmarks.actions._ +import org.apache.polaris.benchmarks.parameters.ConnectionParameters.connectionParameters +import org.apache.polaris.benchmarks.parameters.DatasetParameters.datasetParameters +import org.slf4j.LoggerFactory + +import java.util.concurrent.atomic.{AtomicInteger, AtomicReference} +import scala.concurrent.duration._ + +/** + * This simulation is a 100% write workload that creates a tree dataset in Polaris. It is intended + * to be used against an empty Polaris instance. It is a sequential version of CreateTreeDataset, + * i.e. only one request is sent at a time. + */ +class CreateTreeDatasetSequential extends CreateTreeDataset { + private val logger = LoggerFactory.getLogger(getClass) + + // -------------------------------------------------------------------------------- + // Build up the HTTP protocol configuration and set up the simulation + // -------------------------------------------------------------------------------- + private val httpProtocol = http + .baseUrl(cp.baseUrl) + .acceptHeader("application/json") + .contentTypeHeader("application/json") + + setUp( + authenticate + .inject(atOnceUsers(1)) + .andThen(createCatalogs.inject(atOnceUsers(1))) + .andThen(createNamespaces.inject(atOnceUsers(1))) + .andThen(createTables.inject(atOnceUsers(1))) + .andThen(createViews.inject(atOnceUsers(1))) + ).protocols(httpProtocol) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadTreeDataset.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadTreeDataset.scala new file mode 100644 index 0000000000..4e364a01b1 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadTreeDataset.scala @@ -0,0 +1,150 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.simulations + +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ +import org.apache.polaris.benchmarks.actions.{ + AuthenticationActions, + CatalogActions, + NamespaceActions, + TableActions, + ViewActions +} +import org.apache.polaris.benchmarks.parameters.ConnectionParameters.connectionParameters +import org.apache.polaris.benchmarks.parameters.DatasetParameters.datasetParameters +import org.slf4j.LoggerFactory + +import java.util.concurrent.atomic.{AtomicInteger, AtomicReference} + +/** + * This simulation is a 100% read workload that fetches a tree dataset in Polaris. It is intended to + * be used against a Polaris instance with a pre-existing tree dataset. It has no side effect on the + * dataset and therefore can be executed multiple times without any issue. + */ +class ReadTreeDataset extends Simulation { + private val logger = LoggerFactory.getLogger(getClass) + + // -------------------------------------------------------------------------------- + // Load parameters + // -------------------------------------------------------------------------------- + private val cp = connectionParameters + private val dp = datasetParameters + cp.explanations.foreach(logger.info) + dp.explanations.foreach(logger.info) + + // -------------------------------------------------------------------------------- + // Helper values + // -------------------------------------------------------------------------------- + private val numNamespaces: Int = dp.nAryTree.numberOfNodes + private val accessToken: AtomicReference[String] = new AtomicReference() + + private val authenticationActions = AuthenticationActions(cp, accessToken) + private val catalogActions = CatalogActions(dp, accessToken) + private val namespaceActions = NamespaceActions(dp, accessToken) + private val tableActions = TableActions(dp, accessToken) + private val viewActions = ViewActions(dp, accessToken) + + private val verifiedCatalogs = new AtomicInteger() + private val verifiedNamespaces = new AtomicInteger() + private val verifiedTables = new AtomicInteger() + private val verifiedViews = new AtomicInteger() + + // -------------------------------------------------------------------------------- + // Workload: Authenticate and store the access token for later use + // -------------------------------------------------------------------------------- + private val authenticate = scenario("Authenticate using the OAuth2 REST API endpoint") + .feed(authenticationActions.feeder()) + .tryMax(5) { + exec(authenticationActions.authenticateAndSaveAccessToken) + } + + // -------------------------------------------------------------------------------- + // Workload: Verify each catalog + // -------------------------------------------------------------------------------- + private val verifyCatalogs = scenario("Verify catalogs using the Polaris Management REST API") + .exec(authenticationActions.restoreAccessTokenInSession) + .asLongAs(session => + verifiedCatalogs.getAndIncrement() < dp.numCatalogs && session.contains("accessToken") + )( + feed(catalogActions.feeder()) + .exec(catalogActions.fetchCatalog) + ) + + // -------------------------------------------------------------------------------- + // Workload: Verify namespaces + // -------------------------------------------------------------------------------- + private val verifyNamespaces = scenario("Verify namespaces using the Iceberg REST API") + .exec(authenticationActions.restoreAccessTokenInSession) + .asLongAs(session => + verifiedNamespaces.getAndIncrement() < numNamespaces && session.contains("accessToken") + )( + feed(namespaceActions.namespaceFetchFeeder()) + .exec(namespaceActions.fetchAllChildrenNamespaces) + .exec(namespaceActions.checkNamespaceExists) + .exec(namespaceActions.fetchNamespace) + ) + + // -------------------------------------------------------------------------------- + // Workload: Verify tables + // -------------------------------------------------------------------------------- + private val verifyTables = scenario("Verify tables using the Iceberg REST API") + .exec(authenticationActions.restoreAccessTokenInSession) + .asLongAs(session => + verifiedTables.getAndIncrement() < dp.numTables && session.contains("accessToken") + )( + feed(tableActions.tableFetchFeeder()) + .exec(tableActions.fetchAllTables) + .exec(tableActions.checkTableExists) + .exec(tableActions.fetchTable) + ) + + // -------------------------------------------------------------------------------- + // Workload: Verify views + // -------------------------------------------------------------------------------- + private val verifyViews = scenario("Verify views using the Iceberg REST API") + .exec(authenticationActions.restoreAccessTokenInSession) + .asLongAs(session => + verifiedViews.getAndIncrement() < dp.numViews && session.contains("accessToken") + )( + feed(viewActions.viewFetchFeeder()) + .exec(viewActions.fetchAllViews) + .exec(viewActions.checkViewExists) + .exec(viewActions.fetchView) + ) + + // -------------------------------------------------------------------------------- + // Build up the HTTP protocol configuration and set up the simulation + // -------------------------------------------------------------------------------- + private val httpProtocol = http + .baseUrl(cp.baseUrl) + .acceptHeader("application/json") + .contentTypeHeader("application/json") + + setUp( + authenticate + .inject(atOnceUsers(1)) + .andThen(verifyCatalogs.inject(atOnceUsers(1))) + .andThen(verifyNamespaces.inject(atOnceUsers(dp.nsDepth))) + .andThen(verifyTables.inject(atOnceUsers(50))) + .andThen(verifyViews.inject(atOnceUsers(50))) + ) + .protocols(httpProtocol) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDataset.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDataset.scala new file mode 100644 index 0000000000..13bbb0d94e --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDataset.scala @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.simulations + +import io.gatling.core.Predef._ +import io.gatling.core.structure.ScenarioBuilder +import io.gatling.http.Predef._ +import org.apache.polaris.benchmarks.actions._ +import org.apache.polaris.benchmarks.parameters.{ + ConnectionParameters, + DatasetParameters, + WorkloadParameters +} +import org.apache.polaris.benchmarks.parameters.ConnectionParameters.connectionParameters +import org.apache.polaris.benchmarks.parameters.DatasetParameters.datasetParameters +import org.apache.polaris.benchmarks.parameters.WorkloadParameters.workloadParameters +import org.apache.polaris.benchmarks.util.CircularIterator +import org.slf4j.LoggerFactory + +import java.util.concurrent.atomic.AtomicReference +import scala.concurrent.duration.DurationInt + +class ReadUpdateTreeDataset extends Simulation { + private val logger = LoggerFactory.getLogger(getClass) + + // -------------------------------------------------------------------------------- + // Load parameters + // -------------------------------------------------------------------------------- + val cp: ConnectionParameters = connectionParameters + val dp: DatasetParameters = datasetParameters + val wp: WorkloadParameters = workloadParameters + cp.explanations.foreach(logger.info) + dp.explanations.foreach(logger.info) + wp.explanations.foreach(logger.info) + + // -------------------------------------------------------------------------------- + // Helper values + // -------------------------------------------------------------------------------- + private val numNamespaces: Int = dp.nAryTree.numberOfNodes + private val accessToken: AtomicReference[String] = new AtomicReference() + + private val authActions = AuthenticationActions(cp, accessToken) + private val catActions = CatalogActions(dp, accessToken) + private val nsActions = NamespaceActions(dp, accessToken) + private val tblActions = TableActions(dp, accessToken) + private val viewActions = ViewActions(dp, accessToken) + + // -------------------------------------------------------------------------------- + // Workload: Authenticate and store the access token for later use + // -------------------------------------------------------------------------------- + val authenticate: ScenarioBuilder = scenario("Authenticate using the OAuth2 REST API endpoint") + .feed(authActions.feeder()) + .tryMax(5) { + exec(authActions.authenticateAndSaveAccessToken) + } + + private val nsListFeeder = new CircularIterator(nsActions.namespaceIdentityFeeder) + private val nsExistsFeeder = new CircularIterator(nsActions.namespaceIdentityFeeder) + private val nsFetchFeeder = new CircularIterator(nsActions.namespaceFetchFeeder) + private val nsUpdateFeeder = new CircularIterator(nsActions.namespacePropertiesUpdateFeeder) + + private val tblListFeeder = new CircularIterator(tblActions.tableIdentityFeeder) + private val tblExistsFeeder = new CircularIterator(tblActions.tableIdentityFeeder) + private val tblFetchFeeder = new CircularIterator(tblActions.tableFetchFeeder) + private val tblUpdateFeeder = new CircularIterator(tblActions.propertyUpdateFeeder) + + private val viewListFeeder = new CircularIterator(viewActions.viewIdentityFeeder) + private val viewExistsFeeder = new CircularIterator(viewActions.viewIdentityFeeder) + private val viewFetchFeeder = new CircularIterator(viewActions.viewFetchFeeder) + private val viewUpdateFeeder = new CircularIterator(viewActions.propertyUpdateFeeder) + + // -------------------------------------------------------------------------------- + // Workload: Randomly read and write entities + // -------------------------------------------------------------------------------- + val readWriteScenario: ScenarioBuilder = + scenario("Read and write entities using the Iceberg REST API") + .exec(authActions.restoreAccessTokenInSession) + .randomSwitch( + wp.gatlingReadRatio -> group("Read")( + uniformRandomSwitch( + exec(feed(nsListFeeder).exec(nsActions.fetchAllChildrenNamespaces)), + exec(feed(nsExistsFeeder).exec(nsActions.checkNamespaceExists)), + exec(feed(nsFetchFeeder).exec(nsActions.fetchNamespace)), + exec(feed(tblListFeeder).exec(tblActions.fetchAllTables)), + exec(feed(tblExistsFeeder).exec(tblActions.checkTableExists)), + exec(feed(tblFetchFeeder).exec(tblActions.fetchTable)), + exec(feed(viewListFeeder).exec(viewActions.fetchAllViews)), + exec(feed(viewExistsFeeder).exec(viewActions.checkViewExists)), + exec(feed(viewFetchFeeder).exec(viewActions.fetchView)) + ) + ), + wp.gatlingWriteRatio -> group("Write")( + uniformRandomSwitch( + exec(feed(nsUpdateFeeder).exec(nsActions.updateNamespaceProperties)), + exec(feed(tblUpdateFeeder).exec(tblActions.updateTable)), + exec(feed(viewUpdateFeeder).exec(viewActions.updateView)) + ) + ) + ) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDatasetConcurrent.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDatasetConcurrent.scala new file mode 100644 index 0000000000..35e219ab2b --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDatasetConcurrent.scala @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.simulations + +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ + +import scala.concurrent.duration.DurationInt + +class ReadUpdateTreeDatasetConcurrent extends ReadUpdateTreeDataset { + // -------------------------------------------------------------------------------- + // Build up the HTTP protocol configuration and set up the simulation + // -------------------------------------------------------------------------------- + private val httpProtocol = http + .baseUrl(cp.baseUrl) + .acceptHeader("application/json") + .contentTypeHeader("application/json") + + setUp( + authenticate + .inject(atOnceUsers(1)) + .andThen(readWriteScenario.inject(constantUsersPerSec(100).during(5.minutes).randomized)) + ).protocols(httpProtocol) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDatasetSequential.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDatasetSequential.scala new file mode 100644 index 0000000000..a88887140a --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDatasetSequential.scala @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.simulations + +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ +import org.apache.polaris.benchmarks.actions._ +import org.apache.polaris.benchmarks.parameters.ConnectionParameters.connectionParameters +import org.apache.polaris.benchmarks.parameters.DatasetParameters.datasetParameters +import org.apache.polaris.benchmarks.util.CircularIterator +import org.slf4j.LoggerFactory + +import java.util.concurrent.atomic.AtomicReference +import scala.concurrent.duration.DurationInt + +class ReadUpdateTreeDatasetSequential extends ReadUpdateTreeDataset { + // -------------------------------------------------------------------------------- + // Build up the HTTP protocol configuration and set up the simulation + // -------------------------------------------------------------------------------- + private val httpProtocol = http + .baseUrl(cp.baseUrl) + .acceptHeader("application/json") + .contentTypeHeader("application/json") + + setUp( + authenticate + .inject(atOnceUsers(1)) + .andThen(readWriteScenario.inject(constantUsersPerSec(1).during(5.minutes))) + ).protocols(httpProtocol) +} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/util/CircularIterator.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/util/CircularIterator.scala new file mode 100644 index 0000000000..8ee3514c29 --- /dev/null +++ b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/util/CircularIterator.scala @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.polaris.benchmarks.util + +import scala.util.Random + +class CircularIterator[T](builder: () => Iterator[T]) extends Iterator[T] { + private var currentIterator: Iterator[T] = builder() + + override def hasNext: Boolean = true + + override def next(): T = synchronized { + if (!currentIterator.hasNext) { + currentIterator = builder() + } + currentIterator.next() + } +} + +class BufferedRandomIterator[T](underlying: CircularIterator[T], bufferSize: Int) + extends Iterator[T] { + private var buffer: Iterator[T] = populateAndShuffle() + + private def populateAndShuffle(): Iterator[T] = + Random.shuffle((1 to bufferSize).map(_ => underlying.next()).toList).iterator + + override def hasNext: Boolean = true + + override def next(): T = synchronized { + if (!buffer.hasNext) { + buffer = populateAndShuffle() + } + buffer.next() + } +} diff --git a/getting-started/assets/polaris/create-catalog.sh b/getting-started/assets/polaris/create-catalog.sh index f069c66376..e133034d61 100755 --- a/getting-started/assets/polaris/create-catalog.sh +++ b/getting-started/assets/polaris/create-catalog.sh @@ -50,7 +50,7 @@ curl -s -H "Authorization: Bearer ${token}" \ "storageConfigInfo": { "storageType": "FILE", "allowedLocations": [ - "file:///tmp" + "file:///tmp/polaris/" ] } } diff --git a/getting-started/dremio-polaris-mongo/docker-compose.yml b/getting-started/dremio-polaris-mongo/docker-compose.yml new file mode 100644 index 0000000000..845a042526 --- /dev/null +++ b/getting-started/dremio-polaris-mongo/docker-compose.yml @@ -0,0 +1,31 @@ +services: + mongo: + image: mongo + ports: + - "27017:27017" + healthcheck: + test: ["CMD", "mongosh", "--quiet", "--eval", "try { db.adminCommand('ping').ok } catch (error) { exit(1) }"] + interval: 60s + timeout: 5s + retries: 3 + start_period: 5s + + dremio-polaris: + image: gcr.io/dremio-1093/dremio-ee-catalog-server:dremio-release-master-12071 + environment: + - quarkus.mongodb.connection-string=mongodb://mongo:27017 + - polaris.backend.name=MongoDb + - dremio.catalog.auth.type=noop + - polaris.bootstrap.credentials=dremio,root,s3cr3t + ports: + - "8181:8181" + - "8182:8182" + depends_on: + mongo: + condition: service_healthy + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8182/q/health"] + interval: 60s + timeout: 5s + retries: 3 + start_period: 10s diff --git a/getting-started/eclipselink-3-replicas/README.md b/getting-started/eclipselink-3-replicas/README.md new file mode 100644 index 0000000000..31e5586a71 --- /dev/null +++ b/getting-started/eclipselink-3-replicas/README.md @@ -0,0 +1,71 @@ + + +# Getting Started with 3 Apache Polaris replicas, EclipseLink and Postgres + +This example requires `jq` to be installed on your machine. + +1. If such an image is not already present, build the Polaris image with support for EclipseLink and + the Postgres JDBC driver: + + ```shell + ./gradlew clean :polaris-quarkus-server:assemble :polaris-quarkus-admin:assemble \ + -PeclipseLinkDeps=org.postgresql:postgresql:42.7.4 \ + -Dquarkus.container-image.tag=postgres-latest \ + -Dquarkus.container-image.build=true \ + --no-build-cache + ``` + +2. Start the docker compose group by running the following command from the root of the repository: + + ```shell + docker compose -f getting-started/eclipselink/docker-compose.yml up + ``` + +3. To access Polaris from the host machine, first request an access token: + + ```shell + export POLARIS_TOKEN=$(curl -s http://polaris:8181/api/catalog/v1/oauth/tokens \ + --resolve polaris:8181:127.0.0.1 \ + --user root:s3cr3t \ + -d 'grant_type=client_credentials' \ + -d 'scope=PRINCIPAL_ROLE:ALL' | jq -r .access_token) + ``` + +4. Optionally, use the `X-Upstream-Addr` response header to identify the replica that served a request: + + ```shell + $ curl -v http://127.0.0.1:8181/api/management/v1/principal-roles -H "Authorization: Bearer $POLARIS_TOKEN" + [...] + < HTTP/1.1 200 OK + < Server: nginx/1.27.4 + < Date: Wed, 05 Mar 2025 10:29:52 GMT + < Content-Type: application/json;charset=UTF-8 + < Content-Length: 454 + < Connection: keep-alive + < X-Upstream-Addr: 172.19.0.3:8181 + [...] + ``` + +5. Then, use the access token in the Authorization header when accessing Polaris: + + ```shell + curl -v http://127.0.0.1:8181/api/management/v1/principal-roles -H "Authorization: Bearer $POLARIS_TOKEN" + curl -v http://127.0.0.1:8181/api/catalog/v1/config?warehouse=polaris_demo -H "Authorization: Bearer $POLARIS_TOKEN" + ``` diff --git a/getting-started/eclipselink-3-replicas/docker-compose.yml b/getting-started/eclipselink-3-replicas/docker-compose.yml new file mode 100644 index 0000000000..5e420eef64 --- /dev/null +++ b/getting-started/eclipselink-3-replicas/docker-compose.yml @@ -0,0 +1,152 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# + +services: + polaris-1: + image: apache/polaris:postgres-latest + depends_on: + polaris-bootstrap: + condition: service_completed_successfully + postgres: + condition: service_healthy + environment: + JAVA_DEBUG: "true" + JAVA_DEBUG_PORT: "*:5005" + JAVA_OPTS: "-Dsuspend -Ddebug -XX:+UseParallelGC -Xms1G -Xmx1G -XX:+AlwaysPreTouch -Xlog:gc*=debug,safepoint*:file=/tmp/gc.log:uptime,tags,level:filecount=1,filesize=200M" + polaris.persistence.type: eclipse-link + polaris.persistence.eclipselink.configuration-file: /deployments/config/eclipselink/persistence.xml + polaris.realm-context.realms: POLARIS + polaris.authentication.token-broker.type: symmetric-key + polaris.authentication.token-broker.symmetric-key.secret: THE_VERY_SECRET_KEY + quarkus.otel.sdk.disabled: "true" + volumes: + - ../assets/eclipselink/:/deployments/config/eclipselink + healthcheck: + test: ["CMD", "curl", "http://localhost:8182/q/health"] + interval: 2s + timeout: 10s + retries: 10 + + polaris-2: + image: apache/polaris:postgres-latest + depends_on: + polaris-bootstrap: + condition: service_completed_successfully + postgres: + condition: service_healthy + environment: + JAVA_DEBUG: "true" + JAVA_DEBUG_PORT: "*:5006" # Changed debug port + JAVA_OPTS: "-Dsuspend -Ddebug -XX:+UseParallelGC -Xms1G -Xmx1G -XX:+AlwaysPreTouch -Xlog:gc*=debug,safepoint*:file=/tmp/gc.log:uptime,tags,level:filecount=1,filesize=200M" + polaris.persistence.type: eclipse-link + polaris.persistence.eclipselink.configuration-file: /deployments/config/eclipselink/persistence.xml + polaris.realm-context.realms: POLARIS + polaris.authentication.token-broker.type: symmetric-key + polaris.authentication.token-broker.symmetric-key.secret: THE_VERY_SECRET_KEY + quarkus.otel.sdk.disabled: "true" + volumes: + - ../assets/eclipselink/:/deployments/config/eclipselink + healthcheck: + test: ["CMD", "curl", "http://localhost:8182/q/health"] + interval: 2s + timeout: 10s + retries: 10 + + polaris-3: + image: apache/polaris:postgres-latest + depends_on: + polaris-bootstrap: + condition: service_completed_successfully + postgres: + condition: service_healthy + environment: + JAVA_DEBUG: "true" + JAVA_DEBUG_PORT: "*:5007" # Changed debug port + JAVA_OPTS: "-Dsuspend -Ddebug -XX:+UseParallelGC -Xms1G -Xmx1G -XX:+AlwaysPreTouch -Xlog:gc*=debug,safepoint*:file=/tmp/gc.log:uptime,tags,level:filecount=1,filesize=200M" + polaris.persistence.type: eclipse-link + polaris.persistence.eclipselink.configuration-file: /deployments/config/eclipselink/persistence.xml + polaris.realm-context.realms: POLARIS + polaris.authentication.token-broker.type: symmetric-key + polaris.authentication.token-broker.symmetric-key.secret: THE_VERY_SECRET_KEY + quarkus.otel.sdk.disabled: "true" + volumes: + - ../assets/eclipselink/:/deployments/config/eclipselink + healthcheck: + test: ["CMD", "curl", "http://localhost:8182/q/health"] + interval: 2s + timeout: 10s + retries: 10 + + polaris: + image: nginx:latest + ports: + - "8181:8181" # Expose on port 8181 + depends_on: + - polaris-1 + - polaris-2 + - polaris-3 + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf:ro + healthcheck: + test: ["CMD", "nginx", "-t"] + interval: 10s + timeout: 5s + retries: 3 + + polaris-bootstrap: + # IMPORTANT: the image MUST contain the Postgres JDBC driver and EclipseLink dependencies, see README for instructions + image: apache/polaris-admin-tool:postgres-latest + depends_on: + postgres: + condition: service_healthy + environment: + polaris.persistence.type: eclipse-link + polaris.persistence.eclipselink.configuration-file: /deployments/config/eclipselink/persistence.xml + volumes: + - ../assets/eclipselink/:/deployments/config/eclipselink + command: + - "bootstrap" + - "--realm=POLARIS" + - "--credential=POLARIS,root,s3cr3t" + + postgres: + image: postgres:17.4 + ports: + - "5432:5432" + # set shared memory limit when using docker-compose + shm_size: 128mb + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: POLARIS + POSTGRES_INITDB_ARGS: "--encoding UTF8 --data-checksums" + volumes: + # Bind local conf file to a convenient location in the container + - type: bind + source: ./postgresql.conf + target: /etc/postgresql/postgresql.conf + command: + - "postgres" + - "-c" + - "config_file=/etc/postgresql/postgresql.conf" + healthcheck: + test: "pg_isready -U postgres" + interval: 5s + timeout: 2s + retries: 15 diff --git a/getting-started/eclipselink-3-replicas/nginx.conf b/getting-started/eclipselink-3-replicas/nginx.conf new file mode 100644 index 0000000000..7d8b71e42a --- /dev/null +++ b/getting-started/eclipselink-3-replicas/nginx.conf @@ -0,0 +1,25 @@ +events { + worker_connections 1024; +} + +http { + upstream polaris_backend { + server polaris-1:8181; + server polaris-2:8181; + server polaris-3:8181; + } + + server { + listen 8181; + + location / { + proxy_pass http://polaris_backend; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + add_header X-Upstream-Addr $upstream_addr; + } + } +} diff --git a/getting-started/eclipselink-3-replicas/postgresql.conf b/getting-started/eclipselink-3-replicas/postgresql.conf new file mode 100644 index 0000000000..5594b72c16 --- /dev/null +++ b/getting-started/eclipselink-3-replicas/postgresql.conf @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# This contains the postgres config settings provided to the startup command +# as "postgres -c config_file=". +# +# See https://github.com/postgres/postgres/blob/master/src/backend/utils/misc/postgresql.conf.sample +# for more config options. + +# Required standard settings normally specified in default config +listen_addresses = '*' +max_connections = 100 + +shared_buffers = 128MB +dynamic_shared_memory_type = posix + +max_wal_size = 1GB +min_wal_size = 80MB + +log_timezone = 'Etc/UTC' +datestyle = 'iso, mdy' +timezone = 'Etc/UTC' + + +# Custom settings below + +# NOTE: It's best practice to explicitly set the isolation level from the +# application layer where possible, but in some cases this requires careful +# configuration to inject settings into JPA frameworks. This is provided here +# for defense-in-depth and for illustrative purposes if database customization +# is desired. +default_transaction_isolation = 'serializable' diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4e569e27dd..4a6f127ed9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -100,3 +100,4 @@ jandex = { id = "org.kordamp.gradle.jandex", version = "2.1.0" } openapi-generator = { id = "org.openapi.generator", version = "7.12.0" } quarkus = { id = "io.quarkus", version.ref = "quarkus" } rat = { id = "org.nosphere.apache.rat", version = "0.8.1" } +gatling = { id = "io.gatling.gradle", version = "3.13.4.1" } \ No newline at end of file diff --git a/gradle/projects.main.properties b/gradle/projects.main.properties index 88fbcd0fa4..6183842ddb 100644 --- a/gradle/projects.main.properties +++ b/gradle/projects.main.properties @@ -36,6 +36,7 @@ aggregated-license-report=aggregated-license-report polaris-immutables=tools/immutables polaris-container-spec-helper=tools/container-spec-helper polaris-version=tools/version +polaris-benchmarks=benchmarks polaris-config-docs-annotations=tools/config-docs/annotations polaris-config-docs-generator=tools/config-docs/generator From bb164ba12c8e0e63ca54c9c80aba8e23281bea8e Mon Sep 17 00:00:00 2001 From: Pierre Laporte Date: Wed, 19 Mar 2025 15:42:47 +0100 Subject: [PATCH 2/9] Remove code unrelated to the benchmarks --- benchmarks/authenticate.sh | 25 --- .../dremio-polaris-mongo/docker-compose.yml | 31 ---- .../eclipselink-3-replicas/README.md | 71 -------- .../eclipselink-3-replicas/docker-compose.yml | 152 ------------------ .../eclipselink-3-replicas/nginx.conf | 25 --- .../eclipselink-3-replicas/postgresql.conf | 46 ------ 6 files changed, 350 deletions(-) delete mode 100755 benchmarks/authenticate.sh delete mode 100644 getting-started/dremio-polaris-mongo/docker-compose.yml delete mode 100644 getting-started/eclipselink-3-replicas/README.md delete mode 100644 getting-started/eclipselink-3-replicas/docker-compose.yml delete mode 100644 getting-started/eclipselink-3-replicas/nginx.conf delete mode 100644 getting-started/eclipselink-3-replicas/postgresql.conf diff --git a/benchmarks/authenticate.sh b/benchmarks/authenticate.sh deleted file mode 100755 index e8d7f87bf2..0000000000 --- a/benchmarks/authenticate.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -if [ $# -eq 1 ]; then - export CLIENT_ID=$(echo "$1" | cut -d: -f1) CLIENT_SECRET=$(echo "$1" | cut -d: -f2) -elif [ $# -eq 2 ]; then - export CLIENT_ID=$1 CLIENT_SECRET=$2 -else - export CLIENT_ID=root CLIENT_SECRET=s3cr3t -fi - -# eval $(grep -aEo 'realm: [^:]*:[^:]*:[^:]*' /tmp/polaris.log | perl -pe 's/realm: [^:]*: ([^:]*):([^:]*)/export CLIENT_ID=$1 CLIENT_SECRET=$2/') - -echo export CLIENT_ID=$CLIENT_ID -echo export CLIENT_SECRET=$CLIENT_SECRET -echo export TOKEN=$( - curl \ - -s \ - -X POST \ - "http://${POLARIS_HOST:-localhost}:8181/api/catalog/v1/oauth/tokens" \ - -d "grant_type=client_credentials" \ - -d "client_id=$CLIENT_ID" \ - -d "client_secret=$CLIENT_SECRET" \ - -d "scope=PRINCIPAL_ROLE:ALL" | - jq -r .access_token -) diff --git a/getting-started/dremio-polaris-mongo/docker-compose.yml b/getting-started/dremio-polaris-mongo/docker-compose.yml deleted file mode 100644 index 845a042526..0000000000 --- a/getting-started/dremio-polaris-mongo/docker-compose.yml +++ /dev/null @@ -1,31 +0,0 @@ -services: - mongo: - image: mongo - ports: - - "27017:27017" - healthcheck: - test: ["CMD", "mongosh", "--quiet", "--eval", "try { db.adminCommand('ping').ok } catch (error) { exit(1) }"] - interval: 60s - timeout: 5s - retries: 3 - start_period: 5s - - dremio-polaris: - image: gcr.io/dremio-1093/dremio-ee-catalog-server:dremio-release-master-12071 - environment: - - quarkus.mongodb.connection-string=mongodb://mongo:27017 - - polaris.backend.name=MongoDb - - dremio.catalog.auth.type=noop - - polaris.bootstrap.credentials=dremio,root,s3cr3t - ports: - - "8181:8181" - - "8182:8182" - depends_on: - mongo: - condition: service_healthy - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8182/q/health"] - interval: 60s - timeout: 5s - retries: 3 - start_period: 10s diff --git a/getting-started/eclipselink-3-replicas/README.md b/getting-started/eclipselink-3-replicas/README.md deleted file mode 100644 index 31e5586a71..0000000000 --- a/getting-started/eclipselink-3-replicas/README.md +++ /dev/null @@ -1,71 +0,0 @@ - - -# Getting Started with 3 Apache Polaris replicas, EclipseLink and Postgres - -This example requires `jq` to be installed on your machine. - -1. If such an image is not already present, build the Polaris image with support for EclipseLink and - the Postgres JDBC driver: - - ```shell - ./gradlew clean :polaris-quarkus-server:assemble :polaris-quarkus-admin:assemble \ - -PeclipseLinkDeps=org.postgresql:postgresql:42.7.4 \ - -Dquarkus.container-image.tag=postgres-latest \ - -Dquarkus.container-image.build=true \ - --no-build-cache - ``` - -2. Start the docker compose group by running the following command from the root of the repository: - - ```shell - docker compose -f getting-started/eclipselink/docker-compose.yml up - ``` - -3. To access Polaris from the host machine, first request an access token: - - ```shell - export POLARIS_TOKEN=$(curl -s http://polaris:8181/api/catalog/v1/oauth/tokens \ - --resolve polaris:8181:127.0.0.1 \ - --user root:s3cr3t \ - -d 'grant_type=client_credentials' \ - -d 'scope=PRINCIPAL_ROLE:ALL' | jq -r .access_token) - ``` - -4. Optionally, use the `X-Upstream-Addr` response header to identify the replica that served a request: - - ```shell - $ curl -v http://127.0.0.1:8181/api/management/v1/principal-roles -H "Authorization: Bearer $POLARIS_TOKEN" - [...] - < HTTP/1.1 200 OK - < Server: nginx/1.27.4 - < Date: Wed, 05 Mar 2025 10:29:52 GMT - < Content-Type: application/json;charset=UTF-8 - < Content-Length: 454 - < Connection: keep-alive - < X-Upstream-Addr: 172.19.0.3:8181 - [...] - ``` - -5. Then, use the access token in the Authorization header when accessing Polaris: - - ```shell - curl -v http://127.0.0.1:8181/api/management/v1/principal-roles -H "Authorization: Bearer $POLARIS_TOKEN" - curl -v http://127.0.0.1:8181/api/catalog/v1/config?warehouse=polaris_demo -H "Authorization: Bearer $POLARIS_TOKEN" - ``` diff --git a/getting-started/eclipselink-3-replicas/docker-compose.yml b/getting-started/eclipselink-3-replicas/docker-compose.yml deleted file mode 100644 index 5e420eef64..0000000000 --- a/getting-started/eclipselink-3-replicas/docker-compose.yml +++ /dev/null @@ -1,152 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# - -services: - polaris-1: - image: apache/polaris:postgres-latest - depends_on: - polaris-bootstrap: - condition: service_completed_successfully - postgres: - condition: service_healthy - environment: - JAVA_DEBUG: "true" - JAVA_DEBUG_PORT: "*:5005" - JAVA_OPTS: "-Dsuspend -Ddebug -XX:+UseParallelGC -Xms1G -Xmx1G -XX:+AlwaysPreTouch -Xlog:gc*=debug,safepoint*:file=/tmp/gc.log:uptime,tags,level:filecount=1,filesize=200M" - polaris.persistence.type: eclipse-link - polaris.persistence.eclipselink.configuration-file: /deployments/config/eclipselink/persistence.xml - polaris.realm-context.realms: POLARIS - polaris.authentication.token-broker.type: symmetric-key - polaris.authentication.token-broker.symmetric-key.secret: THE_VERY_SECRET_KEY - quarkus.otel.sdk.disabled: "true" - volumes: - - ../assets/eclipselink/:/deployments/config/eclipselink - healthcheck: - test: ["CMD", "curl", "http://localhost:8182/q/health"] - interval: 2s - timeout: 10s - retries: 10 - - polaris-2: - image: apache/polaris:postgres-latest - depends_on: - polaris-bootstrap: - condition: service_completed_successfully - postgres: - condition: service_healthy - environment: - JAVA_DEBUG: "true" - JAVA_DEBUG_PORT: "*:5006" # Changed debug port - JAVA_OPTS: "-Dsuspend -Ddebug -XX:+UseParallelGC -Xms1G -Xmx1G -XX:+AlwaysPreTouch -Xlog:gc*=debug,safepoint*:file=/tmp/gc.log:uptime,tags,level:filecount=1,filesize=200M" - polaris.persistence.type: eclipse-link - polaris.persistence.eclipselink.configuration-file: /deployments/config/eclipselink/persistence.xml - polaris.realm-context.realms: POLARIS - polaris.authentication.token-broker.type: symmetric-key - polaris.authentication.token-broker.symmetric-key.secret: THE_VERY_SECRET_KEY - quarkus.otel.sdk.disabled: "true" - volumes: - - ../assets/eclipselink/:/deployments/config/eclipselink - healthcheck: - test: ["CMD", "curl", "http://localhost:8182/q/health"] - interval: 2s - timeout: 10s - retries: 10 - - polaris-3: - image: apache/polaris:postgres-latest - depends_on: - polaris-bootstrap: - condition: service_completed_successfully - postgres: - condition: service_healthy - environment: - JAVA_DEBUG: "true" - JAVA_DEBUG_PORT: "*:5007" # Changed debug port - JAVA_OPTS: "-Dsuspend -Ddebug -XX:+UseParallelGC -Xms1G -Xmx1G -XX:+AlwaysPreTouch -Xlog:gc*=debug,safepoint*:file=/tmp/gc.log:uptime,tags,level:filecount=1,filesize=200M" - polaris.persistence.type: eclipse-link - polaris.persistence.eclipselink.configuration-file: /deployments/config/eclipselink/persistence.xml - polaris.realm-context.realms: POLARIS - polaris.authentication.token-broker.type: symmetric-key - polaris.authentication.token-broker.symmetric-key.secret: THE_VERY_SECRET_KEY - quarkus.otel.sdk.disabled: "true" - volumes: - - ../assets/eclipselink/:/deployments/config/eclipselink - healthcheck: - test: ["CMD", "curl", "http://localhost:8182/q/health"] - interval: 2s - timeout: 10s - retries: 10 - - polaris: - image: nginx:latest - ports: - - "8181:8181" # Expose on port 8181 - depends_on: - - polaris-1 - - polaris-2 - - polaris-3 - volumes: - - ./nginx.conf:/etc/nginx/nginx.conf:ro - healthcheck: - test: ["CMD", "nginx", "-t"] - interval: 10s - timeout: 5s - retries: 3 - - polaris-bootstrap: - # IMPORTANT: the image MUST contain the Postgres JDBC driver and EclipseLink dependencies, see README for instructions - image: apache/polaris-admin-tool:postgres-latest - depends_on: - postgres: - condition: service_healthy - environment: - polaris.persistence.type: eclipse-link - polaris.persistence.eclipselink.configuration-file: /deployments/config/eclipselink/persistence.xml - volumes: - - ../assets/eclipselink/:/deployments/config/eclipselink - command: - - "bootstrap" - - "--realm=POLARIS" - - "--credential=POLARIS,root,s3cr3t" - - postgres: - image: postgres:17.4 - ports: - - "5432:5432" - # set shared memory limit when using docker-compose - shm_size: 128mb - environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: POLARIS - POSTGRES_INITDB_ARGS: "--encoding UTF8 --data-checksums" - volumes: - # Bind local conf file to a convenient location in the container - - type: bind - source: ./postgresql.conf - target: /etc/postgresql/postgresql.conf - command: - - "postgres" - - "-c" - - "config_file=/etc/postgresql/postgresql.conf" - healthcheck: - test: "pg_isready -U postgres" - interval: 5s - timeout: 2s - retries: 15 diff --git a/getting-started/eclipselink-3-replicas/nginx.conf b/getting-started/eclipselink-3-replicas/nginx.conf deleted file mode 100644 index 7d8b71e42a..0000000000 --- a/getting-started/eclipselink-3-replicas/nginx.conf +++ /dev/null @@ -1,25 +0,0 @@ -events { - worker_connections 1024; -} - -http { - upstream polaris_backend { - server polaris-1:8181; - server polaris-2:8181; - server polaris-3:8181; - } - - server { - listen 8181; - - location / { - proxy_pass http://polaris_backend; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - add_header X-Upstream-Addr $upstream_addr; - } - } -} diff --git a/getting-started/eclipselink-3-replicas/postgresql.conf b/getting-started/eclipselink-3-replicas/postgresql.conf deleted file mode 100644 index 5594b72c16..0000000000 --- a/getting-started/eclipselink-3-replicas/postgresql.conf +++ /dev/null @@ -1,46 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -# This contains the postgres config settings provided to the startup command -# as "postgres -c config_file=". -# -# See https://github.com/postgres/postgres/blob/master/src/backend/utils/misc/postgresql.conf.sample -# for more config options. - -# Required standard settings normally specified in default config -listen_addresses = '*' -max_connections = 100 - -shared_buffers = 128MB -dynamic_shared_memory_type = posix - -max_wal_size = 1GB -min_wal_size = 80MB - -log_timezone = 'Etc/UTC' -datestyle = 'iso, mdy' -timezone = 'Etc/UTC' - - -# Custom settings below - -# NOTE: It's best practice to explicitly set the isolation level from the -# application layer where possible, but in some cases this requires careful -# configuration to inject settings into JPA frameworks. This is provided here -# for defense-in-depth and for illustrative purposes if database customization -# is desired. -default_transaction_isolation = 'serializable' From 12894025d68e01829a01e59fac48e8c093e8e019 Mon Sep 17 00:00:00 2001 From: Pierre Laporte Date: Wed, 19 Mar 2025 15:59:33 +0100 Subject: [PATCH 3/9] Adjust diagrams to match description --- benchmarks/docs/dataset-shape-1-1000-7.png | Bin 21704 -> 20126 bytes benchmarks/docs/dataset-shape-1-1000-7.puml | 3 --- benchmarks/docs/dataset-shape-2-3-5.png | Bin 34368 -> 32197 bytes benchmarks/docs/dataset-shape-2-3-5.puml | 4 ---- 4 files changed, 7 deletions(-) diff --git a/benchmarks/docs/dataset-shape-1-1000-7.png b/benchmarks/docs/dataset-shape-1-1000-7.png index 23e464ec12783c5ae109de3193fdc35c70d9722e..2d151619f89703e2188af5b9983fbe56ac90f496 100644 GIT binary patch literal 20126 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 W3KGUS;4(_A7f)rLai@fAbYD~}u;Z0!Zu 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 r1@K6J5jDbBSB?zh?%~ht>J7xH?Tatl=WY? literal 34368 zcmeFZcTiMY_cqwT1r!vn0YRb&h=_oSfMiS{k`yF|21yc{oU@{0A}5igA~{OVpa?Ws zvQ0)Bker*)gjvTMe((ELP0crdOx4uX+`3gD=bU}^UVFu7J^Q@8r!04rijfM1LLHUA zb4wM4B1=c1NF5K6!e1WRemxC8E;!xRax%8HbGJ4%b3)0P+L$^RIhmTAdFX!Tk&~01 zqnLnzowbpTlQYJe-`E!8(%#GlLnv81&~p0c?OC*I(JOn<62izh7yWfH3dXC8-L@TI0fue5Ns*%w1!v9V$zoNqJoZiQmp7*k$4fSL8g?H}=R31S+A>oW`yqUV|X z&1l{oWgkdTxcEn*Bnbm)A&bZJ$EV{Hc%9IGF_AuZnCe?)D=v|kQRv9~t$6UNp={Re zyGQ<{C6Au9D0t3&zt^3I{oT($xz(I*Gm&WOeZACM5hK?man{a0HTdw}4x^s8uU1{T zbw<1&u~I{QzvRBho{-kciGV>_G`Za60O^CnW#xPJG_~UH&6%pK&mI`o3$w`l9MjDi zOGBllbcjwpM2|cbqbws69%P+^$>IKJGw0g3_+~lZ}Fw z^cD)`hmyZ_{ehdo{4k{(o$0`V{mgl-KJSH`#eHWk_MM+ul;7x&T;&C*)GTPycHsJ1% zG{4eOcWpWv9}%z!T8rvi4iQ6s;#E!1@I#9nM-M+Vt`o>%GU_4TpxTCX|6VE$5A!m` zFSFML&;+quxzoYODEMeC<=Vz0iH5V?g((pc5kG$XNJ~rma*jPf%<0#6Jl@3l9BRzS z1U=TCcI;+&xbm>PN?(n}Mcq8ZeTfY}i8|!5V;r(^Qr=?q5Ac2gN10OE|3FE+nWr9l z32$KPcgp;gc72w_{rT+_3#H4KFIyH~_5b2enJGwuqU9ix8qhrZT=zVU5`X$sOo~vb zH%aYv6Ljr`58q+nbNK?OYcJ-hwYW~|n7r$|1#6;&J2Ic%c&*s|4qJ^HJCiS97v8D%{hrG2IOcA^KGhL-!2peIs-4S7o?N)Ki-)F^h<;^n@xgX-IDl73}*|4`3p? z_)eDFzbh_xo=}bH`r?qQajdOSKiMfZMaVSPn=89|>*s5<_lA0Riqh*-d>7c==K8W{ zWrJX0mxS^KLX^%|x@@=B(bC)O8%$({7I4!lIK35{v07*#^cFim#eZeeEO4LlxB2jW zq5I9NdCfe-FVl&hQS)=oK_;VqeyG8Pkt)xY7*VrU2IA4MrF^!s(XGAw+�+p~zD> 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 Date: Wed, 19 Mar 2025 16:27:53 +0100 Subject: [PATCH 4/9] Replace PNG images by SVG --- benchmarks/README.md | 6 +++--- benchmarks/docs/dataset-shape-1-1000-7.png | Bin 20126 -> 0 bytes benchmarks/docs/dataset-shape-1-1000-7.svg | 1 + benchmarks/docs/dataset-shape-10-2-3.png | Bin 35984 -> 0 bytes benchmarks/docs/dataset-shape-10-2-3.svg | 1 + benchmarks/docs/dataset-shape-2-3-5.png | Bin 32197 -> 0 bytes benchmarks/docs/dataset-shape-2-3-5.svg | 1 + benchmarks/docs/dataset-size.png | Bin 32043 -> 0 bytes benchmarks/docs/dataset-size.svg | 1 + 9 files changed, 7 insertions(+), 3 deletions(-) delete mode 100644 benchmarks/docs/dataset-shape-1-1000-7.png create mode 100644 benchmarks/docs/dataset-shape-1-1000-7.svg delete mode 100644 benchmarks/docs/dataset-shape-10-2-3.png create mode 100644 benchmarks/docs/dataset-shape-10-2-3.svg delete mode 100644 benchmarks/docs/dataset-shape-2-3-5.png create mode 100644 benchmarks/docs/dataset-shape-2-3-5.svg delete mode 100644 benchmarks/docs/dataset-size.png create mode 100644 benchmarks/docs/dataset-size.svg diff --git a/benchmarks/README.md b/benchmarks/README.md index 2e3e68d9b6..54bd7b3b3f 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -119,7 +119,7 @@ The diagram below shows an example of a test dataset with the following properti - Tables per namespace (`T`): `5` - Views per namespace (`V`): `3` -![Binary tree dataset example with width 2, depth 3, and 5 tables per namespace](docs/dataset-shape-2-3-5.png) +![Binary tree dataset example with width 2, depth 3, and 5 tables per namespace](docs/dataset-shape-2-3-5.svg) Using the formula from the previous section, we can calculate the total number of namespaces and the total number of tables as follows: @@ -137,7 +137,7 @@ The diagram below shows an example of a test dataset with the following properti - Tables per namespace (`T`): `3` - Views per namespace (`V`): `3` -![10-ary tree dataset example with width 10, depth 2, and 3 tables per namespace](docs/dataset-shape-10-2-3.png) +![10-ary tree dataset example with width 10, depth 2, and 3 tables per namespace](docs/dataset-shape-10-2-3.svg) Using the formula from the previous section, we can calculate the total number of namespaces and the total number of tables as follows: @@ -155,7 +155,7 @@ The diagram below shows an example of a test dataset with the following properti - Tables per namespace (`T`): `7` - Views per namespace (`V`): `4` -![1-ary tree dataset example with width 1, depth 1000, and 7 tables per namespace](docs/dataset-shape-1-1000-7.png) +![1-ary tree dataset example with width 1, depth 1000, and 7 tables per namespace](docs/dataset-shape-1-1000-7.svg) Using the formula from the previous section, we can calculate the total number of namespaces and the total number of tables as follows: diff --git a/benchmarks/docs/dataset-shape-1-1000-7.png b/benchmarks/docs/dataset-shape-1-1000-7.png deleted file mode 100644 index 2d151619f89703e2188af5b9983fbe56ac90f496..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20126 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 wAxojh?%i$$zv{JqRealmC 0NS 0NS 1NS 2...NS 999T 0T 1T 2T 3T 4T 5T 6V 0V 1V 2V 3 \ No newline at end of file diff --git a/benchmarks/docs/dataset-shape-10-2-3.png b/benchmarks/docs/dataset-shape-10-2-3.png deleted file mode 100644 index e3eced9e47c36ba829b85428c5ac437048a5e140..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35984 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 z 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 0NS 0NS 1NS 2NS 3NS 4NS 5NS 6NS 7NS 8NS 9NS 10T 0T 1T 2........................T 27T 28T 29V 0V 1V 2........................V 27V 28V 29 \ No newline at end of file diff --git a/benchmarks/docs/dataset-shape-2-3-5.png b/benchmarks/docs/dataset-shape-2-3-5.png deleted file mode 100644 index 801585b48acb492c47c869f140f40fe80ce618b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32197 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 r1@K6J5jDbBSB?zh?%~ht>J7xH?Tatl=WY? diff --git a/benchmarks/docs/dataset-shape-2-3-5.svg b/benchmarks/docs/dataset-shape-2-3-5.svg new file mode 100644 index 0000000000..fa804ff80e --- /dev/null +++ b/benchmarks/docs/dataset-shape-2-3-5.svg @@ -0,0 +1 @@ +RealmC 0C 1C 2NS 0NS 1NS 2NS 3NS 4NS 5NS 6T 0T 1T 2T 3T 4......T 15T 16T 17T 18T 19V 0V 1V 2......V 15V 16V 17 \ No newline at end of file diff --git a/benchmarks/docs/dataset-size.png b/benchmarks/docs/dataset-size.png deleted file mode 100644 index 1cfe59e68df37ccc527f4a44e77a27714d217a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32043 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 qvGVBhoYy5A@KC){@ckZC_0catalogNameC_0defaultBaseLocationfile:///tmp/polaris/C_0NS_4namespaceNS_0NS_1NS_4propertiesAttribute_0Value_0Attribute_1Value_1......Attribute_100Value_100T_15nameT_15schematypestructfieldsid0namecolumn0typeintrequiredtrueid1namecolumn1typeintrequiredtrue...id999namecolumn999typeintrequiredtrueidentifier-field-ids0propertiesAttribute_0Value_0Attribute_1Value_1......Attribute_59Value_59 \ No newline at end of file From afc8dc98d74469f224ceb13cb024a77e4b910cc0 Mon Sep 17 00:00:00 2001 From: Pierre Laporte Date: Wed, 19 Mar 2025 16:39:46 +0100 Subject: [PATCH 5/9] Add ASF header --- .scalafmt.conf | 21 ++++++++++++++++++- benchmarks/README.md | 19 +++++++++++++++++ benchmarks/docs/dataset-shape-1-1000-7.puml | 18 ++++++++++++++++ benchmarks/docs/dataset-shape-10-2-3.puml | 18 ++++++++++++++++ benchmarks/docs/dataset-shape-2-3-5.puml | 18 ++++++++++++++++ benchmarks/docs/dataset-size.puml | 18 ++++++++++++++++ .../src/gatling/resources/logback-test.xml | 20 ++++++++++++++++++ 7 files changed, 131 insertions(+), 1 deletion(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index 52d1b35c34..f2f74c17b4 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,3 +1,22 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# + # Scalafmt is used to reformat Gatling benchmarks from the benchmarks/ directory version = 3.9.3 @@ -22,4 +41,4 @@ rewrite.rules = [ rewrite.imports.sort = original docstrings.style = Asterisk -docstrings.wrap = fold \ No newline at end of file +docstrings.wrap = fold diff --git a/benchmarks/README.md b/benchmarks/README.md index 54bd7b3b3f..00646b9e61 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -1,3 +1,22 @@ + + # Polaris Benchmarks This repository contains benchmarks for the Polaris service using Gatling. diff --git a/benchmarks/docs/dataset-shape-1-1000-7.puml b/benchmarks/docs/dataset-shape-1-1000-7.puml index 728807707a..0bb7813b82 100644 --- a/benchmarks/docs/dataset-shape-1-1000-7.puml +++ b/benchmarks/docs/dataset-shape-1-1000-7.puml @@ -1,3 +1,21 @@ +/' + ' Licensed to the Apache Software Foundation (ASF) under one + ' or more contributor license agreements. See the NOTICE file + ' distributed with this work for additional information + ' regarding copyright ownership. The ASF licenses this file + ' to you 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. +'/ @startuml rectangle Realm diff --git a/benchmarks/docs/dataset-shape-10-2-3.puml b/benchmarks/docs/dataset-shape-10-2-3.puml index 5785f32823..0dd17520dc 100644 --- a/benchmarks/docs/dataset-shape-10-2-3.puml +++ b/benchmarks/docs/dataset-shape-10-2-3.puml @@ -1,3 +1,21 @@ +/' + ' Licensed to the Apache Software Foundation (ASF) under one + ' or more contributor license agreements. See the NOTICE file + ' distributed with this work for additional information + ' regarding copyright ownership. The ASF licenses this file + ' to you 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. +'/ @startuml skinparam linetype polyline diff --git a/benchmarks/docs/dataset-shape-2-3-5.puml b/benchmarks/docs/dataset-shape-2-3-5.puml index a3e79bbe3b..effad5ba4e 100644 --- a/benchmarks/docs/dataset-shape-2-3-5.puml +++ b/benchmarks/docs/dataset-shape-2-3-5.puml @@ -1,3 +1,21 @@ +/' + ' Licensed to the Apache Software Foundation (ASF) under one + ' or more contributor license agreements. See the NOTICE file + ' distributed with this work for additional information + ' regarding copyright ownership. The ASF licenses this file + ' to you 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. +'/ @startuml rectangle Realm diff --git a/benchmarks/docs/dataset-size.puml b/benchmarks/docs/dataset-size.puml index 44b17e4337..2ab840c8c9 100644 --- a/benchmarks/docs/dataset-size.puml +++ b/benchmarks/docs/dataset-size.puml @@ -1,3 +1,21 @@ +/' + ' Licensed to the Apache Software Foundation (ASF) under one + ' or more contributor license agreements. See the NOTICE file + ' distributed with this work for additional information + ' regarding copyright ownership. The ASF licenses this file + ' to you 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. +'/ @startuml map C_0 { diff --git a/benchmarks/src/gatling/resources/logback-test.xml b/benchmarks/src/gatling/resources/logback-test.xml index a2fb46ea3a..c9227d3eaf 100644 --- a/benchmarks/src/gatling/resources/logback-test.xml +++ b/benchmarks/src/gatling/resources/logback-test.xml @@ -1,4 +1,24 @@ + From 8020e2192efa1fd33e2d66bfc47b45c1a09a361a Mon Sep 17 00:00:00 2001 From: Pierre Laporte Date: Wed, 19 Mar 2025 16:43:28 +0100 Subject: [PATCH 6/9] Update benchmarks/README.md Co-authored-by: Robert Stupp --- benchmarks/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/benchmarks/README.md b/benchmarks/README.md index 00646b9e61..515f11ed22 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -100,6 +100,19 @@ A message will show the location of the Gatling report: Reports generated in: ./benchmarks/build/reports/gatling//index.html ``` +### Example Polaris server startup + +For repeated testing and benchmarking purposes it's convenient to have fixed client-ID + client-secret combinations. **The following example is ONLY for testing and benchmarking against an airgapped Polaris instance** + +```bash +# Start Polaris with the fixed client-ID/secret admin/admin +# DO NEVER EVER USE THE FOLLOWING FOR ANY NON-AIRGAPPED POLARIS INSTANCE !! +./gradlew :polaris-quarkus-server:quarkusBuild && java \ + -Dpolaris.bootstrap.credentials=POLARIS,admin,admin \ + -Djava.security.manager=allow \ + -jar quarkus/server/build/quarkus-app/quarkus-run.jar + +With the above you can run the benchmarks with the environment variables `CLIENT_ID=admin` and `CLIENT_SECRET=admin` - meant only for convenience in a fully airgapped system. # Test Dataset The benchmarks use synthetic procedural datasets that are generated deterministically at runtime. This means that given the same input parameters, the exact same dataset structure will always be generated. This approach allows generating large volumes of test data without having to store it, while ensuring reproducible benchmark results across different runs. From c81d220a26033d7a947afb7ee2058936bc9edc48 Mon Sep 17 00:00:00 2001 From: Pierre Laporte Date: Wed, 19 Mar 2025 16:47:01 +0100 Subject: [PATCH 7/9] Remove unnecessary files --- .../DatasetCreationSimulation.scala | 28 ------------------- .../DatasetVerificationSimulation.scala | 28 ------------------- 2 files changed, 56 deletions(-) delete mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetCreationSimulation.scala delete mode 100644 benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetVerificationSimulation.scala diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetCreationSimulation.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetCreationSimulation.scala deleted file mode 100644 index a1650ccfe8..0000000000 --- a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetCreationSimulation.scala +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.polaris.benchmarks - -import org.apache.polaris.benchmarks.simulations.CreateTreeDatasetConcurrent - -/** - * This simulation is only kept for compatibility reasons. It is recommended to use the - * CreateTreeDataset class directly instead. - */ -class DatasetCreationSimulation extends CreateTreeDatasetConcurrent {} diff --git a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetVerificationSimulation.scala b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetVerificationSimulation.scala deleted file mode 100644 index c92e3d94aa..0000000000 --- a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/DatasetVerificationSimulation.scala +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 org.apache.polaris.benchmarks - -import org.apache.polaris.benchmarks.simulations.ReadUpdateTreeDatasetConcurrent - -/** - * This simulation is only kept for compatibility reasons. It is recommended to use the - * ReadTreeDataset class directly instead. - */ -class DatasetVerificationSimulation extends ReadUpdateTreeDatasetConcurrent {} From e19f09ce2167a0c1111c1f4bbd654b5d2e8d0b46 Mon Sep 17 00:00:00 2001 From: Pierre Laporte Date: Wed, 19 Mar 2025 16:51:00 +0100 Subject: [PATCH 8/9] Add trailing linebreak --- gradle/libs.versions.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4a6f127ed9..9eed984efb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -100,4 +100,5 @@ jandex = { id = "org.kordamp.gradle.jandex", version = "2.1.0" } openapi-generator = { id = "org.openapi.generator", version = "7.12.0" } quarkus = { id = "io.quarkus", version.ref = "quarkus" } rat = { id = "org.nosphere.apache.rat", version = "0.8.1" } -gatling = { id = "io.gatling.gradle", version = "3.13.4.1" } \ No newline at end of file +gatling = { id = "io.gatling.gradle", version = "3.13.4.1" } + From 961861f7a0ffb0761e683f388b81aaac38484da7 Mon Sep 17 00:00:00 2001 From: Pierre Laporte Date: Thu, 20 Mar 2025 09:12:15 +0100 Subject: [PATCH 9/9] Add missing closing block delimiter --- benchmarks/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmarks/README.md b/benchmarks/README.md index 515f11ed22..de8c183ed4 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -111,6 +111,7 @@ For repeated testing and benchmarking purposes it's convenient to have fixed cli -Dpolaris.bootstrap.credentials=POLARIS,admin,admin \ -Djava.security.manager=allow \ -jar quarkus/server/build/quarkus-app/quarkus-run.jar +``` With the above you can run the benchmarks with the environment variables `CLIENT_ID=admin` and `CLIENT_SECRET=admin` - meant only for convenience in a fully airgapped system. # Test Dataset