This is an automated email from the ASF dual-hosted git repository. dongjoon pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push: new a3a394e31f8c [SPARK-53280][CORE] Use Java `instanceof` instead of `Throwables.throwIf*` methods a3a394e31f8c is described below commit a3a394e31f8c85f10e3374bca0fe500434ec5837 Author: Dongjoon Hyun <dongj...@apache.org> AuthorDate: Wed Aug 13 19:34:16 2025 -0700 [SPARK-53280][CORE] Use Java `instanceof` instead of `Throwables.throwIf*` methods ### What changes were proposed in this pull request? This PR aims to optimize exception handling code by using Java 16+ [JEP 394: Pattern Matching for instanceof ](https://openjdk.org/jeps/394) instead of `Throwables.throwIf*` wrapper methods. ### Why are the changes needed? There are multiple categories. **Category Misuse (1 instance):** We need to remove `Throwables.throwIfUnchecked` because `ExecutionException` is incompatible with `Error` or `RuntimeException` from the beginning and `e` cannot be `null`. ```scala } catch (ExecutionException e) { - Throwables.throwIfUnchecked(e.getCause()); throw new RuntimeException(e.getCause()); } ``` **Category Unoptimized (7 instances):** We had better inline the one-liner to check the code because `Exception` cannot be `Error` and `e` cannot be `null`. ```scala } catch (Exception e) { - Throwables.throwIfUnchecked(e); + if (e instanceof RuntimeException re) throw re; throw new RuntimeException(e); } ``` **Category Other (1 instance):** We have only one instance to check a `Throwable` type variable. We also can do like the following in a straight-forward way in order to avoid repeated function operations and duplicated operations inside those functions. ```scala - Throwables.throwIfInstanceOf(readException, IOException.class); - Throwables.throwIfUnchecked(readException); + if (readException == null) throw new NullPointerException("readException is not captured."); + if (readException instanceof IOException ie) throw ie; + if (readException instanceof Error error) throw error; + if (readException instanceof RuntimeException re) throw re; ``` ### Does this PR introduce _any_ user-facing change? No. ### How was this patch tested? Pass the CIs. ### Was this patch authored or co-authored using generative AI tooling? No. Closes #52022 from dongjoon-hyun/SPARK-53280. Authored-by: Dongjoon Hyun <dongj...@apache.org> Signed-off-by: Dongjoon Hyun <dongj...@apache.org> --- .../src/main/java/org/apache/spark/util/kvstore/LevelDB.java | 3 +-- .../main/java/org/apache/spark/util/kvstore/LevelDBIterator.java | 3 +-- .../src/main/java/org/apache/spark/util/kvstore/RocksDB.java | 3 +-- .../main/java/org/apache/spark/util/kvstore/RocksDBIterator.java | 3 +-- .../java/org/apache/spark/network/client/TransportClient.java | 4 +--- .../org/apache/spark/network/client/TransportClientFactory.java | 3 +-- .../main/java/org/apache/spark/network/crypto/AuthRpcHandler.java | 3 +-- core/src/main/java/org/apache/spark/io/ReadAheadInputStream.java | 8 ++++---- 8 files changed, 11 insertions(+), 19 deletions(-) diff --git a/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDB.java b/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDB.java index a15d08ee018d..91b2cde2d84f 100644 --- a/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDB.java +++ b/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDB.java @@ -30,7 +30,6 @@ import java.util.stream.Collectors; import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Throwables; import org.fusesource.leveldbjni.JniDBFactory; import org.iq80.leveldb.DB; import org.iq80.leveldb.DBIterator; @@ -256,7 +255,7 @@ public class LevelDB implements KVStore { iteratorTracker.add(new WeakReference<>(it)); return it; } catch (Exception e) { - Throwables.throwIfUnchecked(e); + if (e instanceof RuntimeException re) throw re; throw new RuntimeException(e); } } diff --git a/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDBIterator.java b/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDBIterator.java index 352d65270412..d80e002ddb06 100644 --- a/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDBIterator.java +++ b/common/kvstore/src/main/java/org/apache/spark/util/kvstore/LevelDBIterator.java @@ -26,7 +26,6 @@ import java.util.NoSuchElementException; import java.util.concurrent.atomic.AtomicBoolean; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Throwables; import org.iq80.leveldb.DBIterator; import org.apache.spark.internal.SparkLogger; @@ -151,7 +150,7 @@ class LevelDBIterator<T> implements KVStoreIterator<T> { next = null; return ret; } catch (Exception e) { - Throwables.throwIfUnchecked(e); + if (e instanceof RuntimeException re) throw re; throw new RuntimeException(e); } } diff --git a/common/kvstore/src/main/java/org/apache/spark/util/kvstore/RocksDB.java b/common/kvstore/src/main/java/org/apache/spark/util/kvstore/RocksDB.java index 8fcbc9cb3d1e..4b69b9441dc3 100644 --- a/common/kvstore/src/main/java/org/apache/spark/util/kvstore/RocksDB.java +++ b/common/kvstore/src/main/java/org/apache/spark/util/kvstore/RocksDB.java @@ -31,7 +31,6 @@ import java.util.stream.Collectors; import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Throwables; import org.rocksdb.*; import org.apache.spark.annotation.Private; @@ -288,7 +287,7 @@ public class RocksDB implements KVStore { iteratorTracker.add(new WeakReference<>(it)); return it; } catch (Exception e) { - Throwables.throwIfUnchecked(e); + if (e instanceof RuntimeException re) throw re; throw new RuntimeException(e); } } diff --git a/common/kvstore/src/main/java/org/apache/spark/util/kvstore/RocksDBIterator.java b/common/kvstore/src/main/java/org/apache/spark/util/kvstore/RocksDBIterator.java index 9ade85004ee0..d37a4bd7b0b2 100644 --- a/common/kvstore/src/main/java/org/apache/spark/util/kvstore/RocksDBIterator.java +++ b/common/kvstore/src/main/java/org/apache/spark/util/kvstore/RocksDBIterator.java @@ -23,7 +23,6 @@ import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Throwables; import org.rocksdb.RocksIterator; import org.apache.spark.network.util.JavaUtils; @@ -138,7 +137,7 @@ class RocksDBIterator<T> implements KVStoreIterator<T> { next = null; return ret; } catch (Exception e) { - Throwables.throwIfUnchecked(e); + if (e instanceof RuntimeException re) throw re; throw new RuntimeException(e); } } diff --git a/common/network-common/src/main/java/org/apache/spark/network/client/TransportClient.java b/common/network-common/src/main/java/org/apache/spark/network/client/TransportClient.java index 8c92fbfd9825..f02f2c63ecd4 100644 --- a/common/network-common/src/main/java/org/apache/spark/network/client/TransportClient.java +++ b/common/network-common/src/main/java/org/apache/spark/network/client/TransportClient.java @@ -28,7 +28,6 @@ import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Throwables; import com.google.common.util.concurrent.SettableFuture; import io.netty.channel.Channel; import io.netty.util.concurrent.Future; @@ -289,10 +288,9 @@ public class TransportClient implements Closeable { try { return result.get(timeoutMs, TimeUnit.MILLISECONDS); } catch (ExecutionException e) { - Throwables.throwIfUnchecked(e.getCause()); throw new RuntimeException(e.getCause()); } catch (Exception e) { - Throwables.throwIfUnchecked(e); + if (e instanceof RuntimeException re) throw re; throw new RuntimeException(e); } } diff --git a/common/network-common/src/main/java/org/apache/spark/network/client/TransportClientFactory.java b/common/network-common/src/main/java/org/apache/spark/network/client/TransportClientFactory.java index 162fe8bd4866..2137b5f3136e 100644 --- a/common/network-common/src/main/java/org/apache/spark/network/client/TransportClientFactory.java +++ b/common/network-common/src/main/java/org/apache/spark/network/client/TransportClientFactory.java @@ -30,7 +30,6 @@ import java.util.concurrent.atomic.AtomicReference; import com.codahale.metrics.MetricSet; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Throwables; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.Channel; @@ -342,7 +341,7 @@ public class TransportClientFactory implements Closeable { logger.error("Exception while bootstrapping client after {} ms", e, MDC.of(LogKeys.BOOTSTRAP_TIME, bootstrapTimeMs)); client.close(); - Throwables.throwIfUnchecked(e); + if (e instanceof RuntimeException re) throw re; throw new RuntimeException(e); } long postBootstrap = System.nanoTime(); diff --git a/common/network-common/src/main/java/org/apache/spark/network/crypto/AuthRpcHandler.java b/common/network-common/src/main/java/org/apache/spark/network/crypto/AuthRpcHandler.java index 8ea65498bc88..8ce4680f3243 100644 --- a/common/network-common/src/main/java/org/apache/spark/network/crypto/AuthRpcHandler.java +++ b/common/network-common/src/main/java/org/apache/spark/network/crypto/AuthRpcHandler.java @@ -20,7 +20,6 @@ package org.apache.spark.network.crypto; import java.nio.ByteBuffer; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Throwables; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; @@ -132,7 +131,7 @@ class AuthRpcHandler extends AbstractAuthRpcHandler { try { engine.close(); } catch (Exception e) { - Throwables.throwIfUnchecked(e); + if (e instanceof RuntimeException re) throw re; throw new RuntimeException(e); } } diff --git a/core/src/main/java/org/apache/spark/io/ReadAheadInputStream.java b/core/src/main/java/org/apache/spark/io/ReadAheadInputStream.java index 61ecdd60b415..91ee2d8ccbe9 100644 --- a/core/src/main/java/org/apache/spark/io/ReadAheadInputStream.java +++ b/core/src/main/java/org/apache/spark/io/ReadAheadInputStream.java @@ -28,8 +28,6 @@ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import javax.annotation.concurrent.GuardedBy; -import com.google.common.base.Throwables; - import org.apache.spark.internal.SparkLogger; import org.apache.spark.internal.SparkLoggerFactory; import org.apache.spark.internal.LogKeys; @@ -120,8 +118,10 @@ public class ReadAheadInputStream extends InputStream { private void checkReadException() throws IOException { if (readAborted) { - Throwables.throwIfInstanceOf(readException, IOException.class); - Throwables.throwIfUnchecked(readException); + if (readException == null) throw new NullPointerException("readException is not captured."); + if (readException instanceof IOException ie) throw ie; + if (readException instanceof Error error) throw error; + if (readException instanceof RuntimeException re) throw re; throw new IOException(readException); } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org