-
Notifications
You must be signed in to change notification settings - Fork 332
Add Delegator to all API Implementations #2434
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Delegator to all API Implementations #2434
Conversation
| @Qualifier | ||
| @Retention(RUNTIME) | ||
| @Target({TYPE, METHOD, FIELD, PARAMETER}) | ||
| public @interface ApiBusinessLogic { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm against the term "business logic". I find it very confusing. How about PublicApi?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure @PublicApi captures what we're trying to say here. What do you think about something like @ApiBaseImplementation?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see your idea now, I think 😅
However, I'm not sure this is the best approach. Current delegators tae concrete classes into their constructors - this reduces option for composing the delegators with other implementations.
Since delegation is apparently covering API interfaces, I believe it is best to have one delegator per *ApiService interface.
Then, I propose to use @MainService as a @Qualifier for PolarisServiceImpl, etc.
For completeness, we should probably use a qualifier like @EventsService for delegators that introduce events.
This way, both sets of services can be disambiguated in this repo and in downstream projects.
...e/service/src/main/java/org/apache/polaris/service/admin/PolarisServiceDefaultDelegator.java
Outdated
Show resolved
Hide resolved
|
|
||
|
|
||
| @RequestScoped | ||
| @Alternative |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What do we achieve by always using these delegating wrappers?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Once we get these delegating wrappers in, we can start adding the events instrumentation to these wrappers (as discussed on the Dev ML, based on the feedback from the community).
For example, the code in #1904 would then be re-written to go into these delegator classes instead.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we have something like PolarisServiceWithEvents?.. or EventProducingPolarisService?
The impl. will follow the delegator pattern. It's the "Default Delegator" in the class name that make me confused.
|
Thanks for your feedback, @dimas-b! I've updated the PR accordingly - please let me know if there is further feedback :) |
| import java.lang.annotation.Retention; | ||
| import java.lang.annotation.Target; | ||
|
|
||
| // Used to annotate delegator classes, which are emitting events |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| // Used to annotate delegator classes, which are emitting events | |
| /** Used to annotate delegator classes, which are emitting events. */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changed!
| @EventsServiceDelegator | ||
| @Alternative | ||
| @Priority(1000) // Will allow downstream project-specific delegators to be added and used | ||
| public class PolarisCatalogsServiceDefaultDelegator implements PolarisCatalogsApiService { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I like the general direction we are taking in this PR, but wanted to mention that this CDI pattern has dedicated annotations: @Decorator and @Delegate.
It's explained here:
- https://quarkus.io/guides/cdi#decorators
- https://jakarta.ee/specifications/cdi/3.0/jakarta-cdi-spec-3.0#decorator_bean
However, these annotations require both decorator and delegate beans to implement one common interface. This might not be possible for beans like IcebergCatalogAdapter since it's not an interface. We'd need to extract an interface from it in order to make the Decorator CDI pattern work.
Here, it could look like this:
@RequestScoped
@Default
@EventsServiceDelegator
@Decorator
@Priority(1000) // Will allow downstream project-specific delegators to be added and used
public class PolarisCatalogsServiceDefaultDelegator implements PolarisCatalogsApiService {
private final PolarisCatalogsApiService delegate;
@Inject
public PolarisCatalogsServiceDefaultDelegator(@Delegate @MainService PolarisCatalogsApiService delegate) {
this.delegate = delegate;
}There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That said, I see that most adapters generally implement one or more interfaces, e.g.
@RequestScoped
@MainService
public class IcebergCatalogAdapter
implements IcebergRestCatalogApiService, IcebergRestConfigurationApiService, CatalogAdapter {So, maybe using @Decorator could work out of the box, if both beans (decorator and delegate) implement exactly the same interfaces (and there is no ambiguity when resolving beans).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a good suggestion, it helps make the code a bit tighter as well. Added in the next revision!
| this.delegate = delegate; | ||
| } | ||
|
|
||
| /** From PolarisCatalogsApiService */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: do we need these dummy javadocs?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These are copied from the original file, I didn't remove them. Happy to remove if you're more comfortable without them, but I originally didn't see any reason to remove these.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hm what original file? I thought this file was new. This is a minor point though, so feel free to handle it as you see fit.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, I meant it came from PolarisServiceImpl.java, which was the base file that I was using for creating this file. Let me remove.
| @EventsServiceDelegator | ||
| @Alternative | ||
| @Priority(1000) // Will allow downstream project-specific delegators to be added and used | ||
| public class PolarisPrincipalRolesServiceDefaultDelegator |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: the naming convention is a bit odd, I'd expect the decorator to be named <DelegateName>EventServiceDelegator or something like that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hmm - I've tried naming everything into <DelegateName>DefaultDelegator rather than "...EventServiceDelegator" because in the following PRs, we will add the Events instrumentation to this Delegator. In other words, generating Events will be the default delegator. WDYT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So... what happens if we need delegators for something else? E.g. PolarisDiagnostics could be turned into another delegator, e.g. <DelegateName>Diagnostics.
The beauty of @Decorator is that you can in theory have as many decorators you need, and each time the decorated interface is injected, CDI would transparently create a chain of invocations that traverse all the decorators up to the "undecorated" bean. IOW if you inject PolarisCatalogsApiService somewhere, calling PolarisCatalogsApiService.createCatalog() would actually call <DelegateName>Diagnostics.createCatalog() then <DelegateName>EventServiceDelegator.createCatalog() then PolarisServiceImpl.createCatalog().
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I understand what you are saying now - I think I was originally closer to Dmitri's idea earlier in this PR by attempting to use a delegator wrapper without the Decorator pattern. Let me put a general comment on the PR regarding this and change the naming convention to more accurately reflect the Decorator pattern.
|
|
||
| /** Concrete implementation of the Polaris API services */ | ||
| @RequestScoped | ||
| @MainService |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This may not be necessary anymore when using proper interfaces and @Decorator / @Delegate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're correct - removed!
adutra
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @adnanhemani for this proposal that seems to go into a clean direction.
| @EventsServiceDelegator | ||
| @Alternative | ||
| @Priority(1000) // Will allow downstream project-specific delegators to be added and used | ||
| public class PolarisCatalogsServiceDefaultDelegator implements PolarisCatalogsApiService { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That said, I see that most adapters generally implement one or more interfaces, e.g.
@RequestScoped
@MainService
public class IcebergCatalogAdapter
implements IcebergRestCatalogApiService, IcebergRestConfigurationApiService, CatalogAdapter {So, maybe using @Decorator could work out of the box, if both beans (decorator and delegate) implement exactly the same interfaces (and there is no ambiguity when resolving beans).
adnanhemani
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @adutra for your feedback, I've push the revision addressing all the comments!
| import java.lang.annotation.Retention; | ||
| import java.lang.annotation.Target; | ||
|
|
||
| // Used to annotate delegator classes, which are emitting events |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changed!
| this.delegate = delegate; | ||
| } | ||
|
|
||
| /** From PolarisCatalogsApiService */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These are copied from the original file, I didn't remove them. Happy to remove if you're more comfortable without them, but I originally didn't see any reason to remove these.
| @EventsServiceDelegator | ||
| @Alternative | ||
| @Priority(1000) // Will allow downstream project-specific delegators to be added and used | ||
| public class PolarisPrincipalRolesServiceDefaultDelegator |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hmm - I've tried naming everything into <DelegateName>DefaultDelegator rather than "...EventServiceDelegator" because in the following PRs, we will add the Events instrumentation to this Delegator. In other words, generating Events will be the default delegator. WDYT?
| @EventsServiceDelegator | ||
| @Alternative | ||
| @Priority(1000) // Will allow downstream project-specific delegators to be added and used | ||
| public class PolarisCatalogsServiceDefaultDelegator implements PolarisCatalogsApiService { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a good suggestion, it helps make the code a bit tighter as well. Added in the next revision!
|
|
||
| /** Concrete implementation of the Polaris API services */ | ||
| @RequestScoped | ||
| @MainService |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're correct - removed!
adutra
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM thanks @adnanhemani – the naming convention is still imo a bit strange but we can change that later.
dimas-b
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM overall 👍
| @Qualifier | ||
| @Retention(RUNTIME) | ||
| @Target({TYPE, METHOD, FIELD, PARAMETER}) | ||
| public @interface EventsServiceDelegator {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe nitpicky, but "delegator" feels odd to me in a qualifier. A qualifier is supposed highlight a functional aspect of a bean, IMHO. Whether or not the bean delegates to other beans or genuinely implements and API should be be exposed in a qualifier, IMHO.
Would ServiceWithEvents or EventsEmitter (I assume it's supposed to emit events eventually) work?
|
I'm fine addressing naming concerns later if there's a general understanding that class and qualifier names will change :) |
|
|
||
| @EventsServiceDelegator | ||
| @Default | ||
| @Decorator |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using decorators is an interesting approach.
However, AFAIK, decorators are impossible to remove in downstream builds, right? I mean that if a decorator is discovered, it will be applied and all decorators will be applied in priority order. This means that all downstream users or runtime/service will always get this decorator in call paths.
This is fine, but I believe it might be wise to isolate the decorator in a new module (jar) to allow downstream projects to opt out of it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That is correct. This situation is generally solved by either deactivating the decorator through some configuration flag, or, as you pointed out, by isolating the decorators in separated modules that integrators are free to include or exclude.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point. I suppose @IfBuildProperty(...) might be good enough for now (without introducing new modules).
... or perhaps @UnlessBuildProperty(...).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed here with both of you. I'm leaning towards the @UnlessBuildProperty - but am thinking to leave this PR without it and let a future contribution make that change if anyone requires it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That works for me 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair enough
| import org.apache.polaris.core.context.RealmContext; | ||
| import org.apache.polaris.service.admin.api.PolarisCatalogsApiService; | ||
|
|
||
| @EventsServiceDelegator |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The idea in my previous comment when I suggested using custom qualifiers was to use them for composing the delegation chain of *ApiService implementations.
However, if we go with the decorator approach, I believe this qualifier becomes rather useless 🤔 WDYT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I asked myself the same question - but it all depends on how we are going to use these qualifiers, so I figured we would figure that out later 😅
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you're right @dimas-b. Let me remove it for now and then if we think it'll be useful later, we can always reintroduce it in a new change!
adnanhemani
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks all for the feedback! There was a gradual shift from originally using a delegator wrapper to using the Decorator pattern in this PR - but I think we have reached convergence on this pattern based on the comments in this PR.
Naming conventions are still not finalized, but I believe this is the closest we have been so far to something usable as a base. I will be releasing further PRs using this as a base shortly for further event instrumentation.
| @EventsServiceDelegator | ||
| @Alternative | ||
| @Priority(1000) // Will allow downstream project-specific delegators to be added and used | ||
| public class PolarisPrincipalRolesServiceDefaultDelegator |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I understand what you are saying now - I think I was originally closer to Dmitri's idea earlier in this PR by attempting to use a delegator wrapper without the Decorator pattern. Let me put a general comment on the PR regarding this and change the naming convention to more accurately reflect the Decorator pattern.
|
|
||
| @EventsServiceDelegator | ||
| @Default | ||
| @Decorator |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed here with both of you. I'm leaning towards the @UnlessBuildProperty - but am thinking to leave this PR without it and let a future contribution make that change if anyone requires it.
| this.delegate = delegate; | ||
| } | ||
|
|
||
| /** From PolarisCatalogsApiService */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, I meant it came from PolarisServiceImpl.java, which was the base file that I was using for creating this file. Let me remove.
| import org.apache.polaris.core.context.RealmContext; | ||
| import org.apache.polaris.service.admin.api.PolarisCatalogsApiService; | ||
|
|
||
| @EventsServiceDelegator |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you're right @dimas-b. Let me remove it for now and then if we think it'll be useful later, we can always reintroduce it in a new change!
|
|
||
| @Decorator | ||
| @Priority(1000) | ||
| @Alternative |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm I think @Decorator is mutually exclusive with @Alternative.
Alternative beans provide a whole different bean implementation. Use it when you want to suppress the original bean's behavior. It's similar to mocking.
Decorators on the other hand are used to further specialize the original bean's behavior, without suppressing it. It's similar to AOP interceptors.
IMO what we are trying to achieve here is the second approach where the original bean keeps doing its job, but we add behavior before/after each invocation of the bean.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You are correct - I misread some documentation while looking up what would be required if we wanted to use @UnlessBuildProperty in the future and thought that @Alternative would be required at that time. Let me remove that property and push again!
|
Looks good to me, I learned a lot about the delegator annotations allowed in the CDI from the discussion and it seems like this is a very straightforward pattern. |
| import org.apache.polaris.service.admin.api.PolarisPrincipalsApiService; | ||
|
|
||
| @Decorator | ||
| @Priority(1000) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: It might be worth adding a public constant for this priority value so that downstream projects could reference it... but it can be done later.
* Integration tests for Catalog Federation (apache#2344) Adds a Junit5 integration test for catalog federation. * Fix merge conflict in CatalogFederationIntegrationTest (apache#2420) apache#2344 added a new test for catalog federation, but it looks like an undetected conflict with concurrent changes related to authentication have broken the test in main. * chore(deps): update registry.access.redhat.com/ubi9/openjdk-21-runtime docker tag to v1.23-6.1755674729 (apache#2416) * 2334 (apache#2427) * Fix TableIdentifier in TaskFileIOSupplier (apache#2304) we cant just convert a `TaskEntity` to a `IcebergTableLikeEntity` as the `getTableIdentifier()` method will not return a correct value by using the name of the task and its parent namespace (which is empty?). task handlers instead need to pass in the `TableIdentifier` that they already inferred via `TaskEntity.readData`. * Fix NPE in CreateCatalog (apache#2435) * Doc fix: Access control page update (apache#2424) * 2418 * 2418 * fix(deps): update dependency software.amazon.awssdk:bom to v2.32.29 (apache#2443) * Optimize PolicyCatalog.listPolicies (apache#2370) this is a follow-up to apache#2290 the optimization is to use `listEntities` instead of `loadEntities` when there is `policyType` filter to apply * Add PolarisDiagnostics field to BaseMetaStoreManager (apache#2381) * Add PolarisDiagnostics field to BaseMetaStoreManager the ultimate goal is removing the `PolarisCallContext` parameter from every `PolarisMetaStoreManager` interface method, so we make steps towards reducing its usage first. * Add feature flag to disallow custom S3 endpoints (apache#2442) * Add new realm-level flag: `ALLOW_SETTING_S3_ENDPOINTS` (default: true) * Enforce in `PolarisServiceImpl.validateStorageConfig()` Fixes apache#2436 * Deprecate ActiveRolesProvider for removal (apache#2404) * Client: fix openapi verbose output, remove doc generate, and skip test generations (apache#2439) * Fix various issue in client code generation * Use logger instead of print * Add back exclude on __pycache__ as CI is not via Makefile * Add back exclude on __pycache__ as CI is not via Makefile * Add user principal tag in metrics (apache#2445) * Added API change to enable tag * Added test * Added production readiness check * fix(deps): update dependency io.opentelemetry.semconv:opentelemetry-semconv to v1.36.0 (apache#2454) * fix(deps): update dependency com.google.cloud:google-cloud-storage-bom to v2.56.0 (apache#2447) * fix(deps): update dependency gradle.plugin.org.jetbrains.gradle.plugin.idea-ext:gradle-idea-ext to v1.3 (apache#2428) * Build: Make jandex dependency used for index generation managed (apache#2431) Also allows specifying the jandex index version for the build. This is a preparation step contributing to apache#2204, once a jandex fix for reproducible builds is available. Co-authored-by: Alexandre Dutra <adutra@apache.org> * Built: improve reproducible archive files (apache#2432) As part of the effort for apache#2204, this change fixes a few aspects around reproducible builds: Some Gradle projects produce archive files, but don't get the necessary Gradle archive-tasks settings applied: one not-published project but also the tarball&zip of the distribution. This change moves the logic to the new build-plugin `polaris-reproducible`. Another change is to have some Quarkus generated jar files adhere to the same conventions, which are constant timestamps for the zip entries and a deterministic order of the entries. That's sadly not a full fix, as the classes that are generated or instumented by Quarkus differ in each build. Contributes to apache#2204 * Remove commons-lang3 dependency (apache#2456) outside of tests we can replace the functionality with jdk11 and guava. also stop using `org.assertj.core.util` as its a non-public api. * add refresh credentials property to loadTableResult (apache#2341) * add refresh credentials property to loadTableResult * IcebergCatalogAdapterTest: Added test to ensure refresh credentials endpoint is included * delegate refresh credential endpoint configuration to storage integration * GCP: Add refresh credential properties * fix(deps): update dependency io.opentelemetry.semconv:opentelemetry-semconv to v1.37.0 (apache#2458) * Add Delegator to all API Implementations (apache#2434) Per the Dev ML, implements the Delegator pattern to add Events instrumentation to all Polaris APIs. * Prefer java.util.Base64 over commons-codec (apache#2463) `java.util.Base64` is available since java8 and we are already using it in a few other spots. in a follow-up we might be able to get rid of our `commons-codec` dependency completely. * Service: Move tests to the right package (apache#2469) * Update versions in runtime LICENSE and NOTICE (apache#2468) * fix(deps): update dependency com.adobe.testing:s3mock-testcontainers to v4.8.0 (apache#2475) * fix(deps): update dependency com.gradleup.shadow:shadow-gradle-plugin to v9.1.0 (apache#2476) * Service: Remove hadoop-common from polaris-runtime-service (apache#2462) * Service: Always validate allowed locations from Storage Config (apache#2473) * Add Community Sync Meeting 20250828 (apache#2477) * Update dependency software.amazon.awssdk:bom to v2.33.0 (apache#2483) * Remove PolarisCallContext.getDiagServices (apache#2415) * Remove PolarisCallContext.getDiagServices usage * Remove diagnostics from PolarisCallContext * Feature: Expose resetCredentials via a new reset api to allow root user to reset credentials for an existing principal with custom values (apache#2197) * Add type-check to PolarisEntity subclass ctors (apache#2302) currently one can freely "cast" any `PolarisEntity` to a more specific type via their constructors. this can lead to subtle bugs like we fixed in a29f800 by adding type checks we discover a few more places where we need to be more careful about how we construct new or handle existing entities. note that we can add a check for `PolarisEntitySubType` in a followup, but it requires more fixes currently. * Fix CI (apache#2489) Fix undetected merge conflict after apache#2197 + apache#2415 + apache#2434 * Use local diagnostics in TransactionWorkspaceMetaStoreManager * Add resetCredentials to PolarisPrincipalsEventServiceDelegator * Core: Prevent AIOOBE for negative codes in PolarisEntityType, PolarisPrivilege, ReturnStatus (apache#2490) * feat(idgen): Start Implementation of NoSQL with the ID Generation Framework (apache#2131) Create an ID Generation Framework. Related to apache#650 & apache#844 Co-authored-by: Robert Stupp <snazy@snazy.de> Co-authored-by: Dmitri Bourlatchkov <dmitri.bourlatchkov@gmail.com> * perf(refactor): optimizing JdbcBasePersistenceImpl.listEntities (apache#2465) - Reduced Column Selection: Only 6 columns instead of 16 - Eliminated Object Creation Overhead: Direct conversion to EntityNameLookupRecord without intermediate PolarisBaseEntity * Add Polaris Events to Persistence (apache#1844) * AWS CloudWatch Event Sink Implementation (apache#1965) * Fix failing CI (apache#2498) * Update actions/stale digest to 3a9db7e (apache#2499) * Core: Prevent AIOOBE for negative policy codes in PredefinedPolicyType (apache#2486) * Service: Add location tests for views (apache#2496) * Update docker.io/jaegertracing/all-in-one Docker tag to v1.73.0 (apache#2500) * Update dependency io.netty:netty-codec-http2 to v4.2.5.Final (apache#2495) * Update actions/setup-python action to v6 (apache#2502) * Update the Release Guide about the Helm Chart package (apache#2179) * Update the Release Guide about the Helm Chart package * Update release-guide.md Co-authored-by: Pierre Laporte <pierre@pingtimeout.fr> * Add missing commit message * Whitespace * Use Helm GPG plugin to sign the Helm chart * Fix directories during Helm chart copy to SVN * Add Helm index to SVN * Use long name for svn checkout * Ensure the Helm index is updated after the chart is moved to SVN dist release * Do not publish any Docker image before the vote succeeds * Typos * Revert "Do not publish any Docker image before the vote succeeds" This reverts commit 5617e65. * Don't mention Helm values.yaml in the release guide as it doesn't contain version details --------- Co-authored-by: Pierre Laporte <pierre@pingtimeout.fr> * Update dependency com.azure:azure-sdk-bom to v1.2.38 (apache#2503) * Update registry.access.redhat.com/ubi9/openjdk-21-runtime Docker tag to v1.23-6.1756793420 (apache#2504) * Remove commons-codec dependency (apache#2474) follow-up to f8ad77a we can simply use guava instead and eliminate the extra dependency * CLI: Remove SCRIPT_DIR and default config location to user home (apache#2448) * Remove readInternalProperties helpers (apache#2506) the functionality is already provided by the `PrincipalEntity` * Add Events for Generic Table APIs (apache#2481) This PR adds the Events instrumentation for the Generic Tables Service APIs, surrounding the default delegated call to the business logic APIs. * Disable custom namespace locations (apache#2422) When we create a namespace or alter its location, we must confirm that this location is within the parent location. This PR introduces introduces a check similar to the one we have for tables, where custom locations are prohibited by default. This functionality is gated behind a new behavior change flag `ALLOW_NAMESPACE_CUSTOM_LOCATION`. In addition to allowing us to revert to the old behavior, this flag allows some tests relying on arbitrarily-located namespaces to pass (such as those from upstream Iceberg). Fixes: apache#2417 * fix for IcebergAllowedLocationTest (apache#2511) * Remove unused config from SparkSessionBuilder (apache#2512) Tests pass without it. * Add Events for Policy Service APIs (apache#2479) * Remove PolarisTestMetaStoreManager.jsonNode helper (apache#2513) * Update dependency software.amazon.awssdk:bom to v2.33.4 (apache#2517) * Update dependency com.nimbusds:nimbus-jose-jwt to v10.5 (apache#2514) * Update dependency io.opentelemetry:opentelemetry-bom to v1.54.0 (apache#2515) * Update dependency io.micrometer:micrometer-bom to v1.15.4 (apache#2519) * Port missed OSS change * NoSQL: adopt to updated test packages * NoSQL: adapt to removed PolarisDiagnostics param * NoSQL: fix libs.versions.toml * NoSQL: include jandex plugin related changes from OSS * NoSQL: changes for delete/set principal client-ID+secret * Last merged commit c6176dc --------- Co-authored-by: Pooja Nilangekar <poojan@umd.edu> Co-authored-by: Eric Maynard <eric.maynard+oss@snowflake.com> Co-authored-by: Mend Renovate <bot@renovateapp.com> Co-authored-by: Yong Zheng <yongzheng0809@gmail.com> Co-authored-by: Christopher Lambert <xn137@gmx.de> Co-authored-by: Honah (Jonas) J. <honahx@apache.org> Co-authored-by: Dmitri Bourlatchkov <dmitri.bourlatchkov@gmail.com> Co-authored-by: Alexandre Dutra <adutra@apache.org> Co-authored-by: fivetran-kostaszoumpatianos <kostas.zoumpatianos@fivetran.com> Co-authored-by: Jason <jasonf20@gmail.com> Co-authored-by: Adnan Hemani <adnan.h@berkeley.edu> Co-authored-by: Yufei Gu <yufei@apache.org> Co-authored-by: JB Onofré <jbonofre@apache.org> Co-authored-by: fivetran-arunsuri <103934371+fivetran-arunsuri@users.noreply.github.com> Co-authored-by: Adam Christian <105929021+adam-christian-software@users.noreply.github.com> Co-authored-by: Artur Rakhmatulin <artur.rakhmatulin@gmail.com> Co-authored-by: Pierre Laporte <pierre@pingtimeout.fr>
DraftPR of the discussion on the Dev ML regarding using the Delegator pattern to add Events instrumentation to all Polaris APIs.