+1 Hang Chen <[email protected]> 于2026年10月29日周四 12:45写道:
> Hi Pulsar community, > > I'd like to start a discussion on PIP-500: Get all topic-level > policies with a single admin call. > > PIP PR: https://github.com/apache/pulsar/pull/27174 > > Problem > ------- > Today there is no way to read all the policies set on a topic in one > call. The admin > interface has 28 distinct topic-policy getters, so reading a topic's > full configuration takes > about 28 REST requests, and the results are not a consistent snapshot. > At namespace level > this already exists ("pulsar-admin namespaces policies"), and for > topics there is already > "topicPolicies delete", which removes all policies of a topic, but > nothing that reads them. > This makes debugging, auditing, cloning a topic's configuration and > external metadata > catalogs/scrapers harder than necessary. > > Proposal > -------- > * REST: GET > /admin/v2/persistent/{tenant}/{namespace}/{topic}/policies?isGlobal=... > This pairs with the existing DELETE on the same path. It returns the > policies explicitly > set on the topic for the local or the global scope (an empty object > if none are set). > * Admin API: TopicPolicies#getTopicPolicies(topic) and > getTopicPoliciesAsync(topic). > * CLI: pulsar-admin topicPolicies get <topic> [-g], pairing with the > existing "delete". > * Authorization: READ on PolicyName.ALL, the same as "namespaces > policies". It has the same > validation as the existing per-policy getters (405 if topic-level > policies are disabled, > 412 for a partition name, 404 for a missing topic, redirect to the > owning broker). > * No metrics, configuration or binary protocol changes. The change is > additive. An older > broker returns 405 for the new call. > > Two points I'd especially like feedback on > ------------------------------------------ > 1. --applied is left out of the first version. "Applied" is > implemented separately in each > REST handler (for example retention falls back topic -> namespace > -> broker default), 6 of > the 28 getters have no applied variant at all, and > HierarchyTopicPolicies only covers part > of the policies and only inside a loaded topic. An applied view > also needs a response > model that says where each value came from, because TopicPolicies > uses null to mean "not > set on the topic". The effective value stays available per policy with > "get-xxx --applied". The PIP lists the alternatives and the cost of > each. > 2. The Java admin API returns an untyped Map<String, Object>. The > broker's TopicPolicies > class lives in pulsar-common, which pulsar-client-admin-api cannot > depend on (it also > uses the CommandSubscribe.SubType protocol enum), so the admin API > cannot return it > directly. A map keeps the API small and returns new policies > without an API change. A > typed accessor could be added later under a different name. The PIP > discusses the > alternatives (an interface in the admin API implemented by > TopicPolicies, or returning a > JSON string). > > An implementation is ready for review in a separate PR: > https://github.com/apache/pulsar/pull/27175 > > Please share your thoughts, concerns and suggestions. > > Best, > Hang >
