You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xtable.apache.org by ti...@apache.org on 2024/04/24 15:02:23 UTC

(incubator-xtable) branch remaining-renames updated: Change IOException into a read and update exception

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

timbrown pushed a commit to branch remaining-renames
in repository https://gitbox.apache.org/repos/asf/incubator-xtable.git


The following commit(s) were added to refs/heads/remaining-renames by this push:
     new 3ba77634 Change IOException into a read and update exception
3ba77634 is described below

commit 3ba77634f136b2ff1e63d812feb6e25ef0d58a06
Author: Timothy Brown <ti...@onehouse.ai>
AuthorDate: Wed Apr 24 10:02:16 2024 -0500

    Change IOException into a read and update exception
---
 .../java/org/apache/xtable/model/exception/ErrorCode.java | 11 ++++++-----
 .../apache/xtable/conversion/ConversionController.java    |  4 ++--
 .../org/apache/xtable/delta/DeltaConversionSource.java    |  4 ++--
 .../java/org/apache/xtable/delta/DeltaStatsExtractor.java |  4 ++--
 .../java/org/apache/xtable/delta/DeltaValueConverter.java |  7 ++++---
 .../exception/{OneIOException.java => ReadException.java} | 15 ++++++++++-----
 .../{OneIOException.java => UpdateException.java}         | 14 +++++++++-----
 .../java/org/apache/xtable/hudi/HudiConversionSource.java |  4 ++--
 .../java/org/apache/xtable/hudi/HudiConversionTarget.java | 13 +++++++------
 .../org/apache/xtable/hudi/HudiDataFileExtractor.java     | 14 ++++++++------
 .../java/org/apache/xtable/hudi/HudiTableManager.java     |  4 ++--
 .../apache/xtable/iceberg/IcebergConversionSource.java    |  4 ++--
 .../apache/xtable/iceberg/IcebergDataFileUpdatesSync.java |  4 ++--
 13 files changed, 58 insertions(+), 44 deletions(-)

diff --git a/api/src/main/java/org/apache/xtable/model/exception/ErrorCode.java b/api/src/main/java/org/apache/xtable/model/exception/ErrorCode.java
index 97a80b64..920a95f4 100644
--- a/api/src/main/java/org/apache/xtable/model/exception/ErrorCode.java
+++ b/api/src/main/java/org/apache/xtable/model/exception/ErrorCode.java
@@ -25,11 +25,12 @@ public enum ErrorCode {
   INVALID_CONFIGURATION(10001),
   INVALID_PARTITION_SPEC(10002),
   INVALID_PARTITION_VALUE(10003),
-  IO_EXCEPTION(10004),
-  INVALID_SCHEMA(10005),
-  UNSUPPORTED_SCHEMA_TYPE(10006),
-  UNSUPPORTED_FEATURE(10007),
-  PARSE_EXCEPTION(10008);
+  READ_EXCEPTION(10004),
+  UPDATE_EXCEPTION(10005),
+  INVALID_SCHEMA(10006),
+  UNSUPPORTED_SCHEMA_TYPE(10007),
+  UNSUPPORTED_FEATURE(10008),
+  PARSE_EXCEPTION(10009);
 
   private final int errorCode;
 
diff --git a/core/src/main/java/org/apache/xtable/conversion/ConversionController.java b/core/src/main/java/org/apache/xtable/conversion/ConversionController.java
index 1d356e6e..f12c8fa4 100644
--- a/core/src/main/java/org/apache/xtable/conversion/ConversionController.java
+++ b/core/src/main/java/org/apache/xtable/conversion/ConversionController.java
@@ -38,7 +38,7 @@ import lombok.extern.log4j.Log4j2;
 
 import org.apache.hadoop.conf.Configuration;
 
-import org.apache.xtable.exception.OneIOException;
+import org.apache.xtable.exception.ReadException;
 import org.apache.xtable.model.IncrementalTableChanges;
 import org.apache.xtable.model.InstantsForIncrementalSync;
 import org.apache.xtable.model.InternalSnapshot;
@@ -139,7 +139,7 @@ public class ConversionController {
       }
       return syncResultsMerged;
     } catch (IOException ioException) {
-      throw new OneIOException("Failed to close source converter", ioException);
+      throw new ReadException("Failed to close source converter", ioException);
     }
   }
 
diff --git a/core/src/main/java/org/apache/xtable/delta/DeltaConversionSource.java b/core/src/main/java/org/apache/xtable/delta/DeltaConversionSource.java
index e113d269..9a00e54c 100644
--- a/core/src/main/java/org/apache/xtable/delta/DeltaConversionSource.java
+++ b/core/src/main/java/org/apache/xtable/delta/DeltaConversionSource.java
@@ -44,7 +44,7 @@ import scala.Option;
 
 import io.delta.tables.DeltaTable;
 
-import org.apache.xtable.exception.OneIOException;
+import org.apache.xtable.exception.ReadException;
 import org.apache.xtable.model.CommitsBacklog;
 import org.apache.xtable.model.InstantsForIncrementalSync;
 import org.apache.xtable.model.InternalSnapshot;
@@ -192,7 +192,7 @@ public class DeltaConversionSource implements ConversionSource<Long> {
       fileIterator.forEachRemaining(dataFiles::add);
       return PartitionFileGroup.fromFiles(dataFiles);
     } catch (Exception e) {
-      throw new OneIOException("Failed to iterate through Delta data files", e);
+      throw new ReadException("Failed to iterate through Delta data files", e);
     }
   }
 
diff --git a/core/src/main/java/org/apache/xtable/delta/DeltaStatsExtractor.java b/core/src/main/java/org/apache/xtable/delta/DeltaStatsExtractor.java
index 12e01d8a..572cc104 100644
--- a/core/src/main/java/org/apache/xtable/delta/DeltaStatsExtractor.java
+++ b/core/src/main/java/org/apache/xtable/delta/DeltaStatsExtractor.java
@@ -42,7 +42,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import org.apache.xtable.collectors.CustomCollectors;
-import org.apache.xtable.exception.OneIOException;
+import org.apache.xtable.model.exception.ParseException;
 import org.apache.xtable.model.schema.InternalField;
 import org.apache.xtable.model.schema.InternalSchema;
 import org.apache.xtable.model.schema.InternalType;
@@ -201,7 +201,7 @@ public class DeltaStatsExtractor {
               })
           .collect(CustomCollectors.toList(fields.size()));
     } catch (IOException ex) {
-      throw new OneIOException("Unable to parse stats json", ex);
+      throw new ParseException("Unable to parse stats json", ex);
     }
   }
 
diff --git a/core/src/main/java/org/apache/xtable/delta/DeltaValueConverter.java b/core/src/main/java/org/apache/xtable/delta/DeltaValueConverter.java
index 3e46dd81..d9d15a04 100644
--- a/core/src/main/java/org/apache/xtable/delta/DeltaValueConverter.java
+++ b/core/src/main/java/org/apache/xtable/delta/DeltaValueConverter.java
@@ -33,7 +33,6 @@ import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.xtable.exception.NotSupportedException;
-import org.apache.xtable.exception.OneIOException;
 import org.apache.xtable.model.schema.InternalSchema;
 import org.apache.xtable.model.schema.InternalType;
 import org.apache.xtable.model.schema.PartitionTransformType;
@@ -75,7 +74,8 @@ public class DeltaValueConverter {
       try {
         instant = dateFormat.parse(value.toString()).toInstant();
       } catch (ParseException ex) {
-        throw new OneIOException("Unable to parse time from column stats", ex);
+        throw new org.apache.xtable.model.exception.ParseException(
+            "Unable to parse time from column stats", ex);
       }
     }
     InternalSchema.MetadataValue timestampPrecision =
@@ -186,7 +186,8 @@ public class DeltaValueConverter {
         DateFormat formatter = getDateFormat(dateFormat);
         return formatter.parse(value).toInstant().toEpochMilli();
       } catch (ParseException ex) {
-        throw new OneIOException("Unable to parse partition value", ex);
+        throw new org.apache.xtable.model.exception.ParseException(
+            "Unable to parse partition value", ex);
       }
     }
   }
diff --git a/core/src/main/java/org/apache/xtable/exception/OneIOException.java b/core/src/main/java/org/apache/xtable/exception/ReadException.java
similarity index 68%
copy from core/src/main/java/org/apache/xtable/exception/OneIOException.java
copy to core/src/main/java/org/apache/xtable/exception/ReadException.java
index b6039b60..f54cd4a4 100644
--- a/core/src/main/java/org/apache/xtable/exception/OneIOException.java
+++ b/core/src/main/java/org/apache/xtable/exception/ReadException.java
@@ -21,12 +21,17 @@ package org.apache.xtable.exception;
 import org.apache.xtable.model.exception.ErrorCode;
 import org.apache.xtable.model.exception.InternalException;
 
-public class OneIOException extends InternalException {
-  public OneIOException(String message, Throwable e) {
-    super(ErrorCode.IO_EXCEPTION, message, e);
+/**
+ * Exception thrown when there is an error reading existing state from a {@link
+ * org.apache.xtable.spi.extractor.ConversionSource} or {@link
+ * org.apache.xtable.spi.sync.ConversionTarget}.
+ */
+public class ReadException extends InternalException {
+  public ReadException(String message, Throwable e) {
+    super(ErrorCode.READ_EXCEPTION, message, e);
   }
 
-  public OneIOException(String message) {
-    super(ErrorCode.IO_EXCEPTION, message);
+  public ReadException(String message) {
+    super(ErrorCode.READ_EXCEPTION, message);
   }
 }
diff --git a/core/src/main/java/org/apache/xtable/exception/OneIOException.java b/core/src/main/java/org/apache/xtable/exception/UpdateException.java
similarity index 72%
rename from core/src/main/java/org/apache/xtable/exception/OneIOException.java
rename to core/src/main/java/org/apache/xtable/exception/UpdateException.java
index b6039b60..f3d32d8b 100644
--- a/core/src/main/java/org/apache/xtable/exception/OneIOException.java
+++ b/core/src/main/java/org/apache/xtable/exception/UpdateException.java
@@ -21,12 +21,16 @@ package org.apache.xtable.exception;
 import org.apache.xtable.model.exception.ErrorCode;
 import org.apache.xtable.model.exception.InternalException;
 
-public class OneIOException extends InternalException {
-  public OneIOException(String message, Throwable e) {
-    super(ErrorCode.IO_EXCEPTION, message, e);
+/**
+ * Exception thrown when there is an error updating a {@link
+ * org.apache.xtable.spi.sync.ConversionTarget}.
+ */
+public class UpdateException extends InternalException {
+  public UpdateException(String message, Throwable e) {
+    super(ErrorCode.UPDATE_EXCEPTION, message, e);
   }
 
-  public OneIOException(String message) {
-    super(ErrorCode.IO_EXCEPTION, message);
+  public UpdateException(String message) {
+    super(ErrorCode.UPDATE_EXCEPTION, message);
   }
 }
diff --git a/core/src/main/java/org/apache/xtable/hudi/HudiConversionSource.java b/core/src/main/java/org/apache/xtable/hudi/HudiConversionSource.java
index 9e0a8d88..bdb798f1 100644
--- a/core/src/main/java/org/apache/xtable/hudi/HudiConversionSource.java
+++ b/core/src/main/java/org/apache/xtable/hudi/HudiConversionSource.java
@@ -43,7 +43,7 @@ import com.google.common.collect.Iterators;
 import com.google.common.collect.PeekingIterator;
 
 import org.apache.xtable.collectors.CustomCollectors;
-import org.apache.xtable.exception.OneIOException;
+import org.apache.xtable.exception.ReadException;
 import org.apache.xtable.model.CommitsBacklog;
 import org.apache.xtable.model.InstantsForIncrementalSync;
 import org.apache.xtable.model.InternalSnapshot;
@@ -91,7 +91,7 @@ public class HudiConversionSource implements ConversionSource<HoodieInstant> {
         completedTimeline
             .lastInstant()
             .orElseThrow(
-                () -> new OneIOException("Unable to read latest commit from Hudi source table"));
+                () -> new ReadException("Unable to read latest commit from Hudi source table"));
     List<HoodieInstant> pendingInstants =
         activeTimeline
             .filterInflightsAndRequested()
diff --git a/core/src/main/java/org/apache/xtable/hudi/HudiConversionTarget.java b/core/src/main/java/org/apache/xtable/hudi/HudiConversionTarget.java
index 424d8228..a778462d 100644
--- a/core/src/main/java/org/apache/xtable/hudi/HudiConversionTarget.java
+++ b/core/src/main/java/org/apache/xtable/hudi/HudiConversionTarget.java
@@ -81,7 +81,8 @@ import com.google.common.annotations.VisibleForTesting;
 import org.apache.xtable.avro.AvroSchemaConverter;
 import org.apache.xtable.conversion.PerTableConfig;
 import org.apache.xtable.exception.NotSupportedException;
-import org.apache.xtable.exception.OneIOException;
+import org.apache.xtable.exception.ReadException;
+import org.apache.xtable.exception.UpdateException;
 import org.apache.xtable.model.InternalTable;
 import org.apache.xtable.model.TableSyncMetadata;
 import org.apache.xtable.model.schema.InternalField;
@@ -304,7 +305,7 @@ public class HudiConversionTarget implements ConversionTarget {
                               .getExtraMetadata();
                         }
                       } catch (IOException ex) {
-                        throw new OneIOException("Unable to read Hudi commit metadata", ex);
+                        throw new ReadException("Unable to read Hudi commit metadata", ex);
                       }
                     })
                 .flatMap(TableSyncMetadata::fromMap));
@@ -359,7 +360,7 @@ public class HudiConversionTarget implements ConversionTarget {
           // reuse existing table schema if no schema is provided as part of this commit
           schema = new TableSchemaResolver(metaClient).getTableAvroSchema();
         } catch (Exception ex) {
-          throw new OneIOException("Unable to read Hudi table schema", ex);
+          throw new ReadException("Unable to read Hudi table schema", ex);
         }
       }
       HoodieWriteConfig writeConfig =
@@ -426,7 +427,7 @@ public class HudiConversionTarget implements ConversionTarget {
       try {
         partitionsToClean = planner.getPartitionPathsToClean(earliestInstant);
       } catch (IOException ex) {
-        throw new OneIOException("Unable to get partitions to clean", ex);
+        throw new ReadException("Unable to get partitions to clean", ex);
       }
       if (partitionsToClean.isEmpty()) {
         return;
@@ -532,7 +533,7 @@ public class HudiConversionTarget implements ConversionTarget {
         activeTimeline.transitionCleanInflightToComplete(
             inflightClean, TimelineMetadataUtils.serializeCleanMetadata(cleanMetadata));
       } catch (Exception ex) {
-        throw new OneIOException("Unable to clean Hudi timeline", ex);
+        throw new UpdateException("Unable to clean Hudi timeline", ex);
       }
     }
 
@@ -543,7 +544,7 @@ public class HudiConversionTarget implements ConversionTarget {
         HoodieTimelineArchiver archiver = new HoodieTimelineArchiver(config, table);
         archiver.archiveIfRequired(engineContext, true);
       } catch (IOException ex) {
-        throw new OneIOException("Unable to archive Hudi timeline", ex);
+        throw new UpdateException("Unable to archive Hudi timeline", ex);
       }
     }
 
diff --git a/core/src/main/java/org/apache/xtable/hudi/HudiDataFileExtractor.java b/core/src/main/java/org/apache/xtable/hudi/HudiDataFileExtractor.java
index 1d1b2377..d14ab859 100644
--- a/core/src/main/java/org/apache/xtable/hudi/HudiDataFileExtractor.java
+++ b/core/src/main/java/org/apache/xtable/hudi/HudiDataFileExtractor.java
@@ -59,8 +59,10 @@ import org.apache.hudi.common.table.view.TableFileSystemView;
 import org.apache.hudi.metadata.HoodieTableMetadata;
 
 import org.apache.xtable.collectors.CustomCollectors;
-import org.apache.xtable.exception.OneIOException;
+import org.apache.xtable.exception.NotSupportedException;
+import org.apache.xtable.exception.ReadException;
 import org.apache.xtable.model.InternalTable;
+import org.apache.xtable.model.exception.ParseException;
 import org.apache.xtable.model.schema.InternalPartitionField;
 import org.apache.xtable.model.schema.SchemaVersion;
 import org.apache.xtable.model.stat.PartitionValue;
@@ -117,7 +119,7 @@ public class HudiDataFileExtractor implements AutoCloseable {
               : FSUtils.getAllPartitionPaths(engineContext, metadataConfig, basePath.toString());
       return getInternalDataFilesForPartitions(allPartitionPaths, table);
     } catch (IOException ex) {
-      throw new OneIOException(
+      throw new ReadException(
           "Unable to read partitions for table " + metaClient.getTableConfig().getTableName(), ex);
     }
   }
@@ -245,11 +247,11 @@ public class HudiDataFileExtractor implements AutoCloseable {
           // these do not impact the base files
           break;
         default:
-          throw new OneIOException("Unexpected commit type " + instant.getAction());
+          throw new NotSupportedException("Unexpected commit type " + instant.getAction());
       }
       return AddedAndRemovedFiles.builder().added(addedFiles).removed(removedFiles).build();
     } catch (IOException ex) {
-      throw new OneIOException("Unable to read commit metadata for commit " + instant, ex);
+      throw new ReadException("Unable to read commit metadata for commit " + instant, ex);
     }
   }
 
@@ -269,7 +271,7 @@ public class HudiDataFileExtractor implements AutoCloseable {
                 }
                 return new URI(basePathUri.getScheme(), path, null).toString();
               } catch (URISyntaxException e) {
-                throw new OneIOException("Unable to parse path " + path, e);
+                throw new ParseException("Unable to parse path " + path, e);
               }
             })
         .filter(uri -> !FSUtils.isLogFile(new Path(uri).getName()))
@@ -372,7 +374,7 @@ public class HudiDataFileExtractor implements AutoCloseable {
       }
       fileSystemViewManager.close();
     } catch (Exception e) {
-      throw new OneIOException(
+      throw new ReadException(
           "Could not close table metadata for table " + metaClient.getTableConfig().getTableName());
     }
   }
diff --git a/core/src/main/java/org/apache/xtable/hudi/HudiTableManager.java b/core/src/main/java/org/apache/xtable/hudi/HudiTableManager.java
index 1c3d237d..1ac1b5aa 100644
--- a/core/src/main/java/org/apache/xtable/hudi/HudiTableManager.java
+++ b/core/src/main/java/org/apache/xtable/hudi/HudiTableManager.java
@@ -35,7 +35,7 @@ import org.apache.hudi.common.table.HoodieTableMetaClient;
 import org.apache.hudi.common.util.VisibleForTesting;
 import org.apache.hudi.exception.TableNotFoundException;
 
-import org.apache.xtable.exception.OneIOException;
+import org.apache.xtable.exception.UpdateException;
 import org.apache.xtable.model.InternalTable;
 import org.apache.xtable.model.schema.InternalField;
 import org.apache.xtable.model.schema.InternalPartitionField;
@@ -117,7 +117,7 @@ class HudiTableManager {
                   .collect(Collectors.joining(",")))
           .initTable(configuration, tableDataPath);
     } catch (IOException ex) {
-      throw new OneIOException("Unable to initialize Hudi table", ex);
+      throw new UpdateException("Unable to initialize Hudi table", ex);
     }
   }
 
diff --git a/core/src/main/java/org/apache/xtable/iceberg/IcebergConversionSource.java b/core/src/main/java/org/apache/xtable/iceberg/IcebergConversionSource.java
index 2308b839..330d9f33 100644
--- a/core/src/main/java/org/apache/xtable/iceberg/IcebergConversionSource.java
+++ b/core/src/main/java/org/apache/xtable/iceberg/IcebergConversionSource.java
@@ -37,7 +37,7 @@ import org.apache.iceberg.io.CloseableIterable;
 import org.apache.iceberg.io.FileIO;
 
 import org.apache.xtable.conversion.PerTableConfig;
-import org.apache.xtable.exception.OneIOException;
+import org.apache.xtable.exception.ReadException;
 import org.apache.xtable.model.CommitsBacklog;
 import org.apache.xtable.model.InstantsForIncrementalSync;
 import org.apache.xtable.model.InternalSnapshot;
@@ -150,7 +150,7 @@ public class IcebergConversionSource implements ConversionSource<Snapshot> {
       }
       partitionedDataFiles = PartitionFileGroup.fromFiles(irFiles);
     } catch (IOException e) {
-      throw new OneIOException("Failed to fetch current snapshot files from Iceberg source", e);
+      throw new ReadException("Failed to fetch current snapshot files from Iceberg source", e);
     }
 
     return InternalSnapshot.builder()
diff --git a/core/src/main/java/org/apache/xtable/iceberg/IcebergDataFileUpdatesSync.java b/core/src/main/java/org/apache/xtable/iceberg/IcebergDataFileUpdatesSync.java
index 9fd60bf7..80e1559f 100644
--- a/core/src/main/java/org/apache/xtable/iceberg/IcebergDataFileUpdatesSync.java
+++ b/core/src/main/java/org/apache/xtable/iceberg/IcebergDataFileUpdatesSync.java
@@ -28,7 +28,7 @@ import org.apache.iceberg.*;
 import org.apache.iceberg.io.CloseableIterable;
 
 import org.apache.xtable.exception.NotSupportedException;
-import org.apache.xtable.exception.OneIOException;
+import org.apache.xtable.exception.ReadException;
 import org.apache.xtable.model.InternalTable;
 import org.apache.xtable.model.storage.DataFilesDiff;
 import org.apache.xtable.model.storage.FilesDiff;
@@ -54,7 +54,7 @@ public class IcebergDataFileUpdatesSync {
           .map(FileScanTask::file)
           .forEach(file -> previousFiles.put(file.path().toString(), file));
     } catch (Exception e) {
-      throw new OneIOException("Failed to iterate through Iceberg data files", e);
+      throw new ReadException("Failed to iterate through Iceberg data files", e);
     }
 
     FilesDiff<InternalDataFile, DataFile> diff =