Hi A PR with delegator classes makes sense to me, and it's a good PR to start with.
Thanks ! Regards JB On Fri, Aug 22, 2025 at 4:39 AM Adnan Hemani <adnan.hem...@snowflake.com.invalid> wrote: > > Hi all, > > Thanks for your responses, JB and Russell. I agree with the points made by > Russell: > * There are no major API changes/additions introduced that would require a > new interface-only PR. > * Taking Russell’s suggestions do not change anything that was mentioned in > the first email in this thread. > > As part of the delegator pattern refactor I have committed to do on PR#1904, > I will firstly introduce a (new) PR to make (no-op) delegator classes for all > the major Service APIs that are in Polaris based on this feedback from > Russell. Then, I can re-introduce PR#1904 with the new Events Delegator. > > Best, > Adnan Hemani > > > On Aug 21, 2025, at 8:47 AM, Russell Spitzer <russell.spit...@gmail.com> > > wrote: > > > > I think the problem here is that we already have merged some apis, see > > PolarisEventListener > > <https://www.google.com/url?q=https://github.com/apache/polaris/blob/main/runtime/service/src/main/java/org/apache/polaris/service/events/PolarisEventListener.java&source=gmail-imap&ust=1756396128000000&usg=AOvVaw2hdz6gzSGLsSorYUn3gOdy>. > > The Pr's above extend that pattern and add more. If I understand Robert's > > request, he would like to remove the previously merged APIs and would like > > the whole interface to go back to the drawing board to switch to a Stateful > > Event handling system. So I'm not sure an "API Only" PR would help in this > > case since the objection is not just to these changes, but to previously > > merged ones. > > > > Currently we have a callback style pattern, and I wouldn't consider adding > > more callbacks as normally requiring any sort of discussion (each api is > > just "onBefore", "onAfter" although I guess we could argue about their > > object contents but I don't think they are that broad). Adding > > additional callbacks for errors/exceptions also wouldn't be a huge deal and > > could always be done later as well. > > > > The change to stateful event APIs I believe is to allow for a plugin which > > allows injection of external state into the event processing as it takes > > place. I'm assuming that if you perhaps had an implementation specific > > identifier you wanted for an event which was required for performance, you > > would need this sort of API. If you just needed to track an event, > > RequestID is available but I'm guessing there is a system here which > > wouldn't be able to easily correlate items based on a system provided > > identifier? If there are other use cases I'd like to know about them since > > I'm also wary of putting too much event processing logic into Polaris > > itself so I'm skeptical about the cost/benefit of allowing this. > > > > I am confident that even if we did decide as a community to go ahead with a > > Stateful event listener API, we wouldn't have to drop the existing apis > > since it would be trivial to automatically wrap a callback event listener > > with a stateful one. So I probably would also not block the existing PR's > > unless we were, as I noted above, going to rip out all the event apis. > > > > I think if we did want to switch to a Stateful event handling that it's > > probably on those requesting a different API layout to propose that and > > write up the design document on how that pattern would be helpful to users > > of Polaris and what the pros and cons would be especially in context of > > what we already have in the project. > > > > I do think one pretty good path forward though would be to first develop > > the interfaces and patterns required to fully delegate to PolarisCoreImpl > > as Robert requested. If we do that, then any implementer could just load > > their own wrapping class which could use whatever eventing pattern they > > like even if it doesn't match Polaris official apis > > (StatefulEventDelegatingPolarisCore or CallbackEventDelegatingPolarisCore - > > These could always be built on the vendor side as well). There are of > > course some cons to this approach as well by adding yet another level of > > inter-direction but if we add that layer, and only some users want call > > backs and not allow stateful event handling, they could do that without a > > lot of fuss just by making their own delegating class. > > > > On Thu, Aug 21, 2025 at 1:04 AM Jean-Baptiste Onofré <j...@nanthrax.net> > > wrote: > > > >> Hi Adnan > >> > >> Thanks for the message with the list of PRs and details. > >> > >> May I propose to create another PR focusing on API updates ? I quickly > >> took a look on the PRs and my understanding is that these PRs update > >> the API. > >> I propose we start with a simple PR focusing on API change (easily to > >> review and discuss). The purpose is to give "visibility" to the > >> community and speed up on the implementation side as soon as we have > >> consensus on API. > >> > >> Thoughts ? > >> > >> Thanks ! > >> Regards > >> JB > >> > >> On Tue, Aug 19, 2025 at 9:08 AM Adnan Hemani > >> <adnan.hem...@snowflake.com.invalid> wrote: > >>> > >>> Hi all, > >>> > >>> Thanks to those who could make the Polaris Community Sync regarding the > >> Events API on 2025-08-18. Below are the notes (and my further thoughts > >> regarding the discussion topics) from the meeting. As discussed (without > >> any expressed disagreement), there will be a one-week window (ending on > >> 2025-08-25) to express any blocking concerns with any of the approaches or > >> proposals, and a further one week window to then suggest any approaches to > >> resolve these concerns (ending on 2025-09-01). Not responding within these > >> time windows will be considered “reached consensus.” Please ensure any > >> responses clearly indicate which proposal/PR the comments or feedback are > >> for - or feel free to comment/review on the PRs directly! > >>> > >>> Thanks to the whole community for helping to move the Events feature > >> forward! > >>> > >>> Proposal #1 - PR #1904 > >>> <https://www.google.com/url?q=https://github.com/apache/polaris/pull/1904&source=gmail-imap&ust=1756396128000000&usg=AOvVaw2k-D9sN19JSXK7nkfvfDQT>: > >> Additional Instrumentation for New Events > >>> > >>> As discussed at the sync, there are no notable changes to the Events and > >> Event Listener interfaces within this PR - this proposal solely adds new > >> instrumentation for events using the existing interfaces and emulates > >> current implementations of said interfaces. > >>> > >>> Regarding concerns of adding too many files within this PR: I have > >> committed to refactoring all Event records into a shared Java class. I will > >> push this change with the next revision. > >>> Regarding concerns of adding too much code within the business logic: I > >> can commit to refactoring `PolarisServiceImpl.java` to create a delegator > >> pattern where each method would emit events in a separate Java class and > >> delegate back to `PolarisServiceImpl.java`. This could look something like > >> Appendix 1. This pattern should satisfy the ability for someone (in a > >> future PR) to implement `onError…` methods, in case we would like to do > >> error handling using the Events API. To be clear, error handling was not a > >> stated use-case of the Events API - but looks to be a straightforward > >> extension. > >>> Regarding concerns of the “lack of functionality” to correlate > >> before/after events together: > >>> As stated at the sync, this is a false statement. There is a way to do > >> this already - but it is up to the Event Listener implementation to make > >> this happen. > >>> All to-date-publicized alternatives would also need to handle the logic > >> of correlating before/after events within the Event Listener > >> implementation, and so I cannot consider them as “strictly better”. The > >> alternatives would also change the easy-to-implement interfaces to more > >> complex ones, which is a significant drawback to this feature. Any > >> interface that requires user implementation should always be as simple as > >> possible. > >>> There is not any concrete/known use case for this requirement, nor was > >> it considered an original goal of the Events API. Given all the above, it > >> is currently hard for me to understand this as a blocker for merging > >> further event instrumentation with the current set of interfaces. > >>> On a related note, any major changes to the Event interfaces would > >> already need to be considered as “breaking changes,” as it is already > >> released and public within our Polaris 1.0.0 release. > >>> There is also a potential solution to pass in the “before” event ID with > >> a small backwards-compatible change to the Events Listener interface > >> (Appendix 2). I’m happy to field questions on this proposed change in an > >> unrelated thread to PR #1904, either on Slack or in a different mail > >> thread. > >>> > >>> Many thanks to Russell Spitzer for helping to identify some of the > >> solutions listed above! > >>> > >>> — > >>> > >>> Proposal #2 - PR #1844 > >>> <https://www.google.com/url?q=https://github.com/apache/polaris/pull/1844&source=gmail-imap&ust=1756396128000000&usg=AOvVaw0xoAGoP_bKPkfBdKjWCqgh> > >> Add Polaris Events to Persistence > >>> > >>> This was not thoroughly discussed during the Community Sync due to lack > >> of time, but was touched upon briefly whenever it was relevant as a new > >> sample implementation of the Events Listener interface. > >>> > >>> There are currently no unaddressed concerns or comments on this PR. I am > >> surfacing this as a way for a “last call” for feedback before this gets > >> merged. > >>> > >>> — > >>> > >>> Proposal #3 - PR #1965 > >>> <https://www.google.com/url?q=https://github.com/apache/polaris/pull/1965&source=gmail-imap&ust=1756396128000000&usg=AOvVaw1t2kJ7pb74RoBigmBamPhe> > >> Add Event Listener Implementation using AWS CloudWatch as a event sink > >>> > >>> This was not mentioned during the community sync due to lack of time as > >> well. The goal is hopefully to repeat the patterns in this PR for other > >> cloud service provider logging products. > >>> > >>> There are a few minor comments remaining on this PR, which I will > >> address in the upcoming days. There are plans to merge this PR following > >> that resolution. This is an also being surfaced for a “last call” for > >> feedback. > >>> > >>> Regards, > >>> Adnan Hemani > >>> > >>> — > >>> > >>> Appendix 1: > >>> > >>> EventingPolarisServiceImpl.java: > >>> ``` > >>> public class EventingPolarisServiceImpl implements > >> PolarisCatalogsApiSerivce, PolarisPrincipalsApiService, > >> PolarisPrincipalsRolesApiService { > >>> private final PolarisServiceImpl delegate; > >>> private final PolarisEventListener listener; > >>> > >>> public … createCatalog(…) { > >>> listener.onBeforeCreateCatalog(…); > >>> try { > >>> delegate.createCatalog(…); > >>> listener.onAfterCreateCatalog(…); > >>> } catch (Exception e) { > >>> listener.onExceptionCreateCatalog(…); > >>> } > >>> } > >>> } > >>> ``` > >>> > >>> Appendix 2: > >>> > >>> EventingPolarisServiceImpl.java: > >>> ``` > >>> public class EventingPolarisServiceImpl implements > >> PolarisCatalogsApiSerivce, PolarisPrincipalsApiService, > >> PolarisPrincipalsRolesApiService { > >>> private final PolarisServiceImpl delegate; > >>> private final PolarisEventListener listener; > >>> > >>> public … createCatalog(…) { > >>> String eventId = listener.onBeforeCreateCatalog(…); > >>> try { > >>> delegate.createCatalog(…); > >>> listener.onAfterCreateCatalog(<event>, eventId); > >>> } catch (Exception e) { > >>> listener.onExceptionCreateCatalog(<event>, > >> eventId); > >>> } > >>> } > >>> ``` > >>> > >>> PolarisEventListener.java: > >>> ``` > >>> … > >>> // The Event Listener implementation would then be in charge of > >> generating the eventId and returning it… > >>> public String onBeforeCreateCatalog(…) {} > >>> > >>> // …as well as using it further (if it would like). > >>> public void onAfterCreateCatalog(<event>, String eventId) {} > >>> > >>> // We can achieve backwards compatibility through sending in `null` as > >> the event ID. > >>> // Event Listener implementations would need to handle this case. > >>> // Additionally, we can mark this as Deprecated, if it makes for easier > >> maintenance > >>> public void onAfterCreateCatalog(<event>) { > >>> onAfterCreateCatalog(<events>, null); > >>> } > >>> > >>> // No need to handle backwards-compatibility here as this is not yet > >> created and is still a proposal. > >>> public void onExceptionCreateCatalog(<event>, String eventId) {} > >>> … > >>> ``` > >> >