This is an automated email from the ASF dual-hosted git repository.
houston pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/branch_9x by this push:
new ad9141e8456 SOLR-17645: Gracefully handle exceptions in executor
threads (#3150)
ad9141e8456 is described below
commit ad9141e845677d3e4c59f5d16ffbbb2930103287
Author: Houston Putman <[email protected]>
AuthorDate: Fri Feb 14 17:15:09 2025 -0600
SOLR-17645: Gracefully handle exceptions in executor threads (#3150)
* Gracefully handle exceptions in executor threads
* Use better map methods, catch exception when refreshing terms
(cherry picked from commit b73841db19ebf75e0b0ef752c708337340f7bfb7)
---
.../org/apache/solr/cloud/ZkCollectionTerms.java | 4 +---
.../java/org/apache/solr/cloud/ZkController.java | 5 ++--
.../java/org/apache/solr/cloud/ZkShardTerms.java | 7 +++++-
.../apache/solr/common/cloud/ZkStateReader.java | 28 ++++++++++++++++++----
4 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkCollectionTerms.java
b/solr/core/src/java/org/apache/solr/cloud/ZkCollectionTerms.java
index 56726c6f506..a6c6a857a9e 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkCollectionTerms.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkCollectionTerms.java
@@ -38,9 +38,7 @@ class ZkCollectionTerms implements AutoCloseable {
public ZkShardTerms getShard(String shardId) {
synchronized (terms) {
- if (!terms.containsKey(shardId))
- terms.put(shardId, new ZkShardTerms(collection, shardId, zkClient));
- return terms.get(shardId);
+ return terms.computeIfAbsent(shardId, shard -> new
ZkShardTerms(collection, shard, zkClient));
}
}
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index 4c6ea26a4df..72333396039 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -1857,9 +1857,8 @@ public class ZkController implements Closeable {
private ZkCollectionTerms getCollectionTerms(String collection) {
synchronized (collectionToTerms) {
- if (!collectionToTerms.containsKey(collection))
- collectionToTerms.put(collection, new ZkCollectionTerms(collection,
zkClient));
- return collectionToTerms.get(collection);
+ return collectionToTerms.computeIfAbsent(
+ collection, col -> new ZkCollectionTerms(col, zkClient));
}
}
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
b/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
index b15567bf082..08e2dc1f27e 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
@@ -427,7 +427,12 @@ public class ZkShardTerms implements AutoCloseable {
}
// Some events may be missed during register a watcher, so it is
safer to refresh terms
// after registering watcher
- refreshTerms();
+ try {
+ refreshTerms();
+ } catch (SolrException e) {
+ log.warn(
+ "Error refreshing shard terms for collection: {}, shard: {}",
collection, shard, e);
+ }
};
try {
// exists operation is faster than getData operation
diff --git
a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkStateReader.java
b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkStateReader.java
index e7dd9d83cc4..79040ca1a89 100644
---
a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkStateReader.java
+++
b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkStateReader.java
@@ -1612,12 +1612,25 @@ public class ZkStateReader implements SolrCloseable {
final CountDownLatch latch = new CountDownLatch(1);
waitLatches.add(latch);
- AtomicReference<DocCollection> docCollection = new AtomicReference<>();
+ final AtomicReference<DocCollection> docCollection = new
AtomicReference<>();
+ final AtomicReference<SolrException> thrownException = new
AtomicReference<>();
CollectionStateWatcher watcher =
(n, c) -> {
docCollection.set(c);
- boolean matches = predicate.matches(n, c);
- if (matches) latch.countDown();
+ boolean matches = false;
+ try {
+ matches = predicate.matches(n, c);
+ if (matches) {
+ latch.countDown();
+ thrownException.set(null);
+ }
+ } catch (SolrException e) {
+ if (thrownException.getAndSet(e) != null) {
+ // Return if we have seen an exception twice
+ latch.countDown();
+ matches = true;
+ }
+ }
return matches;
};
@@ -1625,13 +1638,18 @@ public class ZkStateReader implements SolrCloseable {
try {
registerCollectionStateWatcher(collection, watcher);
// wait for the watcher predicate to return true, or time out
- if (!latch.await(wait, unit))
+ if (!latch.await(wait, unit)) {
throw new TimeoutException(
"Timeout waiting to see state for collection="
+ collection
+ " :"
+ docCollection.get());
-
+ } else if (thrownException.get() != null) {
+ throw new SolrException(
+ SolrException.ErrorCode.SERVER_ERROR,
+ "Error occurred while checking state",
+ thrownException.get());
+ }
} finally {
removeCollectionStateWatcher(collection, watcher);
waitLatches.remove(latch);