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

Reply via email to