This is an automated email from the ASF dual-hosted git repository. amoghj pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/iceberg.git
The following commit(s) were added to refs/heads/main by this push: new cc4fe4cc50 Core: Ensure current and newly added view versions are retained in ViewMetadata build (#12401) cc4fe4cc50 is described below commit cc4fe4cc50043ccba89700f7948090ff87a5baee Author: Leon Lin <lianglin....@gmail.com> AuthorDate: Wed Mar 5 08:18:01 2025 -0800 Core: Ensure current and newly added view versions are retained in ViewMetadata build (#12401) --- .../java/org/apache/iceberg/view/ViewMetadata.java | 16 +++++++++++--- .../org/apache/iceberg/view/TestViewMetadata.java | 25 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/apache/iceberg/view/ViewMetadata.java b/core/src/main/java/org/apache/iceberg/view/ViewMetadata.java index cedbd31fb9..05c6ef3750 100644 --- a/core/src/main/java/org/apache/iceberg/view/ViewMetadata.java +++ b/core/src/main/java/org/apache/iceberg/view/ViewMetadata.java @@ -35,6 +35,7 @@ import org.apache.iceberg.exceptions.ValidationException; import org.apache.iceberg.relocated.com.google.common.annotations.VisibleForTesting; import org.apache.iceberg.relocated.com.google.common.base.Preconditions; import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap; +import org.apache.iceberg.relocated.com.google.common.collect.ImmutableSet; import org.apache.iceberg.relocated.com.google.common.collect.Lists; import org.apache.iceberg.relocated.com.google.common.collect.Maps; import org.apache.iceberg.relocated.com.google.common.collect.Sets; @@ -462,9 +463,18 @@ public interface ViewMetadata extends Serializable { ViewProperties.VERSION_HISTORY_SIZE, historySize); - // expire old versions, but keep at least the versions added in this builder - int numAddedVersions = (int) changes(MetadataUpdate.AddViewVersion.class).count(); - int numVersionsToKeep = Math.max(numAddedVersions, historySize); + // expire old versions, but keep at least the versions added in this builder and the current + // version + int numVersions = + ImmutableSet.builder() + .addAll( + changes(MetadataUpdate.AddViewVersion.class) + .map(v -> v.viewVersion().versionId()) + .collect(Collectors.toSet())) + .add(currentVersionId) + .build() + .size(); + int numVersionsToKeep = Math.max(numVersions, historySize); List<ViewVersion> retainedVersions; List<ViewHistoryEntry> retainedHistory; diff --git a/core/src/test/java/org/apache/iceberg/view/TestViewMetadata.java b/core/src/test/java/org/apache/iceberg/view/TestViewMetadata.java index fc22a2d891..3a713d061b 100644 --- a/core/src/test/java/org/apache/iceberg/view/TestViewMetadata.java +++ b/core/src/test/java/org/apache/iceberg/view/TestViewMetadata.java @@ -396,6 +396,31 @@ public class TestViewMetadata { .hasMessage("Cannot set current version to unknown version: 1"); } + @Test + public void versionsAddedInCurrentBuildAreRetained() { + ViewVersion v1 = newViewVersion(1, "select 1 as count"); + ViewVersion v2 = newViewVersion(2, "select count from t1"); + ViewVersion v3 = newViewVersion(3, "select count(1) as count from t2"); + + ViewMetadata metadata = + ViewMetadata.builder() + .setLocation("location") + .addSchema(new Schema(Types.NestedField.required(1, "x", Types.LongType.get()))) + .addVersion(v1) + .setCurrentVersionId(v1.versionId()) + .setProperties(ImmutableMap.of(ViewProperties.VERSION_HISTORY_SIZE, "2")) + .build(); + assertThat(metadata.versions()).containsOnly(v1); + + // make sure all currently added versions are retained + ViewMetadata updated = ViewMetadata.buildFrom(metadata).addVersion(v2).addVersion(v3).build(); + assertThat(updated.versions()).containsExactlyInAnyOrder(v1, v2, v3); + + // rebuild the metadata to expire older versions + updated = ViewMetadata.buildFrom(updated).build(); + assertThat(updated.versions()).containsExactlyInAnyOrder(v1, v3); + } + @Test public void viewMetadataAndMetadataChanges() { Map<String, String> properties = ImmutableMap.of("key1", "prop1", "key2", "prop2");