This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch maybe-fix-new-flaky-solr-integration-tests
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 3a87a131700b6ea597f3c4421640156cbe90b7ca
Author: tallison <[email protected]>
AuthorDate: Fri Mar 6 16:32:03 2026 -0500

    maybe fix flaky solr tests
---
 .../pipes/solr/tests/TikaPipesSolrTestBase.java    | 53 ++++++++++++++++++++--
 1 file changed, 50 insertions(+), 3 deletions(-)

diff --git 
a/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/java/org/apache/tika/pipes/solr/tests/TikaPipesSolrTestBase.java
 
b/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/java/org/apache/tika/pipes/solr/tests/TikaPipesSolrTestBase.java
index 0fea4b0cd0..75f92c2732 100644
--- 
a/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/java/org/apache/tika/pipes/solr/tests/TikaPipesSolrTestBase.java
+++ 
b/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/java/org/apache/tika/pipes/solr/tests/TikaPipesSolrTestBase.java
@@ -20,6 +20,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -41,6 +43,8 @@ import org.jetbrains.annotations.NotNull;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.testcontainers.containers.FixedHostPortGenericContainer;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.junit.jupiter.Container;
@@ -55,6 +59,10 @@ import org.apache.tika.utils.SystemUtils;
 
 public abstract class TikaPipesSolrTestBase {
 
+    private static final Logger LOG = 
LoggerFactory.getLogger(TikaPipesSolrTestBase.class);
+    private static final int SOLR_READY_TIMEOUT_MS = 30_000;
+    private static final int SOLR_READY_POLL_MS = 500;
+
     private final String collection = "testcol";
     private final int numDocs = 42;
     private Path testFileFolder;
@@ -95,9 +103,40 @@ public abstract class TikaPipesSolrTestBase {
                     .withCommand("-DzkRun");
         }
         solr.start();
+        waitForSolrReady();
+    }
 
-        // Ideally wanted to use TestContainers WaitStrategy but they were 
inconsistent
-        Thread.sleep(2000);
+    private void waitForSolrReady() {
+        String host = solr.getHost();
+        int port = solr.getMappedPort(8983);
+        String adminUrl = "http://"; + host + ":" + port + 
"/solr/admin/info/system";
+        long deadline = System.currentTimeMillis() + SOLR_READY_TIMEOUT_MS;
+        LOG.info("Waiting for Solr to be ready at {}...", adminUrl);
+        while (System.currentTimeMillis() < deadline) {
+            try {
+                HttpURLConnection conn = (HttpURLConnection) new 
URL(adminUrl).openConnection();
+                conn.setConnectTimeout(1000);
+                conn.setReadTimeout(1000);
+                int code = conn.getResponseCode();
+                conn.disconnect();
+                if (code == 200) {
+                    LOG.info("Solr is ready (responded 200 in {} ms)",
+                            SOLR_READY_TIMEOUT_MS - (deadline - 
System.currentTimeMillis()));
+                    return;
+                }
+                LOG.debug("Solr returned status {}, retrying...", code);
+            } catch (Exception e) {
+                LOG.debug("Solr not ready yet: {}", e.getMessage());
+            }
+            try {
+                Thread.sleep(SOLR_READY_POLL_MS);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                throw new RuntimeException("Interrupted waiting for Solr", e);
+            }
+        }
+        LOG.error("Solr did not become ready within {} ms at {}", 
SOLR_READY_TIMEOUT_MS, adminUrl);
+        throw new RuntimeException("Solr did not become ready within " + 
SOLR_READY_TIMEOUT_MS + " ms");
     }
 
     @AfterEach
@@ -140,7 +179,15 @@ public abstract class TikaPipesSolrTestBase {
         zkPort = solr.getMappedPort(9983);
         solrEndpoint = "http://"; + solrHost + ":" + solrPort + "/solr";
 
-        solr.execInContainer("/opt/solr/bin/solr", "create_collection", "-c", 
collection);
+        org.testcontainers.containers.Container.ExecResult createResult =
+                solr.execInContainer("/opt/solr/bin/solr", 
"create_collection", "-c", collection);
+        if (createResult.getExitCode() != 0) {
+            LOG.error("Failed to create Solr collection '{}'. Exit code: {}, 
stdout: {}, stderr: {}",
+                    collection, createResult.getExitCode(),
+                    createResult.getStdout(), createResult.getStderr());
+            throw new RuntimeException("Failed to create Solr collection: " + 
createResult.getStderr());
+        }
+        LOG.info("Created Solr collection '{}': {}", collection, 
createResult.getStdout().trim());
 
         try (SolrClient solrClient = new 
Http2SolrClient.Builder(solrEndpoint).build()) {
 

Reply via email to