voonhous commented on code in PR #19470:
URL: https://github.com/apache/hudi/pull/19470#discussion_r3703288623


##########
hudi-hadoop-common/src/main/java/org/apache/hudi/hadoop/fs/HoodieRetryWrapperFileSystem.java:
##########
@@ -277,7 +277,7 @@ public Configuration getConf() {
 
   @Override
   public String getScheme() {
-    return fileSystem.getScheme();
+    return HadoopFSUtils.getScheme(fileSystem);

Review Comment:
   **The only regression guard in the tree for this line cannot fail, and has 
not been able to since the day it merged.**
   
   `e88b4748127c` (HUDI-5286, #7313, "UnsupportedOperationException throws when 
enabling filesystem retry") added *both* this override and 
`TestFSUtilsWithRetryWrapperEnable#testGetSchema`. That test is inert for two 
independent reasons:
   
   1. It asserts on `HoodieWrapperFileSystem#getScheme()`, which is `return 
uri.getScheme()` and never dispatches into the retry wrapper. Already true when 
the test shipped -- `git show 
e88b4748127c^:hudi-common/src/main/java/org/apache/hudi/common/fs/HoodieWrapperFileSystem.java
 | sed -n '415,417p'`.
   2. The same commit gave `FakeRemoteFileSystem` a `getScheme()` override 
(`TestFSUtilsWithRetryWrapperEnable.java:257-260`) delegating to a real 
`LocalFileSystem`, so it cannot throw.
   
   A/B on this branch: pre-PR `HoodieRetryWrapperFileSystem#getScheme()` throws 
`UnsupportedOperationException`, post-PR it returns `file`. The assertion's 
value is `file` either way, so your change here ships untested.
   
   `FakeRemoteFileSystem` already overrides `getUri()` (`:145`), so deleting 
its `getScheme()` override gives it exactly the `PrestoS3FileSystem` shape. 
Please delete `TestFSUtilsWithRetryWrapperEnable.java:257-260` and retarget the 
assertion at the wrapper itself:
   
   ```java
       assertEquals("file", ((HoodieRetryWrapperFileSystem) 
fileSystem).getScheme());
   ```
   
   Three lines, and a four-year-old no-op becomes the actual guard for both 
HUDI-5286 and this PR.



##########
hudi-hadoop-common/src/main/java/org/apache/hudi/storage/hadoop/HoodieHadoopStorage.java:
##########
@@ -111,7 +111,7 @@ public HoodieStorage newInstance(StoragePath path, 
StorageConfiguration<?> stora
 
   @Override
   public String getScheme() {
-    return fs.getScheme();
+    return HadoopFSUtils.getScheme(fs);

Review Comment:
   **Perf, non-blocking:** on exactly the filesystem class this PR targets, the 
scheme is now re-resolved through a thrown-and-caught 
`UnsupportedOperationException` once per log block.
   
   Call frequency, all on the read/write hot path:
   
   - `HoodieLogFileReader.java:139` -> `:258` 
`StorageSchemes.isWriteTransactional(storage.getScheme())` -- **once per log 
block**.
   - `HoodieStorage.java:390-396` `needCreateTempFile()` calls `getScheme()` 
**three times** per immutable-file write, and on an S3-like scheme all three 
miss; reached per partition via `HoodiePartitionMetadata.java:116`.
   - `HadoopFSUtils.java:223,228` -- 2 more per `getFSDataInputStream`.
   
   Measured cost of the fallback (exception construction is dominated by 
stack-trace fill-in, so it scales with engine call depth):
   
   | stack depth | fallback | direct |
   | --- | --- | --- |
   | +0 | 321 ns/call | 4 ns/call |
   | +40 | 1188 ns/call | 1 ns/call |
   | +80 | 1923 ns/call | 1 ns/call |
   
   Small next to S3 IO, hence not a blocker, but it is pure waste on this PR's 
own target path and `fs` is `final`. Please memoize:
   
   ```java
     private final Lazy<String> scheme = Lazy.lazily(() -> 
HadoopFSUtils.getScheme(fs));
   
     @Override
     public String getScheme() {
       return scheme.get();
     }
   ```
   
   (`org.apache.hudi.common.util.Lazy`; a lazy field avoids touching all five 
constructors.)



##########
hudi-hadoop-common/src/test/java/org/apache/hudi/hadoop/fs/TestHadoopFSUtils.java:
##########
@@ -22,22 +22,80 @@
 import org.apache.hudi.storage.StoragePath;
 import org.apache.hudi.storage.StoragePathInfo;
 
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FSDataInputStream;
 import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.FilterFileSystem;
 import org.apache.hadoop.fs.Path;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.CsvSource;
 import org.junit.jupiter.params.provider.ValueSource;
 
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
 import static 
org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToHadoopFileStatus;
 import static org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToHadoopPath;
 import static org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToStoragePath;
 import static org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToStoragePathInfo;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 /**
  * Tests {@link HadoopFSUtils}
  */
 public class TestHadoopFSUtils {
+  /**
+   * HUDI-4602: {@link FileSystem#getScheme()} is optional in Hadoop -- the 
base implementation throws
+   * {@link UnsupportedOperationException} -- and proxy implementations such 
as Presto's
+   * {@code PrestoS3FileSystem} do not override it. Opening a log file went 
straight through
+   * {@code isGCSFileSystem}, so a MOR {@code _rt} query on Presto failed with
+   * "Not implemented by the PrestoS3FileSystem FileSystem implementation" 
rather than reading anything.
+   *
+   * <p>{@link FilterFileSystem} has the same shape: it leaves {@code 
getScheme()} to the throwing base
+   * implementation while overriding {@code getUri()}.
+   */
+  @Test
+  public void testGetFSDataInputStreamWhenGetSchemeIsUnimplemented(@TempDir 
File tempDir) throws IOException {
+    File file = new File(tempDir, "log.file");
+    byte[] contents = new byte[] {1, 2, 3, 4};
+    Files.write(file.toPath(), contents);
+    // newInstanceLocal rather than getLocal, so closing this does not evict a 
cached FileSystem that
+    // other tests in the same JVM share.
+    try (FileSystem fs = new FilterFileSystem(FileSystem.newInstanceLocal(new 
Configuration()))) {
+      // The premise: this is the call the read path used to make unguarded.
+      assertThrows(UnsupportedOperationException.class, fs::getScheme);
+
+      try (FSDataInputStream stream =
+               HadoopFSUtils.getFSDataInputStream(fs, new 
StoragePath(file.toURI()), 1024, true)) {
+        byte[] read = new byte[contents.length];
+        stream.readFully(read);
+        assertArrayEquals(contents, read, "The read path should not depend on 
the optional getScheme()");
+      }
+    }
+  }
+
+  @Test
+  public void testGetSchemeFallsBackToTheUriWhenUnimplemented() throws 
IOException {
+    try (FileSystem localFs = FileSystem.newInstanceLocal(new 
Configuration())) {
+      assertEquals("file", HadoopFSUtils.getScheme(localFs),
+          "LocalFileSystem overrides getScheme(), so the helper should return 
what it reports "
+              + "rather than falling back to getUri()");
+
+      try (FileSystem noScheme = new FilterFileSystem(localFs)) {
+        assertThrows(UnsupportedOperationException.class, noScheme::getScheme);
+        assertEquals("file", HadoopFSUtils.getScheme(noScheme),
+            "FilterFileSystem does not override getScheme(), so the helper 
should fall back to "
+                + "getUri().getScheme()");
+      }

Review Comment:
   nit, feel free to ignore: `FilterFileSystem.close()` is `super.close(); 
fs.close();`, so this inner block already closes `localFs` and the outer block 
then closes it a second time. Harmless for `newInstanceLocal` (I checked -- the 
second close does not throw and the cache key is unique), but it reads as 
though the wrapper owns a resource of its own, which undercuts the accurate 
`newInstanceLocal` comment at `:68-69`. The wrapper owns nothing, so it does 
not need the block:
   
   ```suggestion
         FileSystem noScheme = new FilterFileSystem(localFs);
         assertThrows(UnsupportedOperationException.class, noScheme::getScheme);
         assertEquals("file", HadoopFSUtils.getScheme(noScheme),
             "FilterFileSystem does not override getScheme(), so the helper 
should fall back to "
                 + "getUri().getScheme()");
   ```



##########
hudi-hadoop-common/src/main/java/org/apache/hudi/hadoop/fs/HadoopFSUtils.java:
##########
@@ -294,7 +315,7 @@ private static StorageConfiguration<Configuration> 
getStorageConf(Configuration
 
   public static Configuration registerFileSystem(StoragePath file, 
Configuration conf) {
     Configuration returnConf = new Configuration(conf);
-    String scheme = HadoopFSUtils.getFs(file.toString(), conf).getScheme();
+    String scheme = getScheme(HadoopFSUtils.getFs(file.toString(), conf));

Review Comment:
   **This call site, `HoodieWrapperFileSystem#convertToHoodiePath` and 
`HoodieHadoopStorage#getScheme` are three live behaviour changes with zero test 
coverage anywhere in the repo.**
   
   - `grep -rn "registerFileSystem\|convertToHoodiePath" --include='*.java' | 
grep src/test` returns nothing.
   - `TestHoodieStorageBase.java:103` (`assertEquals("file", 
getStorage().getScheme())`, inherited by `TestHoodieHadoopStorage`) runs on a 
`LocalFileSystem`, which *does* implement `getScheme()` -- byte-identical pre- 
and post-PR.
   
   A/B with a `LocalFileSystem` subclass whose `getScheme()` throws, registered 
via `conf.setClass("fs.file.impl", ...)`: all three threw 
`UnsupportedOperationException` pre-PR and all three pass post-PR. So the 
behaviour is real and nothing pins it.
   
   Weight: `convertToHoodiePath` is the **write** path (`HoodieAvroOrcWriter`, 
`HoodieAvroHFileWriter`, `HoodieBaseParquetWriter`) and feeds 
`convertPathWithScheme`, which needed its own fix in HUDI-4495 (`c39e88dcf0c1`, 
#6237) for dotted S3 bucket names -- the same shape a Presto-on-S3 user hits.
   
   Please add one fixture to `TestHadoopFSUtils` and assert all three:
   
   ```java
     /** A FileSystem with the PrestoS3FileSystem shape: getUri() works, 
getScheme() does not. */
     private static class NoSchemeLocalFileSystem extends LocalFileSystem {
       @Override
       public String getScheme() {
         throw new UnsupportedOperationException("Not implemented by the 
NoSchemeLocalFileSystem FileSystem implementation");
       }
     }
   ```
   
   Register it with `conf.setClass("fs.file.impl", 
NoSchemeLocalFileSystem.class, FileSystem.class)`, then assert that 
`HadoopFSUtils.registerFileSystem(...)`, 
`HoodieWrapperFileSystem.convertToHoodiePath(...)` and `new 
HoodieHadoopStorage(path, conf).getScheme()` all succeed. One fixture, three 
uncovered sites.



##########
hudi-hadoop-common/src/test/java/org/apache/hudi/hadoop/fs/TestHadoopFSUtils.java:
##########
@@ -22,22 +22,80 @@
 import org.apache.hudi.storage.StoragePath;
 import org.apache.hudi.storage.StoragePathInfo;
 
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FSDataInputStream;
 import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.FilterFileSystem;
 import org.apache.hadoop.fs.Path;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.CsvSource;
 import org.junit.jupiter.params.provider.ValueSource;
 
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
 import static 
org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToHadoopFileStatus;
 import static org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToHadoopPath;
 import static org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToStoragePath;
 import static org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToStoragePathInfo;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 /**
  * Tests {@link HadoopFSUtils}
  */
 public class TestHadoopFSUtils {
+  /**
+   * HUDI-4602: {@link FileSystem#getScheme()} is optional in Hadoop -- the 
base implementation throws
+   * {@link UnsupportedOperationException} -- and proxy implementations such 
as Presto's
+   * {@code PrestoS3FileSystem} do not override it. Opening a log file went 
straight through
+   * {@code isGCSFileSystem}, so a MOR {@code _rt} query on Presto failed with
+   * "Not implemented by the PrestoS3FileSystem FileSystem implementation" 
rather than reading anything.
+   *
+   * <p>{@link FilterFileSystem} has the same shape: it leaves {@code 
getScheme()} to the throwing base
+   * implementation while overriding {@code getUri()}.
+   */
+  @Test
+  public void testGetFSDataInputStreamWhenGetSchemeIsUnimplemented(@TempDir 
File tempDir) throws IOException {

Review Comment:
   nit, feel free to ignore: `@TempDir File` is against this module's 
convention -- `grep -rn "@TempDir File" --include='*.java'` finds only this and 
two in `hudi-flink-datasource`, while every `@TempDir` in `hudi-hadoop-common` 
uses `java.nio.file.Path` (`TestTimelineInspector.java:89`, 
`TestHoodieVariantReconstruction.java:55`, `TestHoodieLogFormat.java:446`). The 
test also converts straight back with `file.toPath()` on the next line.
   
   Switching drops the `java.io.File` import:
   
   ```java
     public void testGetFSDataInputStreamWhenGetSchemeIsUnimplemented(@TempDir 
Path tempDir) throws IOException {
       Path file = tempDir.resolve("log.file");
       byte[] contents = new byte[] {1, 2, 3, 4};
       Files.write(file, contents);
   ```
   
   Note this also needs `file.toURI()` on `:75` changed to `file.toUri()`, so 
it is not a one-click apply.



##########
hudi-hadoop-common/src/main/java/org/apache/hudi/hadoop/fs/HadoopFSUtils.java:
##########
@@ -277,15 +277,36 @@ private static FSDataInputStream 
getFSDataInputStreamForGCS(FSDataInputStream fs
    * @return true if the inputstream or the wrapped one is of type 
GoogleHadoopFSInputStream
    */
   public static boolean isGCSFileSystem(FileSystem fs) {
-    return fs.getScheme().equals(StorageSchemes.GCS.getScheme());
+    return StorageSchemes.GCS.getScheme().equals(getScheme(fs));

Review Comment:
   **This predicate and `isCHDFileSystem` become reachable for proxy 
filesystems for the first time with this PR, and neither they nor the two 
stream classes they select have ever had a test.**
   
   - `grep -rn 
"isGCSFileSystem\|isCHDFileSystem\|SchemeAwareFSDataInputStream\|BoundedFsDataInputStream"
 --include='*.java'` returns zero hits in the test tree.
   - `testGetFSDataInputStreamWhenGetSchemeIsUnimplemented` uses `file://`, so 
both predicates return `false` and only the fall-through arm at the bottom of 
`getFSDataInputStream` runs.
   
   A/B with a scheme-less FS reporting `gs://bucket` and `ofs://cluster`: 
pre-PR both throw `UnsupportedOperationException`; post-PR they return 
`SchemeAwareFSDataInputStream` and `BoundedFsDataInputStream` respectively. 
That is new reachable behaviour, and it is exactly the code with a bug history:
   
   - `e93c6a569310` (HUDI-1496, #2500) *is a fix to `isGCSFileSystem` itself* 
-- it replaced stream-instanceof detection with this scheme equality, i.e. the 
predicate you are re-plumbing.
   - `eaa2f8ed3bb3` (HUDI-4282, #6031) added the CHDFS arm.
   
   Neither shipped a unit test. Please extend the fixture from my 
`registerFileSystem` comment with `getUri()` overridden to `gs://bucket` and 
`ofs://cluster`, and assert `getFSDataInputStream(...)` returns 
`SchemeAwareFSDataInputStream` / `BoundedFsDataInputStream`. This is the only 
assertion in the PR that would catch a future regression where 
`HadoopFSUtils.getScheme` returns something other than what `fs.getScheme()` 
would have.



##########
hudi-hadoop-common/src/test/java/org/apache/hudi/hadoop/fs/TestHadoopFSUtils.java:
##########
@@ -22,22 +22,80 @@
 import org.apache.hudi.storage.StoragePath;
 import org.apache.hudi.storage.StoragePathInfo;
 
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FSDataInputStream;
 import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.FilterFileSystem;
 import org.apache.hadoop.fs.Path;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.CsvSource;
 import org.junit.jupiter.params.provider.ValueSource;
 
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
 import static 
org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToHadoopFileStatus;
 import static org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToHadoopPath;
 import static org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToStoragePath;
 import static org.apache.hudi.hadoop.fs.HadoopFSUtils.convertToStoragePathInfo;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 /**
  * Tests {@link HadoopFSUtils}
  */
 public class TestHadoopFSUtils {
+  /**
+   * HUDI-4602: {@link FileSystem#getScheme()} is optional in Hadoop -- the 
base implementation throws
+   * {@link UnsupportedOperationException} -- and proxy implementations such 
as Presto's
+   * {@code PrestoS3FileSystem} do not override it. Opening a log file went 
straight through
+   * {@code isGCSFileSystem}, so a MOR {@code _rt} query on Presto failed with
+   * "Not implemented by the PrestoS3FileSystem FileSystem implementation" 
rather than reading anything.
+   *
+   * <p>{@link FilterFileSystem} has the same shape: it leaves {@code 
getScheme()} to the throwing base
+   * implementation while overriding {@code getUri()}.
+   */
+  @Test
+  public void testGetFSDataInputStreamWhenGetSchemeIsUnimplemented(@TempDir 
File tempDir) throws IOException {
+    File file = new File(tempDir, "log.file");
+    byte[] contents = new byte[] {1, 2, 3, 4};
+    Files.write(file.toPath(), contents);
+    // newInstanceLocal rather than getLocal, so closing this does not evict a 
cached FileSystem that
+    // other tests in the same JVM share.
+    try (FileSystem fs = new FilterFileSystem(FileSystem.newInstanceLocal(new 
Configuration()))) {

Review Comment:
   nit, feel free to ignore: this fixture and the premise assertion on the next 
line are copy-pasted into `testGetSchemeFallsBackToTheUriWhenUnimplemented` 
(`:90-91`). Please extract them once:
   
   ```java
     /** A FileSystem with the reported shape: getUri() works, getScheme() 
throws. */
     private static FileSystem newFsWithoutGetScheme(FileSystem delegate) {
       FileSystem fs = new FilterFileSystem(delegate);
       assertThrows(UnsupportedOperationException.class, fs::getScheme);
       return fs;
     }
   ```



##########
hudi-hadoop-common/src/main/java/org/apache/hudi/hadoop/fs/HadoopFSUtils.java:
##########
@@ -277,15 +277,36 @@ private static FSDataInputStream 
getFSDataInputStreamForGCS(FSDataInputStream fs
    * @return true if the inputstream or the wrapped one is of type 
GoogleHadoopFSInputStream
    */
   public static boolean isGCSFileSystem(FileSystem fs) {
-    return fs.getScheme().equals(StorageSchemes.GCS.getScheme());
+    return StorageSchemes.GCS.getScheme().equals(getScheme(fs));
   }
 
   /**
    * Chdfs will throw {@code IOException} instead of {@code EOFException}. It 
will cause error in isBlockCorrupted().
    * Wrapped by {@code BoundedFsDataInputStream}, to check whether the desired 
offset is out of the file size in advance.
    */
   public static boolean isCHDFileSystem(FileSystem fs) {
-    return StorageSchemes.CHDFS.getScheme().equals(fs.getScheme());
+    return StorageSchemes.CHDFS.getScheme().equals(getScheme(fs));
+  }
+
+  /**
+   * Resolves the scheme of {@code fs} without depending on {@link 
FileSystem#getScheme()}.
+   *
+   * <p>{@code getScheme()} is optional in Hadoop: {@link FileSystem}'s own 
implementation throws
+   * {@link UnsupportedOperationException}, and proxy implementations such as 
Presto's
+   * {@code PrestoS3FileSystem} do not override it, so calling it unguarded 
turns an unrelated read into
+   * "Not implemented by the PrestoS3FileSystem FileSystem implementation" 
(HUDI-4602).
+   * {@link FileSystem#getUri()} is abstract, so every implementation supplies 
it, and its scheme is what
+   * {@code getScheme()} returns wherever both are present.
+   *
+   * @param fs instance of {@link FileSystem} in use.
+   * @return the scheme of {@code fs}, or null if its URI carries none.
+   */
+  public static String getScheme(FileSystem fs) {
+    try {
+      return fs.getScheme();
+    } catch (UnsupportedOperationException e) {
+      return fs.getUri().getScheme();
+    }

Review Comment:
   **The fallback discards the root cause and can return `null`, and the 
javadoc's equivalence claim is falsified by a class in this same module.**
   
   `InLineFileSystem` has both methods and they disagree 
(`InLineFileSystem.java:86-92`):
   
   ```java
     public URI getUri() { return URI.create(getScheme()); }   // 
URI.create("inlinefs") -> getScheme() is null
     public String getScheme() { return SCHEME; }              // "inlinefs"
   ```
   
   `"inlinefs"` has no colon, so it parses as a relative URI and 
`URI#getScheme()` returns `null`. So line 298-299 ("its scheme is what 
`getScheme()` returns wherever both are present") is not true, and the ordering 
here is load-bearing rather than cosmetic.
   
   When the fallback does yield `null`, it surfaces far from the cause with 
nonsense text -- `IllegalArgumentException: BlockAlignedAvroParquetWriter does 
not support scheme null` from `HoodieWrapperFileSystem#getHoodieScheme`, or 
`Unsupported scheme :null` from `StorageSchemes:137-158` -- and the original 
`"Not implemented by the PrestoS3FileSystem FileSystem implementation"` is 
thrown away. Same if `fs.getUri()` itself throws.
   
   Please fail loudly and chain the cause (`HoodieIOException` is already 
imported, so this applies as-is):
   
   ```suggestion
       try {
         return fs.getScheme();
       } catch (UnsupportedOperationException e) {
         String scheme = fs.getUri().getScheme();
         if (scheme == null) {
           throw new HoodieIOException("Cannot resolve the scheme of " + 
fs.getClass().getName()
               + ": getScheme() is unimplemented and its URI " + fs.getUri() + 
" carries no scheme", e);
         }
         return scheme;
       }
   ```
   
   and drop the "its scheme is what `getScheme()` returns wherever both are 
present" sentence (298-299) plus the "or null if its URI carries none" clause 
on `@return` (302), since neither would hold any more.



##########
hudi-hadoop-common/src/main/java/org/apache/hudi/hadoop/fs/HoodieWrapperFileSystem.java:
##########
@@ -160,7 +160,7 @@ public HoodieWrapperFileSystem(FileSystem fileSystem, 
ConsistencyGuard consisten
 
   public static Path convertToHoodiePath(StoragePath file, Configuration conf) 
{
     try {
-      String scheme = HadoopFSUtils.getFs(file.toString(), conf).getScheme();
+      String scheme = 
HadoopFSUtils.getScheme(HadoopFSUtils.getFs(file.toString(), conf));

Review Comment:
   nit, feel free to ignore: while you are in this method, the `try` wrapping 
it only catches `HoodieIOException` to rethrow it unchanged (`161-167`), which 
is a no-op. Dead since `ef70de2bba7b`. Please drop the `try`/`catch` and leave 
the two statements bare:
   
   ```java
     public static Path convertToHoodiePath(StoragePath file, Configuration 
conf) {
       String scheme = 
HadoopFSUtils.getScheme(HadoopFSUtils.getFs(file.toString(), conf));
       return convertPathWithScheme(convertToHadoopPath(file), 
getHoodieScheme(scheme));
     }
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to