This is an automated email from the ASF dual-hosted git repository. sergehuber pushed a commit to branch UNOMI-875-pr3-platform-upgrade in repository https://gitbox.apache.org/repos/asf/unomi.git
commit 324714f5401f4b447771c3af10056ff81e0d9b5b Author: Serge Huber <[email protected]> AuthorDate: Thu Jul 2 10:59:16 2026 +0200 UNOMI-875: Upgrade Elasticsearch 9.4.2 and OpenSearch 3.9.0 Align Docker compose images and IT fixtures with new server versions. Adapt ES bulk routing API for 9.4 and embed httpclient5 compression dependencies for Karaf OSGi resolution. --- docker/README.md | 8 +++--- docker/src/main/docker/docker-compose-build-es.yml | 2 +- docker/src/main/docker/docker-compose-build-os.yml | 6 ++-- docker/src/main/docker/docker-compose-cluster.yml | 2 +- docker/src/main/docker/docker-compose-es.yml | 2 +- docker/src/main/docker/docker-compose-os.yml | 6 ++-- itests/docker-compose-snapshot-analysis.yml | 2 +- persistence-elasticsearch/core/pom.xml | 33 +++++++++++++++++++++- .../ElasticSearchPersistenceServiceImpl.java | 14 +++++++-- pom.xml | 8 +++--- 10 files changed, 62 insertions(+), 21 deletions(-) diff --git a/docker/README.md b/docker/README.md index ae1e4f93b..5c862fc5d 100644 --- a/docker/README.md +++ b/docker/README.md @@ -46,25 +46,25 @@ If you want to run it without docker-compose you should then make sure you setup For ElasticSearch: ```bash -docker pull docker.elastic.co/elasticsearch/elasticsearch:9.2.1 +docker pull docker.elastic.co/elasticsearch/elasticsearch:9.4.2 docker network create unomi docker run -d --name elasticsearch --net unomi -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -e "xpack.security.enabled=false" \ -e cluster.name=contextElasticSearch \ - docker.elastic.co/elasticsearch/elasticsearch:9.2.1 + docker.elastic.co/elasticsearch/elasticsearch:9.4.2 ``` For OpenSearch: ```bash -docker pull opensearchproject/opensearch:3.0.0 +docker pull opensearchproject/opensearch:3.9.0 docker network create unomi export OPENSEARCH_ADMIN_PASSWORD=enter_your_custom_admin_password_here docker run -d --name opensearch --net unomi -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -e OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_ADMIN_PASSWORD} \ - opensearchproject/opensearch:3.0.0 + opensearchproject/opensearch:3.9.0 ``` For Unomi (with ElasticSearch): diff --git a/docker/src/main/docker/docker-compose-build-es.yml b/docker/src/main/docker/docker-compose-build-es.yml index 0aa221209..5cbdc6845 100644 --- a/docker/src/main/docker/docker-compose-build-es.yml +++ b/docker/src/main/docker/docker-compose-build-es.yml @@ -17,7 +17,7 @@ version: '2.4' services: elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:9.2.1 + image: docker.elastic.co/elasticsearch/elasticsearch:9.4.2 volumes: - unomi-3-elasticsearch-data:/usr/share/elasticsearch/data environment: diff --git a/docker/src/main/docker/docker-compose-build-os.yml b/docker/src/main/docker/docker-compose-build-os.yml index fb2d27d27..c46d7c933 100644 --- a/docker/src/main/docker/docker-compose-build-os.yml +++ b/docker/src/main/docker/docker-compose-build-os.yml @@ -23,7 +23,7 @@ networks: services: opensearch-node1: - image: opensearchproject/opensearch:3.0.0 + image: opensearchproject/opensearch:3.9.0 container_name: opensearch-node1 environment: - cluster.name=opensearch-cluster @@ -51,7 +51,7 @@ services: - opensearch-node1 opensearch-node2: - image: opensearchproject/opensearch:3.0.0 + image: opensearchproject/opensearch:3.9.0 container_name: opensearch-node2 environment: - cluster.name=opensearch-cluster @@ -76,7 +76,7 @@ services: - opensearch-node2 opensearch-dashboards: - image: opensearchproject/opensearch-dashboards:3.0.0 + image: opensearchproject/opensearch-dashboards:3.9.0 container_name: opensearch-dashboards ports: - 5601:5601 diff --git a/docker/src/main/docker/docker-compose-cluster.yml b/docker/src/main/docker/docker-compose-cluster.yml index a088fc082..49ab47538 100644 --- a/docker/src/main/docker/docker-compose-cluster.yml +++ b/docker/src/main/docker/docker-compose-cluster.yml @@ -17,7 +17,7 @@ version: '2.4' services: elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:9.2.1 + image: docker.elastic.co/elasticsearch/elasticsearch:9.4.2 volumes: - unomi-3-elasticsearch-data:/usr/share/elasticsearch/data environment: diff --git a/docker/src/main/docker/docker-compose-es.yml b/docker/src/main/docker/docker-compose-es.yml index db97b6d64..0e518036a 100644 --- a/docker/src/main/docker/docker-compose-es.yml +++ b/docker/src/main/docker/docker-compose-es.yml @@ -23,7 +23,7 @@ networks: services: elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:9.2.1 + image: docker.elastic.co/elasticsearch/elasticsearch:9.4.2 container_name: elasticsearch volumes: - unomi-3-elasticsearch-data:/usr/share/elasticsearch/data diff --git a/docker/src/main/docker/docker-compose-os.yml b/docker/src/main/docker/docker-compose-os.yml index 03abe5263..adc8b3a26 100644 --- a/docker/src/main/docker/docker-compose-os.yml +++ b/docker/src/main/docker/docker-compose-os.yml @@ -23,7 +23,7 @@ networks: services: opensearch-node1: - image: opensearchproject/opensearch:3.0.0 + image: opensearchproject/opensearch:3.9.0 container_name: opensearch-node1 environment: - cluster.name=opensearch-cluster @@ -51,7 +51,7 @@ services: - opensearch-node1 opensearch-node2: - image: opensearchproject/opensearch:3.0.0 + image: opensearchproject/opensearch:3.9.0 container_name: opensearch-node2 environment: - cluster.name=opensearch-cluster @@ -103,7 +103,7 @@ services: - unomi opensearch-dashboards: - image: opensearchproject/opensearch-dashboards:3.0.0 + image: opensearchproject/opensearch-dashboards:3.9.0 container_name: opensearch-dashboards ports: - 5601:5601 diff --git a/itests/docker-compose-snapshot-analysis.yml b/itests/docker-compose-snapshot-analysis.yml index 7e9f955e8..742b300e0 100644 --- a/itests/docker-compose-snapshot-analysis.yml +++ b/itests/docker-compose-snapshot-analysis.yml @@ -16,7 +16,7 @@ ################################################################################ services: elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:9.1.3 + image: docker.elastic.co/elasticsearch/elasticsearch:9.4.2 container_name: es-snapshot-analysis environment: - discovery.type=single-node diff --git a/persistence-elasticsearch/core/pom.xml b/persistence-elasticsearch/core/pom.xml index ea9eb8fbf..f60982555 100644 --- a/persistence-elasticsearch/core/pom.xml +++ b/persistence-elasticsearch/core/pom.xml @@ -104,6 +104,11 @@ <artifactId>jackson-core</artifactId> <scope>provided</scope> </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-annotations</artifactId> + <scope>provided</scope> + </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> @@ -156,6 +161,19 @@ <optional>true</optional> </dependency> <!-- End of optional ElasticSearch dependencies --> + <!-- ES 9.4 rest5-client / httpclient5 5.6+ reference brotli4j at runtime; embed for OSGi --> + <dependency> + <groupId>com.aayushatharva.brotli4j</groupId> + <artifactId>brotli4j</artifactId> + <version>1.20.0</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>com.github.luben</groupId> + <artifactId>zstd-jni</artifactId> + <version>1.5.7-4</version> + <scope>compile</scope> + </dependency> <dependency> <groupId>junit</groupId> @@ -264,6 +282,16 @@ org.conscrypt;resolution:=optional, org.glassfish.hk2.osgiresourcelocator;resolution:=optional, org.brotli.dec;resolution:=optional, + com.aayushatharva.brotli4j.decoder;resolution:=optional, + com.aayushatharva.brotli4j.encoder;resolution:=optional, + com.github.luben.zstd;resolution:=optional, + io.netty.buffer;resolution:=optional, + io.netty.channel;resolution:=optional, + io.netty.util;resolution:=optional, + javax.xml.datatype;resolution:=optional, + javax.xml.namespace;resolution:=optional, + javax.xml.transform.dom;resolution:=optional, + org.newsclub.net.unix;resolution:=optional, io.opentelemetry.opentelemetry-api;resolution:=optional, io.opentelemetry.sdk.autoconfigure;resolution:=optional, io.opentelemetry.opentelemetry-context;resolution:=optional, @@ -289,7 +317,10 @@ co.elastic.clients.util;version="${elasticsearch.version}", co.elastic.clients.elasticsearch._types;version="${elasticsearch.version}" </Export-Package> - <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency> + <Embed-Dependency> + !groupId=org.apache.logging.log4j;artifactId=*, + *;scope=compile|runtime + </Embed-Dependency> <Embed-Transitive>true</Embed-Transitive> <Provide-Capability> osgi.service;objectClass:List<String>="org.apache.unomi.persistence.spi.PersistenceService", diff --git a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java index efed6c03c..69dfb6474 100644 --- a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java +++ b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java @@ -1073,7 +1073,7 @@ public class ElasticSearchPersistenceServiceImpl implements PersistenceService, BulkOperation bulkOp = BulkOperation.of(builder -> builder.update( u -> u.index(updateRequest.index()).id(updateRequest.id()).action(b -> b.doc(updateRequest.doc())) .ifSeqNo(updateRequest.ifSeqNo()).ifPrimaryTerm(updateRequest.ifPrimaryTerm()) - .routing(updateRequest.routing()))); + .routing(routingForBulk(updateRequest.routing())))); bulkIngester.add(bulkOp); } logMetadataItemOperation("updated", item); @@ -1126,7 +1126,7 @@ public class ElasticSearchPersistenceServiceImpl implements PersistenceService, BulkOperation bulkOp = BulkOperation.of(builder -> builder.update( u -> u.index(updateRequest.index()).id(updateRequest.id()).action(b -> b.doc(updateRequest.doc())) .ifSeqNo(updateRequest.ifSeqNo()).ifPrimaryTerm(updateRequest.ifPrimaryTerm()) - .routing(updateRequest.routing()))); + .routing(routingForBulk(updateRequest.routing())))); operations.add(bulkOp); }); @@ -3186,4 +3186,14 @@ public class ElasticSearchPersistenceServiceImpl implements PersistenceService, } } + private static String routingForBulk(List<String> routing) { + if (routing == null || routing.isEmpty()) { + return null; + } + if (routing.size() == 1) { + return routing.get(0); + } + return String.join(",", routing); + } + } diff --git a/pom.xml b/pom.xml index 86d0b241b..c1e9b539c 100644 --- a/pom.xml +++ b/pom.xml @@ -64,10 +64,10 @@ <maven.compiler.release>${java.version}</maven.compiler.release> <karaf.version>4.4.11</karaf.version> - <elasticsearch.version>9.1.4</elasticsearch.version> - <elasticsearch.test.version>9.2.1</elasticsearch.test.version> - <opensearch.version>3.0.0</opensearch.version> - <opensearch.rest.client.version>3.0.0</opensearch.rest.client.version> + <elasticsearch.version>9.4.2</elasticsearch.version> + <elasticsearch.test.version>9.4.2</elasticsearch.test.version> + <opensearch.version>3.9.0</opensearch.version> + <opensearch.rest.client.version>3.9.0</opensearch.rest.client.version> <httpclient5.version>5.2.1</httpclient5.version> <aws.sdk.version>2.28.14</aws.sdk.version> <javax-validation.version>1.1.0.Final</javax-validation.version>
