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&lt;String&gt;="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>

Reply via email to