Skip to content

Commit

Permalink
added nosnapshotfound exception
Browse files Browse the repository at this point in the history
  • Loading branch information
Blazer-007 committed Dec 7, 2024
1 parent 4879219 commit eb3ef7d
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,12 @@ public TableNotFoundException(TableIdentifier tableId) {
}
}

public static class NoSnapshotFoundException extends IOException {
public NoSnapshotFoundException(TableIdentifier tableId) {
super("No Snapshot found: '" + tableId + "'");
}
}

@Getter
private final TableIdentifier tableId;
/** allow the {@link IcebergCatalog} creating this table to qualify its {@link DatasetDescriptor#getName()} used for lineage, etc. */
Expand All @@ -97,19 +103,22 @@ public TableNotFoundException(TableIdentifier tableId) {
/** @return metadata info limited to the most recent (current) snapshot */
public IcebergSnapshotInfo getCurrentSnapshotInfo() throws IOException {
TableMetadata current = accessTableMetadata();
return createSnapshotInfo(current.currentSnapshot(), Optional.of(current.metadataFileLocation()), Optional.of(current));
Snapshot currentSnapshot = accessCurrentSnapshot(current);
return createSnapshotInfo(currentSnapshot, Optional.of(current.metadataFileLocation()), Optional.of(current));
}

/** @return metadata info for most recent snapshot, wherein manifests and their child data files ARE NOT listed */
public IcebergSnapshotInfo getCurrentSnapshotInfoOverviewOnly() throws IOException {
TableMetadata current = accessTableMetadata();
return createSnapshotInfo(current.currentSnapshot(), Optional.of(current.metadataFileLocation()), Optional.of(current), true);
Snapshot currentSnapshot = accessCurrentSnapshot(current);
return createSnapshotInfo(currentSnapshot, Optional.of(current.metadataFileLocation()), Optional.of(current), true);
}

/** @return metadata info for all known snapshots, ordered historically, with *most recent last* */
public Iterator<IcebergSnapshotInfo> getAllSnapshotInfosIterator() throws IOException {
TableMetadata current = accessTableMetadata();
long currentSnapshotId = current.currentSnapshot().snapshotId();
Snapshot currentSnapshot = accessCurrentSnapshot(current);
long currentSnapshotId = currentSnapshot.snapshotId();
List<Snapshot> snapshots = current.snapshots();
return Iterators.transform(snapshots.iterator(), snapshot -> {
try {
Expand Down Expand Up @@ -172,6 +181,12 @@ protected TableMetadata accessTableMetadata() throws TableNotFoundException {
return Optional.ofNullable(current).orElseThrow(() -> new TableNotFoundException(this.tableId));
}

/** @throws {@link IcebergTable.NoSnapshotFoundException} when table is empty i.e. table has zero snapshot */
protected Snapshot accessCurrentSnapshot(TableMetadata tableMetadata) throws NoSnapshotFoundException {
Snapshot currentSnapshot = tableMetadata.currentSnapshot();
return Optional.ofNullable(currentSnapshot).orElseThrow(() -> new NoSnapshotFoundException(this.tableId));
}

protected IcebergSnapshotInfo createSnapshotInfo(Snapshot snapshot, Optional<String> metadataFileLocation, Optional<TableMetadata> currentTableMetadata)
throws IOException {
return createSnapshotInfo(snapshot, metadataFileLocation, currentTableMetadata, false);
Expand Down Expand Up @@ -239,8 +254,7 @@ protected void registerIcebergTable(TableMetadata srcMetadata, TableMetadata dst
public List<DataFile> getPartitionSpecificDataFiles(Predicate<StructLike> icebergPartitionFilterPredicate)
throws IOException {
TableMetadata tableMetadata = accessTableMetadata();
Snapshot currentSnapshot = Optional.ofNullable(tableMetadata.currentSnapshot())
.orElseThrow(() -> new IOException(String.format("~%s~ No snapshots found", tableId)));
Snapshot currentSnapshot = accessCurrentSnapshot(tableMetadata);
long currentSnapshotId = currentSnapshot.snapshotId();
List<DataFile> knownDataFiles = new ArrayList<>();
GrowthMilestoneTracker growthMilestoneTracker = new GrowthMilestoneTracker();
Expand Down Expand Up @@ -287,10 +301,10 @@ protected void overwritePartition(List<DataFile> dataFiles, String partitionColN
return;
}
TableMetadata tableMetadata = accessTableMetadata();
Optional<Snapshot> currentSnapshot = Optional.ofNullable(tableMetadata.currentSnapshot());
if (currentSnapshot.isPresent()) {
log.info("~{}~ SnapshotId before overwrite: {}", tableId, currentSnapshot.get().snapshotId());
} else {
try {
Snapshot currentSnapshot = accessCurrentSnapshot(tableMetadata);
log.info("~{}~ SnapshotId before overwrite: {}", tableId, currentSnapshot.snapshotId());
} catch (NoSnapshotFoundException e) {
log.warn("~{}~ No current snapshot found before overwrite", tableId);
}
OverwriteFiles overwriteFiles = this.table.newOverwrite();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,14 @@ public void testGetCurrentSnapshotInfoOnBogusTable() throws IOException {
Assert.fail("expected an exception when using table ID '" + bogusTableId + "'");
}

/** Verify failure when attempting to get current snapshot info for an empty table */
@Test(expectedExceptions = IcebergTable.NoSnapshotFoundException.class)
public void testGetCurrentSnapshotInfoOnEmptyTable() throws IOException {
IcebergSnapshotInfo snapshotInfo = new IcebergTable(tableId, catalog.newTableOps(tableId), catalogUri,
catalog.loadTable(tableId)).getCurrentSnapshotInfo();
Assert.fail("expected an exception when using table ID '" + tableId + "'");
}

/** Verify info about all (full) snapshots */
@Test
public void testGetAllSnapshotInfosIterator() throws IOException {
Expand Down Expand Up @@ -253,18 +261,6 @@ public void testGetPartitionSpecificDataFiles() throws IOException {
Assert.assertEquals(icebergTable.getPartitionSpecificDataFiles(alwaysFalsePredicate).size(), 0);
}

@Test
public void testGetPartitionSpecificDataFilesThrowsExceptionWhenNoSnapshotsFound() throws IOException {
IcebergTable icebergTable = new IcebergTable(tableId,
catalog.newTableOps(tableId),
catalogUri,
catalog.loadTable(tableId));
// Using AlwaysTrue Predicate to avoid mocking of predicate class
Predicate<StructLike> alwaysTruePredicate = partition -> true;
IOException exception = Assert.expectThrows(IOException.class, () -> icebergTable.getPartitionSpecificDataFiles(alwaysTruePredicate));
Assert.assertEquals(exception.getMessage(), String.format("~%s~ No snapshots found", tableId));
}

/** Verify that overwritePartition replace data files belonging to given partition col and value */
@Test
public void testOverwritePartition() throws IOException {
Expand Down

0 comments on commit eb3ef7d

Please sign in to comment.