Enable multiple event listeners to consume for Polaris events#3973
Enable multiple event listeners to consume for Polaris events#3973flyrain merged 15 commits intoapache:mainfrom
Conversation
|
@jbonofre @adutra @adnanhemani would you mind share your thoughts about this approach? |
d0242ed to
09c5600
Compare
09c5600 to
aad3caf
Compare
adutra
left a comment
There was a problem hiding this comment.
@nandorKollar this is look promising thanks!
I think we should avoid calling dispatch() altogether (and avoid materializing the PolarisEvent instance on the heap) if we know the event type is not needed. I would like us to consider that, if a user deactivates all listeners, they would get a performance comparable to what they would get if there were no events in Polaris at all.
8b05fcf to
1c71676
Compare
| public void onStartup(@Observes StartupEvent event) { | ||
| String listerTypes = configuration.types().orElse(""); | ||
| if (listerTypes.isBlank()) { | ||
| return; |
There was a problem hiding this comment.
If we don't have types here, it means we never reach type() merging bellow (line 51).
If a user only set polaris.event-listener.type (the old config) without setting types, the onStartup() method just returns directly, and no listener is registered.
It means it's a breaking change.
Imho, the type() merge logic should be before the early return, or this check should check both types and type (to be backward compatible).
There was a problem hiding this comment.
Good point, thanks! This is indeed broken, fixed in 1a0aaa5
| * Comma separated list of event listers, each item must be a registered {@link | ||
| * PolarisEventListener} identifier. | ||
| */ | ||
| Optional<String> types(); |
There was a problem hiding this comment.
| Optional<String> types(); | |
| Optional<List<String>> types(); |
It's a bit odd to see an Optional<List<...> – but that's how SmallRye Config wants it 😅
There was a problem hiding this comment.
Update: Optional<Set<String>> types(); is probably better.
48b5fbd to
c9f843b
Compare
…tomatically by smallrye
ee21f22 to
716f6db
Compare
Thanks, this makes sense, however I've further questions related to this. Do you happen to know why does AwsCloudWatchEventListener filter only for a single event type? I think event listeners should accept any event type, and allow users to configure a particular event listener to listen for only a certain events, but the listener code itself should not assume that it is working only with event type xyz. |
Completely agree here. Listeners should NOT filter events, and especially not in a hard-coded fashion – that's a user decision. @adnanhemani may know why the CoudWatch listener was designed that way. Imho it's not very useful – it can only be useful if you are interested in after-refresh-table events, and hence, in certain table optimization use cases. |
dimas-b
left a comment
There was a problem hiding this comment.
Sorry about last minute comments. The PR LGTM overall. My only suggestion is to try and add automatic redirects for the old config name.
16170de to
b570a2e
Compare
…er_service_bus # Conflicts: # runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java
|
|
||
| - The configuration option `polaris.rate-limiter.token-bucket.window` is no longer supported and should be removed. | ||
| - `PolarisConfigurationStore` has been deprecated for removal. | ||
| - The configuration option `polaris.event-listener.type` is no longer supported and should be removed. Please use `polaris.event-listener.types` instead. |
There was a problem hiding this comment.
It mighty be OK to make this breaking change, given event listener are not widely used ATM. Could we share it in the mailing list to gather more feedback to double check? cc @adnanhemani .
If it turns out to be fine, we should call it out here that it's a breaking change.
There was a problem hiding this comment.
NVM. It seems to be deprecated. I think the word here isn't accurate.
| - The configuration option `polaris.event-listener.type` is no longer supported and should be removed. Please use `polaris.event-listener.types` instead. | |
| - The configuration option `polaris.event-listener.type` is deprecated and will be removed later. Please use `polaris.event-listener.types` instead. |
flyrain
left a comment
There was a problem hiding this comment.
Thanks @nandorKollar for working on it. Can we add test to configure polaris.event-listener.types with 2+ listeners (e.g., 'test,in-memory-buffer') and verify all receive events? Can we add test to verify deprecated polaris.event-listener.type still works?
|
nit: I updated the PR title (typo on lister instead of listener 😄 ). |
dimas-b
left a comment
There was a problem hiding this comment.
LGTM, pending resolution of open comment threads 👍 Thanks, @nandorKollar !
|
I will look into this later today, please hold merging until then. |
adnanhemani
left a comment
There was a problem hiding this comment.
Looks almost there, just a few questions on my end - and then one comment from @flyrain about adding a Javadoc. Will approve it after those are done!
|
|
||
| @ApplicationScoped | ||
| public class EventBusConfigurer { | ||
| private static final String LOCAL_CODEC_NAME = "local"; |
There was a problem hiding this comment.
I'm not an expert but after searching around, it seems like this value is supposed to be unique per codec. So shouldn't we name this something like "polaris-events-local" or something to ensure there is no potential future clash naming-wise?
@adnanhemani which Javadoc do you refer to? I already added Javadoc to |
adnanhemani
left a comment
There was a problem hiding this comment.
Thank you for this @nandorKollar!
|
Thank you all for the help and reviews! |
This PR enables multiple event listeners watching for Polaris events.
Checklist
CHANGELOG.md(if needed)site/content/in-dev/unreleased(if needed)