You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polaris.apache.org by di...@apache.org on 2025/08/16 04:17:52 UTC

(polaris) branch view-drop-no-purge created (now d01287021)

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

dimas pushed a change to branch view-drop-no-purge
in repository https://gitbox.apache.org/repos/asf/polaris.git


      at d01287021 Add feature config to allow dropping views without purging

This branch includes the following new commits:

     new d01287021 Add feature config to allow dropping views without purging

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(polaris) 01/01: Add feature config to allow dropping views without purging

Posted by di...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dimas pushed a commit to branch view-drop-no-purge
in repository https://gitbox.apache.org/repos/asf/polaris.git

commit d01287021a76da5fa5d81a115bf09cf2c46658f4
Author: Dmitri Bourlatchkov <dm...@gmail.com>
AuthorDate: Sat Aug 16 00:17:40 2025 -0400

    Add feature config to allow dropping views without purging
    
    With tables, the client can decide whether to purge the table
    on drop or not. However, Polaris Servers used to unconditionally
    perform the purge on dropping a view.
    
    After #1619 that behaviour effectively prevents dropping views
    if the admin user does not set `DROP_WITH_PURGE_ENABLED`. The
    latter, though, is not currently advisable per #1617.
    
    This change introduces a new feature configuration
    (`PURGE_VIEWS_ON_DROP`) that allows the admin user to instruct
    Polaris servers to drop views without purging to achieve
    operational parity with tables.
    
    Fixes #2367
---
 .../it/test/PolarisRestCatalogIntegrationBase.java | 26 ++++++++++++++++++++++
 .../polaris/core/config/FeatureConfiguration.java  |  9 ++++++++
 .../service/catalog/iceberg/IcebergCatalog.java    |  8 ++++++-
 3 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogIntegrationBase.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogIntegrationBase.java
index 469ca37ce..ea08d9bb0 100644
--- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogIntegrationBase.java
+++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogIntegrationBase.java
@@ -1199,6 +1199,32 @@ public abstract class PolarisRestCatalogIntegrationBase extends CatalogTests<RES
     }
   }
 
+  @Test
+  public void testDropViewWithPurge() {
+    restCatalog.createNamespace(Namespace.of("ns1"));
+    TableIdentifier id = TableIdentifier.of(Namespace.of("ns1"), "view1");
+    restCatalog
+        .buildView(id)
+        .withSchema(SCHEMA)
+        .withDefaultNamespace(Namespace.of("ns1"))
+        .withQuery("spark", VIEW_QUERY)
+        .create();
+
+    Catalog catalog = managementApi.getCatalog(currentCatalogName);
+    Map<String, String> catalogProps = new HashMap<>(catalog.getProperties().toMap());
+    catalogProps.put(FeatureConfiguration.DROP_WITH_PURGE_ENABLED.catalogConfig(), "false");
+    catalogProps.put(FeatureConfiguration.PURGE_VIEWS_ON_DROP.catalogConfig(), "true");
+    managementApi.updateCatalog(catalog, catalogProps);
+
+    assertThatThrownBy(() -> restCatalog.dropView(id)).isInstanceOf(ForbiddenException.class);
+
+    catalog = managementApi.getCatalog(currentCatalogName);
+    catalogProps.put(FeatureConfiguration.PURGE_VIEWS_ON_DROP.catalogConfig(), "false");
+    managementApi.updateCatalog(catalog, catalogProps);
+
+    assertThatCode(() -> restCatalog.dropView(id)).doesNotThrowAnyException();
+  }
+
   @Test
   public void testRenameViewStatus() {
     String tableName = "tbl1";
diff --git a/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java b/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java
index fe5d6bc6a..58dba287b 100644
--- a/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java
+++ b/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java
@@ -191,6 +191,15 @@ public class FeatureConfiguration<T> extends PolarisConfiguration<T> {
           .defaultValue(false)
           .buildFeatureConfiguration();
 
+  public static final FeatureConfiguration<Boolean> PURGE_VIEWS_ON_DROP =
+      PolarisConfiguration.<Boolean>builder()
+          .key("PURGE_VIEWS_ON_DROP")
+          .catalogConfig("polaris.config.purge-views-on-drop")
+          .description(
+              "Indicates whether Polaris should purge view metadata files when a view is dropped.")
+          .defaultValue(true)
+          .buildFeatureConfiguration();
+
   public static final FeatureConfiguration<Integer> STORAGE_CREDENTIAL_DURATION_SECONDS =
       PolarisConfiguration.<Integer>builder()
           .key("STORAGE_CREDENTIAL_DURATION_SECONDS")
diff --git a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
index 9d37dd32d..6283e65c6 100644
--- a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
+++ b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
@@ -807,7 +807,13 @@ public class IcebergCatalog extends BaseMetastoreViewCatalog
 
   @Override
   public boolean dropView(TableIdentifier identifier) {
-    return dropTableLike(PolarisEntitySubType.ICEBERG_VIEW, identifier, Map.of(), true).isSuccess();
+    boolean purge =
+        callContext
+            .getRealmConfig()
+            .getConfig(FeatureConfiguration.PURGE_VIEWS_ON_DROP, catalogEntity);
+
+    return dropTableLike(PolarisEntitySubType.ICEBERG_VIEW, identifier, Map.of(), purge)
+        .isSuccess();
   }
 
   @Override