Skip to content

Conversation

@liamzwbao
Copy link
Contributor

@liamzwbao liamzwbao commented Apr 6, 2025

Summary

Fix #1273

Currently, Polaris does not allow creating a view with a customMetadataLocation outside of the allowedLocations defined in the storageConfig, but I think this might be a feature we need to unblock. I've documented Polaris's behavior in this PR and would appreciate the ideas of what should be the expected behavior. Here's a summary:

1. View Creation with Custom Metadata Location

A user cannot create a view with a customMetadataLocation outside of allowedLocations in storageConfig, unless:

  • The parent namespace defines the property write.metadata.path.
  • The customMetadataLocation is a subpath of that value.

This behavior is enabled by this code block, which updates the storage config to include write.metadata.path.

Example:
If the namespace has write.metadata.path=file://baseLocation, then the view can be created at file://baseLocation/customLocation.

2. Editing View’s Metadata Location to a Sibling Path

Once the view is created, the user cannot update its customMetadataLocation to a sibling path like file://baseLocation/customLocation2

Reason:
The validation logic currently checks against the view’s own write.metadata.path for updating, not the parent namespace’s.

3. Editing Metadata Location to a Subpath Also Fails

Even updating the metadata location to a child path of the original is not allowed: file://baseLocation/customLocationfile://baseLocation/customLocation/child

Reason:
This is rejected because the view’s properties are stored in internalProperties rather than properties, so the previous config override becomes ineffective.

Questions

  • What is the intended behavior for this write.metadata.path feature?
  • The config override logic mentioned above doesn't appear to be covered by any existing tests. I'm wondering the purpose of it.

@github-project-automation github-project-automation bot moved this to PRs In Progress in Basic Kanban Board Apr 6, 2025
@liamzwbao liamzwbao marked this pull request as ready for review April 6, 2025 15:55
@liamzwbao liamzwbao marked this pull request as draft April 6, 2025 15:55
@liamzwbao liamzwbao changed the title Issue 1273 fix custom metadata location Unblock test createViewWithCustomMetadataLocation Apr 6, 2025
@liamzwbao liamzwbao force-pushed the issue-1273-fix-custom-metadata-location branch from cd7ea05 to 887e001 Compare April 24, 2025 00:11
@liamzwbao liamzwbao force-pushed the issue-1273-fix-custom-metadata-location branch from 887e001 to 0dc0fec Compare April 29, 2025 22:54
@liamzwbao liamzwbao marked this pull request as ready for review April 29, 2025 22:54
dimas-b
dimas-b previously approved these changes May 28, 2025
Copy link
Contributor

@dimas-b dimas-b left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for bringing this up @liamzwbao !

Test code changes LGTM. However, I believe the issues mentioned in the description probably need to be discussed on the dev mailing list rather than in GH. Could you start a discussion thread there?

String customLocationChild =
Paths.get(tempDir.toUri().toString(), "custom-location/child").toString();

if (requiresNamespaceCreate()) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this not always true in Polaris?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is copied from the test in Iceberg and it's unnecessary here, let me remove this check.

super.createViewWithCustomMetadataLocation();
Assertions.assertThatThrownBy(super::createViewWithCustomMetadataLocation)
.isInstanceOf(ForbiddenException.class)
.hasMessageContaining("Forbidden: Invalid locations");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change and the following test method LGTM because they assert existing Polaris behaviour.

@github-project-automation github-project-automation bot moved this from PRs In Progress to Ready to merge in Basic Kanban Board May 28, 2025
@dimas-b dimas-b enabled auto-merge (squash) May 30, 2025 14:37
@dimas-b dimas-b merged commit f158f2e into apache:main Jun 2, 2025
9 checks passed
@github-project-automation github-project-automation bot moved this from Ready to merge to Done in Basic Kanban Board Jun 2, 2025
@liamzwbao liamzwbao deleted the issue-1273-fix-custom-metadata-location branch June 3, 2025 13:39
snazy added a commit to snazy/polaris that referenced this pull request Jun 13, 2025
* Fix regression test docker setup for purge (apache#1768)

* Use canonical catalog property names in tests (apache#1766)

* In `PolarisPolicyServiceIntegrationTest`
* In `PolarisRestCatalogIntegrationTest`

Following up to apache#1557

* Unblock test `createViewWithCustomMetadataLocation` (apache#1320)

* Add test for invalid custom metadata location

* Add missing properties during table/view creation

* main: Update docker.io/prom/prometheus Docker tag to v3.4.1 (apache#1767)

* Testing: silence a bunch of harmless test warnings (apache#1773)

* `OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended`
* Hibernate Validator cannot instrument static methods (`Hibernate Validator does not support constraints on static methods yet. ...`)
* ForkJoinPool test lifecycle warning
* Couple of split-package warnings

* Add unit test for legacy config lookup (apache#1774)

Following up on apache#1766

* Handle RequestScoped instance injection gracefully for DefaultConfigurationStore (apache#1758)

Although we do a check of !realmContextInstance.isUnsatisfied() it only checks if there is matching bean, however, it doesn't check if the context is active or not. Similarly isResolvable also don't check if the scope is active. Therefore if getConfiguration is called when there is no active scope, it will get Exception like ContextNotActiveException.
This actually fails the TaskExecutor because it runs in a separate thread.

In order to fix the problem, we introduces a new getConfiguration function to handle the background tasks, and also use isResolvable instead of isUnsatisfied to handle ambiguities.

* Restructure the directory and package name for persistence modules (apache#1724)

* Re-add missing parameters to create_table python API (apache#1778)

It looks like this method lost the `prefix` and `namespace` parameters in apache#1347. They're re-introduced to the spec here, and then I've run:
```
redocly bundle spec/polaris-catalog-service.yaml -o spec/generated/bundled-polaris-catalog-service.yaml
./gradlew regeneratePythonClient
```

Then, some manual reverts:
```
alias gitrevert='git checkout upstream/main --'
gitrevert client/python/.github/workflows/python.yml
gitrevert client/python/.gitlab-ci.yml
gitrevert client/python/pyproject.toml
```

I still hope to automate this process as part of CI soon; see apache#1675

* Replace getConfiguration usage with PolarisCallContext to use RealmContext (PART 1) (apache#1780)

* JDBC: Fix getting started config (apache#1781)

Fix typo in the JDBC config for getting started, the config should be max_duration_in_ms instead of max_delay_in_ms

* main: Pin dependencies (apache#1701)

* main: Update dependency pytest to v8 (apache#1710)

* main: Update dependency boto3 to v1.38.28 (apache#1777)

* Run renovatebot only on the main branch (apache#1786)

* INFO: last merged commit a827d26

---------

Co-authored-by: gh-yzou <[email protected]>
Co-authored-by: Dmitri Bourlatchkov <[email protected]>
Co-authored-by: Liam Bao <[email protected]>
Co-authored-by: Mend Renovate <[email protected]>
Co-authored-by: Yufei Gu <[email protected]>
Co-authored-by: Eric Maynard <[email protected]>
Co-authored-by: Prashant Singh <[email protected]>
Co-authored-by: JB Onofré <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unblock test createViewWithCustomMetadataLocation

2 participants