Hi Jun,
Thanks for the reply.
JR26: I’ve addressed this change in the KIP.
JR27:
I’ve documented the following configurations in the KIP:
ConsumerConfig
partition.assignment.strategy
StreamsConfig
bootstrap.servers
MirrorCheckpointConfig
groups
groups.exclude
task.assigned.groups
MirrorSourceConfig
topics
topics.exclude
config.properties.exclude
WorkerConfig
plugin.path
RestServerConfig
rest.extension.classes
Other configurations already have default values and corresponding validators:
LogConfig
leader.replication.throttled.replicas: List.of() →
ThrottledReplicaListValidator
follower.replication.throttled.replicas: List.of() →
ThrottledReplicaListValidator
StreamsConfig
rack.aware.assignment.tags: List.of() → atMostOfSize
ConnectorConfig
transforms: List.of() → aliasValidator
predicates: List.of() → aliasValidator
SourceConnectorConfig
topic.creation.groups: List.of() → ConfigDef.CompositeValidator
DistributedConfig
inter.worker.verification.algorithms: defaultVerificationAlgorithms(crypto) →
ConfigDef.LambdaValidator
RestServerConfig
admin.listeners: null → AdminListenersValidator
listeners: List.of("http://:8083") → ListenersValidator
Best Regards,
Jiunn-Yang
> Jun Rao <[email protected]> 於 2025年7月16日 清晨7:14 寫道:
>
> Hi, Jiunn-Yang,
>
> Thanks for the reply.
>
> JR 26. early.start.listeners and interceptor.classes: It seems that both
> could be empty?
>
> JR27. The following configs of type LIST are missing.
>
> ConsumerConfig
> partition.assignment.strategy
>
> BrokerSecurityConfigs
>
> QuorumConfig
>
> LogConfig
> leader.replication.throttled.replicas
> follower.replication.throttled.replicas
>
> StreamsConfig
> rack.aware.assignment.tags
> bootstrap.servers
>
> MirrorCheckpointConfig
> groups
> groups.exclude
>
> MirrorCheckpointConfig
> task.assigned.groups
>
> MirrorSourceConfig
> topics
> topics.exclude
> config.properties.exclude
>
> ConnectorConfig
> transforms
> predicates
>
> SourceConnectorConfig
> topic.creation.groups
>
> WorkerConfig
> plugin.path
>
> DistributedConfig
> inter.worker.verification.algorithms
>
> RestServerConfig
> rest.extension.classes
> admin.listeners
> listeners
>
> Thanks,
>
> Jun
>
> On Tue, Jul 15, 2025 at 6:22 AM 黃竣陽 <[email protected]> wrote:
>
>> Hello Jun Chia,
>>
>> Thanks for the reply,
>>
>> JR20: This configuration should remain unchanged. I have updated the KIP.
>>
>> JR21: For both Consumer and Producer, the default value is an empty list,
>> and the
>> validator used is NonNullValidator. I think we can change the validator to
>> ValidList.anyNonDuplicateValues
>> with isNullAllowed = false and isEmptyAllowed = false.
>>
>> JR23: I’ve addressed this change in the KIP. Although the default value of
>> early.start.listeners remains
>> unchanged, the validator now disallows empty lists.
>>
>> JR24: Since log.dirs does not change its default value, I used a dash (-)
>> to indicate that the field remains unchanged.
>>
>> JR25: I’ve updated the table and aligned similar validators as much as
>> possible for consistency.
>>
>> Best Regards,
>> Jiunn-Yang
>>
>>> Chia-Ping Tsai <[email protected]> 於 2025年7月15日 下午2:12 寫道:
>>>
>>>> JR20. controller.listener.names : It's required on the broker. Is it
>>> required on the controller?
>>>
>>> there is a small "sugar" in the controller, which we will
>>> create listener.security.protocol.map based on controller.listener.names
>>> if listener.security.protocol.map is not explicitly set [0]
>>> Additionally, `controller.listener.names` is also used to filter out the
>>> advertised controller listeners [1]
>>>
>>>
>>>> JR22. group.coordinator.rebalance.protocols: Currently, it can be set to
>>> null, right?
>>>
>>> I don't think so. There is no null check after calling
>>>
>> `getList(GroupCoordinatorConfig.GROUP_COORDINATOR_REBALANCE_PROTOCOLS_CONFIG)`[2],
>>> which causes an NPE if getList returns null."
>>>
>>> [0]
>>>
>> https://github.com/apache/kafka/blob/trunk/server/src/main/java/org/apache/kafka/server/config/AbstractKafkaConfig.java#L133
>>> [1]
>>>
>> https://github.com/apache/kafka/blob/7ea32a0e938c22119f11908aa419aaf0ffd9b6d8/core/src/main/scala/kafka/server/KafkaConfig.scala#L459
>>> [2]
>>>
>> https://github.com/apache/kafka/blob/7ea32a0e938c22119f11908aa419aaf0ffd9b6d8/core/src/main/scala/kafka/server/KafkaConfig.scala#L373
>>>
>>> Jun Rao <[email protected]> 於 2025年7月15日 週二 上午6:20寫道:
>>>
>>>> Hi, Jiunn-Yang,
>>>>
>>>> Thanks for the updated KIP.
>>>>
>>>> JR20. controller.listener.names : It's required on the broker. Is it
>>>> required on the controller?
>>>>
>>>> JR21. bootstrap.servers: Some of them (e.g. in producer/consumer)
>> already
>>>> require it to be non-null.
>>>>
>>>> JR22. group.coordinator.rebalance.protocols: Currently, it can be set to
>>>> null, right?
>>>>
>>>> JR23. early.start.listeners: It allows default value of null, which
>> means
>>>> that all listeners included in controller.listener.names will also be
>> early
>>>> start listeners.
>>>>
>>>> JR24. log.dirs: It currently has a default value of null.
>>>>
>>>> JR25. It seems there are quite a few more configs of type list. Do they
>>>> need to be changed too?
>>>>
>>>> AdminClientConfig: 4
>>>> ConsumerConfig: 5
>>>> ProducerConfig: 4
>>>> SaslConfigs: 1
>>>> SslConfigs: 2
>>>> BrokerSecurityConfigs: 5
>>>> MirrorClientConfig: 1
>>>> org.apache.kafka.connect.mirror : 16
>>>> org.apache.kafka.connect.runtime : 21
>>>> GroupCoordinatorConfig: 3
>>>> QuorumConfig: 2
>>>> ServerConfigs: 1
>>>> KRaftConfigs: 1
>>>> ClientMetricsConfigs: 2
>>>> MetricConfigs: 2
>>>> LogConfig: 4
>>>> StreamsConfig: 4
>>>>
>>>> Jun
>>>>
>>>> On Fri, Jul 11, 2025 at 8:13 PM 黃竣陽 <[email protected]> wrote:
>>>>
>>>>> Hi Chia, Jun
>>>>>
>>>>> Thanks for the reply,
>>>>> I have updated the table in the KIP.
>>>>>
>>>>> Best Regards,
>>>>> Jiunn-Yang
>>>>>
>>>>>> Chia-Ping Tsai <[email protected]> 於 2025年7月11日 清晨7:38 寫道:
>>>>>>
>>>>>> Hi, Jun
>>>>>>
>>>>>> Thanks for the reply.
>>>>>>
>>>>>> I think the following configs could use null as the default value and
>>>>> treat
>>>>>> an "empty list" as an illegal value.
>>>>>>
>>>>>> `sasl.oauthbearer.expected.audience`, `ssl.cipher.suites`,
>>>>>> `ssl.enabled.protocols`,
>>>>>> and `log.dirs`
>>>>>>
>>>>>> Jun Rao <[email protected]> 於 2025年7月11日 週五 上午6:59寫道:
>>>>>>
>>>>>>> Hi, Chia-Ping, Jiunn-Yang,
>>>>>>>
>>>>>>> Thanks for the reply.
>>>>>>>
>>>>>>> As you said, if ssl.cipher.suites is empty, intuitively this means
>>>> that
>>>>> no
>>>>>>> cipher is allowed. So, this should be an illegal config. It just
>>>> happens
>>>>>>> that our implementation treats it as if the config is not set
>> (meaning
>>>>> the
>>>>>>> value is null). So, it seems that a more intuitive convention is: if
>>>> the
>>>>>>> config is not set, it defaults to all available cipher suites. If
>> it's
>>>>>>> explicitly set, it can't be empty.
>>>>>>>
>>>>>>> Jun
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Wed, Jul 9, 2025 at 8:27 AM 黃竣陽 <[email protected]> wrote:
>>>>>>>
>>>>>>>> Hi Jun, Chia
>>>>>>>>
>>>>>>>>>> Also, it would be useful to add a compatibility column in the
>>>> table.
>>>>>>> If
>>>>>>>> a
>>>>>>>>>> value is formally disallowed, it would be useful to compare the
>> old
>>>>>>> and
>>>>>>>> the
>>>>>>>>>> new behavior (e.g. a different exception is thrown, etc).
>>>>>>>> I’ve updated the table to show which exceptions will be thrown for
>>>> each
>>>>>>>> behavior.
>>>>>>>>
>>>>>>>>>>> I don't understand the point of "5.0". Could you please share
>> more
>>>>>>>> details?
>>>>>>>>>>> It seems to me changing the type or default value should be fine
>>>> in
>>>>>>>> minor
>>>>>>>>>>> release if we don't break the existing property files.
>>>>>>>> I don't think this requires any compatibility considerations, so
>> I’ve
>>>>>>>> removed the Kafka 5.0 changes section.
>>>>>>>>
>>>>>>>>>>> `max.connections.per.ip.overrides` is parsed as "map" type, so
>>>> using
>>>>>>>> `LIST`
>>>>>>>>>>> instead of `String` does not seems to make sense.
>>>>>>>> I have removed the config from KIP
>>>>>>>>
>>>>>>>> Best Regards,
>>>>>>>> Jiunn-Yang
>>>>>>>>
>>>>>>>>> Chia-Ping Tsai <[email protected]> 於 2025年7月9日 晚上10:26 寫道:
>>>>>>>>>
>>>>>>>>>> For ssl.cipher.suites, changing the default value from null to
>>>> empty
>>>>>>> is
>>>>>>>>>> actually a breaking change. According to the doc, null means that
>>>> all
>>>>>>>> the
>>>>>>>>>> available cipher suites are supported. I am thinking that we
>> should
>>>>>>>>>> continue to allow null as the default since it could represent a
>>>>> state
>>>>>>>>>> different from empty.
>>>>>>>>>
>>>>>>>>> "Empty list" seems to be a weird case. It appears to signify that
>> no
>>>>>>>> cipher suites are accepted. However, in the codebase, an empty list
>>>> is
>>>>>>>> handled as if all available cipher suites are supported [0]. We
>>>> should
>>>>>>> not
>>>>>>>> support the case of "no supported cipher suite," as it doesn't make
>>>>>>> sense.
>>>>>>>>>
>>>>>>>>> In short, changing the default value from null to empty does not
>>>> break
>>>>>>>> the behavior.
>>>>>>>>>
>>>>>>>>> [0]
>>>>>>>>
>>>>>>>
>>>>>
>>>>
>> https://github.com/apache/kafka/blob/dabde76ebf105aaa945db60b7753331c83a8c989/clients/src/main/java/org/apache/kafka/common/security/ssl/DefaultSslEngineFactory.java#L139
>>>>>>>>>
>>>>>>>>> On 2025/07/08 17:01:07 Jun Rao wrote:
>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>
>>>>>>>>>> I agree with Chia-Ping. If we allow cleanup.policy to be empty, we
>>>>>>> will
>>>>>>>>>> just continue to allow it in all future releases.
>>>>>>>>>>
>>>>>>>>>> For ssl.cipher.suites, changing the default value from null to
>>>> empty
>>>>>>> is
>>>>>>>>>> actually a breaking change. According to the doc, null means that
>>>> all
>>>>>>>> the
>>>>>>>>>> available cipher suites are supported. I am thinking that we
>> should
>>>>>>>>>> continue to allow null as the default since it could represent a
>>>>> state
>>>>>>>>>> different from empty.
>>>>>>>>>>
>>>>>>>>>> Also, it would be useful to add a compatibility column in the
>>>> table.
>>>>>>> If
>>>>>>>> a
>>>>>>>>>> value is formally disallowed, it would be useful to compare the
>> old
>>>>>>> and
>>>>>>>> the
>>>>>>>>>> new behavior (e.g. a different exception is thrown, etc).
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>>
>>>>>>>>>> Jun
>>>>>>>>>>
>>>>>>>>>> On Tue, Jul 8, 2025 at 8:36 AM Chia-Ping Tsai <[email protected]
>>>
>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> hi Jiunn
>>>>>>>>>>>
>>>>>>>>>>> Thanks for the explanation. I have updated the KIP accordingly:
>> in
>>>>>>>> Kafka
>>>>>>>>>>>> 4.x, cleanup.policy
>>>>>>>>>>>> can be set to an empty list with a warning message emitted;
>>>>> however,
>>>>>>>> in
>>>>>>>>>>>> Kafka 5.0, setting an
>>>>>>>>>>>> empty list for cleanup.policy will no longer be allowed.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> If we agree to support "empty list", the approach of "none" could
>>>> be
>>>>>>>>>>> eliminated, right?
>>>>>>>>>>>
>>>>>>>>>>> I don't understand the point of "5.0". Could you please share
>> more
>>>>>>>> details?
>>>>>>>>>>> It seems to me changing the type or default value should be fine
>>>> in
>>>>>>>> minor
>>>>>>>>>>> release if we don't break the existing property files.
>>>>>>>>>>>
>>>>>>>>>>> `max.connections.per.ip.overrides` is parsed as "map" type, so
>>>> using
>>>>>>>> `LIST`
>>>>>>>>>>> instead of `String` does not seems to make sense.
>>>>>>>>>>>
>>>>>>>>>>> Best,
>>>>>>>>>>> Chia-Ping
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> 黃竣陽 <[email protected]> 於 2025年7月8日 週二 下午11:25寫道:
>>>>>>>>>>>
>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>
>>>>>>>>>>>>>> Null could make sense as the default value, but it just means
>>>>> that
>>>>>>>> the
>>>>>>>>>>>>>> config key is not set explicitly.
>>>>>>>>>>>>>> Given that, it's probably simpler to just allow
>>>>>>>>>>>>>> log.cleanup.policy to be empty and properly support it?
>>>>>>>>>>>> Thanks for the explanation. I have updated the KIP accordingly:
>>>> in
>>>>>>>> Kafka
>>>>>>>>>>>> 4.x, cleanup.policy
>>>>>>>>>>>> can be set to an empty list with a warning message emitted;
>>>>> however,
>>>>>>>> in
>>>>>>>>>>>> Kafka 5.0, setting an
>>>>>>>>>>>> empty list for cleanup.policy will no longer be allowed.
>>>>>>>>>>>>
>>>>>>>>>>>>> For another, there is an additional issue which could be
>> handled
>>>>> by
>>>>>>>>>>> this
>>>>>>>>>>>>> KIP. Some configs have "string" type, but they are handled as a
>>>>>>> LIST.
>>>>>>>>>>> For
>>>>>>>>>>>>> example, `early.start.listeners`, `security.providers`. Could
>> we
>>>>>>>> change
>>>>>>>>>>>>> their type to LIST to benefit from this KIP? I mean to make
>> them
>>>>>>>>>>>>> non-nullable.
>>>>>>>>>>>> I have also updated the KIP to include the tables detailing the
>>>>>>>> changes
>>>>>>>>>>>> for LIST-type configuration
>>>>>>>>>>>> default values and the migration from STRING-type to LIST-type
>>>>>>>>>>>> configurations.
>>>>>>>>>>>>
>>>>>>>>>>>> Best Regards,
>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>
>>>>>>>>>>>>> Chia-Ping Tsai <[email protected]> 於 2025年7月8日 清晨7:06 寫道:
>>>>>>>>>>>>>
>>>>>>>>>>>>> hi all,
>>>>>>>>>>>>>
>>>>>>>>>>>>> JR11. There is an existing config interceptor.classes that
>>>> allows
>>>>>>> an
>>>>>>>>>>>> empty
>>>>>>>>>>>>>> list and it makes intuitive sense. So, it seems that it's ok
>> to
>>>>>>>>>>> support
>>>>>>>>>>>>>> empty lists in general. Given that, it's probably simpler to
>>>> just
>>>>>>>>>>> allow
>>>>>>>>>>>>>> log.cleanup.policy to be empty and properly support it?
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> yes, that is what I meant before. Additionally, the `LIST` type
>>>>>>>> should
>>>>>>>>>>>> not
>>>>>>>>>>>>> accept "null". Instead, we should use an empty list as the
>>>> default
>>>>>>>>>>> value.
>>>>>>>>>>>>> For example, `sasl.oauthbearer.expected.audience` should never
>>>> has
>>>>>>>>>>> "null"
>>>>>>>>>>>>> value. That could eliminate the null check.
>>>>>>>>>>>>>
>>>>>>>>>>>>> For another, there is an additional issue which could be
>> handled
>>>>> by
>>>>>>>>>>> this
>>>>>>>>>>>>> KIP. Some configs have "string" type, but they are handled as a
>>>>>>> LIST.
>>>>>>>>>>> For
>>>>>>>>>>>>> example, `early.start.listeners`, `security.providers`. Could
>> we
>>>>>>>> change
>>>>>>>>>>>>> their type to LIST to benefit from this KIP? I mean to make
>> them
>>>>>>>>>>>>> non-nullable.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Best,
>>>>>>>>>>>>> Chia-Ping
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Jun Rao <[email protected]> 於 2025年7月8日 週二 上午5:56寫道:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks for the reply.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> JR10. Regarding supporting the null value, I am not sure how
>>>> one
>>>>>>>> could
>>>>>>>>>>>> set
>>>>>>>>>>>>>> a null value in a config file. For example, if you set the
>>>>>>> following
>>>>>>>>>>> in
>>>>>>>>>>>> a
>>>>>>>>>>>>>> config file.
>>>>>>>>>>>>>> configkey=
>>>>>>>>>>>>>> The value of configkey will be an empty list, instead of null,
>>>>>>>> right?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Null could make sense as the default value, but it just means
>>>>> that
>>>>>>>> the
>>>>>>>>>>>>>> config key is not set explicitly.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> JR11. There is an existing config interceptor.classes that
>>>> allows
>>>>>>> an
>>>>>>>>>>>> empty
>>>>>>>>>>>>>> list and it makes intuitive sense. So, it seems that it's ok
>> to
>>>>>>>>>>> support
>>>>>>>>>>>>>> empty lists in general. Given that, it's probably simpler to
>>>> just
>>>>>>>>>>> allow
>>>>>>>>>>>>>> log.cleanup.policy to be empty and properly support it?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Fri, Jul 4, 2025 at 5:13 AM 黃竣陽 <[email protected]>
>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Hello Jun,
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> JR10: The sasl.oauthbearer.expected.audience is optional,
>> that
>>>>> is
>>>>>>>>>>>> right,
>>>>>>>>>>>>>>> so I think
>>>>>>>>>>>>>>> that we can allow null value, but not allow the empty
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> JR11: In this KIP, the goal is to address configurations that
>>>>>>>> should
>>>>>>>>>>>> not
>>>>>>>>>>>>>>> accept empty arrays.
>>>>>>>>>>>>>>> We want to prevent users from passing in an empty list when
>>>> it's
>>>>>>>> not
>>>>>>>>>>>>>>> valid. I believe there are two
>>>>>>>>>>>>>>> main scenarios to consider:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> 1. Nullable but not empty:
>>>>>>>>>>>>>>> The parameter allows either a null value or a non-empty list.
>>>> In
>>>>>>>> this
>>>>>>>>>>>>>>> case,
>>>>>>>>>>>>>>> if the user provides an empty list, we should throw a
>>>>>>>>>>> ConfigException.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> 2. Non-null and non-empty only: The parameter must always
>>>>>>> contain a
>>>>>>>>>>>>>>> non-empty list — null is also
>>>>>>>>>>>>>>> invalid. In this case, if the user provides either a null or
>>>> an
>>>>>>>> empty
>>>>>>>>>>>>>>> list, we should throw a ConfigException.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Therefore, I want to prevent scenarios where users can pass
>> in
>>>>> an
>>>>>>>>>>> empty
>>>>>>>>>>>>>>> list.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> JR12: I’ve updated NonEmptyListValidator to include an
>>>> allowNull
>>>>>>>>>>>>>> property.
>>>>>>>>>>>>>>> This allows us to specify
>>>>>>>>>>>>>>> whether a configuration permits null values or not.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> JR13: I have updated the table
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Jun Rao <[email protected]> 於 2025年7月1日 清晨6:30 寫道:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Sorry for the late reply. A few more comments.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> JR10. The doc for sasl.oauthbearer.expected.audience says
>>>> that
>>>>>>>> it's
>>>>>>>>>>>>>>>> optional. So an empty list seems to be valid.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> JR11. Thinking a bit more. If we are going to support empty
>>>>>>> lists
>>>>>>>> in
>>>>>>>>>>>>>>>> general, it's probably more consistent to just allow
>>>>>>>>>>>> log.cleanup.policy
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>> be empty as Luke suggested, instead of introducing a new
>>>> option
>>>>>>>>>>> None.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> JR12. NonEmptyListValidator allows the input to be null. It
>>>>>>> seems
>>>>>>>>>>> that
>>>>>>>>>>>>>>>> only ssl.cipher.suites allows null. The remaining ones
>>>>> shouldn't
>>>>>>>> be
>>>>>>>>>>>>>> null.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> JR13. The table is very helpful. Could you also describe the
>>>>>>>> old/new
>>>>>>>>>>>>>>>> behavior for each config with an empty list or duplicate
>>>> entry?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Mon, Jun 30, 2025 at 6:02 AM 黃竣陽 <[email protected]>
>>>>> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Hello all,
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I am manually bumping this thread. Any feedback would be
>>>>>>>>>>> appreciated.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> 黃竣陽 <[email protected]> 於 2025年5月28日 晚上11:21 寫道:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Hello Jun,
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I have updated the KIP and introduced a new validator,
>>>>>>>>>>>>>>>>> NonEmptyListValidator, which ensures that the
>>>>>>>>>>>>>>>>>> provided list is either null or a non-empty list without
>>>>>>>> duplicate
>>>>>>>>>>>>>>>>> entries. I’ve also listed the configurations that will
>>>>>>>>>>>>>>>>>> be validated using this logic. Please feel free to share
>>>> any
>>>>>>>>>>>> feedback
>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>> suggestions.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Best Regards,
>>>>>>>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Jun Rao <[email protected]> 於 2025年5月23日 凌晨2:29
>>>> 寫道:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> It seems there are quite a few other configs of type list
>>>>>>> (e.g.
>>>>>>>>>>>>>>> several
>>>>>>>>>>>>>>>>> SSL
>>>>>>>>>>>>>>>>>>> related ones). It would be useful to understand if empty
>>>>>>> lists
>>>>>>>>>>> are
>>>>>>>>>>>>>>> valid
>>>>>>>>>>>>>>>>>>> for them or not.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> On Tue, May 13, 2025 at 10:12 AM Jun Rao <
>>>> [email protected]>
>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Hi, Luke,
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Thanks for the reply.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> "My thought is that this behavior has been existed
>>>>>>>>>>>>>>>>>>>> for years (maybe after "cleanup.policy" was
>> introduced?),
>>>>>>>> there
>>>>>>>>>>>>>> could
>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>> users relying on the empty cleanup.policy for a long
>>>> time.
>>>>> "
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> If you do a google search on "kafka infinite retention",
>>>>> you
>>>>>>>>>>> will
>>>>>>>>>>>>>> get
>>>>>>>>>>>>>>>>>>>> links like
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>
>>>>
>> https://stackoverflow.com/questions/39735036/make-kafka-topic-log-retention-permanent
>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>
>>>>
>> https://www.reddit.com/r/apachekafka/comments/mpz4bp/kafka_retention_question/
>>>>>>>>>>>>>>>>> ,
>>>>>>>>>>>>>>>>>>>> both pointing to setting the retention time and
>> retention
>>>>>>> size
>>>>>>>>>>> to
>>>>>>>>>>>>>> -1
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> achieve this goal. So, it seems that if a user
>>>>> intentionally
>>>>>>>>>>> wants
>>>>>>>>>>>>>>>>> infinite
>>>>>>>>>>>>>>>>>>>> retention, it's more likely they will use that approach
>>>>>>>> instead
>>>>>>>>>>> of
>>>>>>>>>>>>>>>>> setting
>>>>>>>>>>>>>>>>>>>> cleanup.policy to empty. On the other hand, our
>> API/tools
>>>>>>> make
>>>>>>>>>>> it
>>>>>>>>>>>>>>>>> possible
>>>>>>>>>>>>>>>>>>>> for users to make a mistake by inadvertently leaving the
>>>>>>>> config
>>>>>>>>>>>>>> value
>>>>>>>>>>>>>>>>> empty.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> On Mon, May 12, 2025 at 11:38 PM Luke Chen <
>>>>>>> [email protected]
>>>>>>>>>
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Hi Jun,
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Regarding the motivation, currently, we never
>>>> documented
>>>>>>>> that
>>>>>>>>>>> an
>>>>>>>>>>>>>>>>> empty
>>>>>>>>>>>>>>>>>>>>> cleanup.policy implies infinite retention. In fact, if
>>>> one
>>>>>>>>>>> leaves
>>>>>>>>>>>>>>>>>>>>> cleanup.policy empty, it actually breaks remote storage
>>>>>>> since
>>>>>>>>>>> it
>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>> stop
>>>>>>>>>>>>>>>>>>>>> the cleaning based on local retention size and time
>> too.
>>>>>>> So,
>>>>>>>>>>>>>> leaving
>>>>>>>>>>>>>>>>>>>>> cleanup.policy empty is probably more like a user
>>>> mistake
>>>>>>>> than
>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>> intentional choice. Based on this assumption, the idea
>>>>>>> behind
>>>>>>>>>>> the
>>>>>>>>>>>>>>> KIP
>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> fail an empty cleanup.policy so that the user is aware
>>>> of
>>>>>>>> this
>>>>>>>>>>>>>>> likely
>>>>>>>>>>>>>>>>>>>>> mistake and provide a new option None for users wanting
>>>>>>>>>>> infinite
>>>>>>>>>>>>>>>>> retention
>>>>>>>>>>>>>>>>>>>>> to opt in explicitly.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> While we never documented the empty cleanup.policy
>>>> implies
>>>>>>>>>>>>>> infinite
>>>>>>>>>>>>>>>>>>>>> retention, we also never documented (or failed) the
>>>> empty
>>>>>>>>>>>>>>>>> cleanup.policy
>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>> an invalid configuration. My thought is that this
>>>> behavior
>>>>>>>> has
>>>>>>>>>>>>>> been
>>>>>>>>>>>>>>>>>>>>> existed
>>>>>>>>>>>>>>>>>>>>> for years (maybe after "cleanup.policy" was
>>>> introduced?),
>>>>>>>> there
>>>>>>>>>>>>>>> could
>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>> users relying on the empty cleanup.policy for a long
>>>> time.
>>>>>>> It
>>>>>>>>>>> is
>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>> good
>>>>>>>>>>>>>>>>>>>>> to break the backward compatibility in a minor release
>>>>>>>> version
>>>>>>>>>>>>>> (ex:
>>>>>>>>>>>>>>>>>>>>> v4.1.0). Even though we think we are fixing a long
>>>>> existing
>>>>>>>>>>> bug,
>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>> could
>>>>>>>>>>>>>>>>>>>>> be a surprise to users.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> We could also consider supporting an empty
>>>> cleanup.policy
>>>>>>> by
>>>>>>>>>>>>>> fixing
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> issue in remote storage. But then the user may never
>>>>>>> realize
>>>>>>>>>>> this
>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>> it's
>>>>>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>> mistake.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Good point! I agree we need to fix it!
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Hi Chia-Ping,
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> We can print warnings for empty cleanup.policy in 4.x
>>>> and
>>>>>>> in
>>>>>>>>>>> 5.0
>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>> throw
>>>>>>>>>>>>>>>>>>>>> exception directly to make it fail fast
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> This suggestion looks good to me!
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Thank you.
>>>>>>>>>>>>>>>>>>>>> Luke
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> On Tue, May 13, 2025 at 2:14 PM Chia-Ping Tsai <
>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> hi all,
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Given Luke mentioned the existence of use cases, it is
>>>>>>> worth
>>>>>>>>>>>>>>>>> considering
>>>>>>>>>>>>>>>>>>>>>> the compatibility issue. In fact, I had previously
>>>>>>>> encountered
>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>> use
>>>>>>>>>>>>>>>>>>>>>> case but advised customers to utilize retention
>>>>>>>> configurations
>>>>>>>>>>>>>>>>> instead.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> We could also consider supporting an empty
>>>>> cleanup.policy
>>>>>>>> by
>>>>>>>>>>>>>>> fixing
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> issue in remote storage. But then the user may never
>>>>>>>> realize
>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>>>> it's a
>>>>>>>>>>>>>>>>>>>>>>> mistake.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Good catch! The "empty" or "none" wouldn't make sense
>>>> for
>>>>>>>>>>> remote
>>>>>>>>>>>>>>>>>>>>> storage.
>>>>>>>>>>>>>>>>>>>>>> I've opened KAFKA-19273 to ensure topics with tiered
>>>>>>> storage
>>>>>>>>>>> use
>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>> valid
>>>>>>>>>>>>>>>>>>>>>> delete policy.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>> Chia-Ping
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> On 2025/05/12 19:06:10 Jun Rao wrote:
>>>>>>>>>>>>>>>>>>>>>>> Hi, Luke,
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Regarding the motivation, currently, we never
>>>> documented
>>>>>>>> that
>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>> empty
>>>>>>>>>>>>>>>>>>>>>>> cleanup.policy implies infinite retention. In fact,
>> if
>>>>>>> one
>>>>>>>>>>>>>> leaves
>>>>>>>>>>>>>>>>>>>>>>> cleanup.policy empty, it actually breaks remote
>>>> storage
>>>>>>>> since
>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>> stop
>>>>>>>>>>>>>>>>>>>>>>> the cleaning based on local retention size and time
>>>> too.
>>>>>>>> So,
>>>>>>>>>>>>>>> leaving
>>>>>>>>>>>>>>>>>>>>>>> cleanup.policy empty is probably more like a user
>>>>> mistake
>>>>>>>>>>> than
>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>> intentional choice. Based on this assumption, the
>> idea
>>>>>>>> behind
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> KIP
>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> fail an empty cleanup.policy so that the user is
>> aware
>>>>> of
>>>>>>>>>>> this
>>>>>>>>>>>>>>>>> likely
>>>>>>>>>>>>>>>>>>>>>>> mistake and provide a new option None for users
>>>> wanting
>>>>>>>>>>>> infinite
>>>>>>>>>>>>>>>>>>>>>> retention
>>>>>>>>>>>>>>>>>>>>>>> to opt in explicitly.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> We could also consider supporting an empty
>>>>> cleanup.policy
>>>>>>>> by
>>>>>>>>>>>>>>> fixing
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> issue in remote storage. But then the user may never
>>>>>>>> realize
>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>>>> it's a
>>>>>>>>>>>>>>>>>>>>>>> mistake.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> On Sun, May 11, 2025 at 7:53 PM Luke Chen <
>>>>>>>> [email protected]
>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Hi Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the KIP.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Comments:
>>>>>>>>>>>>>>>>>>>>>>>> 1. "it is acceptable because an empty cleanup.policy
>>>> is
>>>>>>>>>>>>>>> considered
>>>>>>>>>>>>>>>>>>>>>> invalid
>>>>>>>>>>>>>>>>>>>>>>>> in Kafka. Therefore, this trade-off is justified."
>>>>>>>>>>>>>>>>>>>>>>>> Could you explain more about this? Why is this
>>>>> trade-off
>>>>>>>>>>>>>>> justified?
>>>>>>>>>>>>>>>>>>>>>>>> If we think the empty cleanup.policy is invalid in
>>>>>>> kafka,
>>>>>>>>>>> why
>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>> provide
>>>>>>>>>>>>>>>>>>>>>>>> an additional "none" option to users in this KIP?
>>>>>>>>>>>>>>>>>>>>>>>> FYI, there are indeed use cases that need to keep
>> all
>>>>>>>>>>> history
>>>>>>>>>>>>>>> data
>>>>>>>>>>>>>>>>>>>>>> without
>>>>>>>>>>>>>>>>>>>>>>>> a cleanup policy.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> 2. Following (1), I agree we should fail fast for
>>>> empty
>>>>>>>>>>>>>>>>>>>>>>>> "group.coordinator.rebalance.protocols" and
>>>>>>>> "process.roles"
>>>>>>>>>>>>>>> configs
>>>>>>>>>>>>>>>>>>>>>> since
>>>>>>>>>>>>>>>>>>>>>>>> they are invalid.
>>>>>>>>>>>>>>>>>>>>>>>> But about "cleanup.policy", I don't see a persuasive
>>>>>>>> reason
>>>>>>>>>>>> why
>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>>>>>>> break backward compatibility to change it.
>>>>>>>>>>>>>>>>>>>>>>>> "This provides a clear and direct way to configure
>>>>> Kafka
>>>>>>>> to
>>>>>>>>>>>>>>> retain
>>>>>>>>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>>>>>> log
>>>>>>>>>>>>>>>>>>>>>>>> segments without any automatic cleanup."
>>>>>>>>>>>>>>>>>>>>>>>> This is the motivation we mentioned in the KIP, but
>>>> to
>>>>>>> me,
>>>>>>>>>>>>>>> backward
>>>>>>>>>>>>>>>>>>>>>>>> compatibility is much more important than "a clear
>>>> and
>>>>>>>>>>> direct
>>>>>>>>>>>>>> way
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>> config
>>>>>>>>>>>>>>>>>>>>>>>> kafka".
>>>>>>>>>>>>>>>>>>>>>>>> Do we really have to change the "cleanup.policy"
>>>>> config?
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Thanks.
>>>>>>>>>>>>>>>>>>>>>>>> Luke
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> On Wed, May 7, 2025 at 2:17 AM Jun Rao
>>>>>>>>>>>>>> <[email protected]
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the updated KIP. It looks good to me.
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, May 6, 2025 at 4:58 AM 黃竣陽 <
>>>>> [email protected]
>>>>>>>>
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jun, chia
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for all the comments. They have all been
>>>>>>>> addressed
>>>>>>>>>>> in
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> updated
>>>>>>>>>>>>>>>>>>>>>>>>>> KIP.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> I've removed all deprecated-related sections.
>>>>>>>>>>> Additionally,
>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>> exception
>>>>>>>>>>>>>>>>>>>>>>>>>> will now be thrown if a
>>>>>>>>>>>>>>>>>>>>>>>>>> developer passes an empty validStrings list to the
>>>>>>>>>>>> inNonEmpty
>>>>>>>>>>>>>>>>>>>>>> method.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>> Best Regards,
>>>>>>>>>>>>>>>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> Chia-Ping Tsai <[email protected]> 於 2025年5月6日
>>>>>>>> 凌晨12:46
>>>>>>>>>>>> 寫道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> hi Jiunn-Yang
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> The `inNonEmpty` is used to prevent users pass
>>>> empty
>>>>>>>>>>>> config,
>>>>>>>>>>>>>>>>>>>>> so
>>>>>>>>>>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>>>>> be non-empty too?
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> For example, `inNonEmpty()` should throw
>> exception
>>>>>>>>>>>> directly.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>> Chia-Ping
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun Rao <[email protected]> 於 2025年5月6日
>> 週二
>>>>>>>>>>>>>> 上午12:28寫道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the reply. There are still references
>>>> to
>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> deprecated
>>>>>>>>>>>>>>>>>>>>>>>>>> method.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> "stop relying on the deprecated methods"
>>>>>>>>>>>>>>>>>>>>>>>>>>>> "Finally, the deprecated method will be removed
>>>> in
>>>>>>>> Kafka
>>>>>>>>>>>>>> 5.0"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Sat, May 3, 2025 at 7:42 AM 黃竣陽 <
>>>>>>>> [email protected]>
>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jun, chia,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for all the comments. They have all been
>>>>>>>>>>> addressed
>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>> updated
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KIP.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best Regards,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Chia-Ping Tsai <[email protected]> 於
>>>> 2025年5月3日
>>>>>>>>>>> 凌晨2:03
>>>>>>>>>>>>>> 寫道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hi Jiunn-Yang
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> in the "Compatibility, Deprecation, and
>>>> Migration
>>>>>>>>>>> Plan",
>>>>>>>>>>>>>>>>>>>>>> could you
>>>>>>>>>>>>>>>>>>>>>>>>> add
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> description to remind readers that
>>>>> "clean.policy="
>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>> replaced
>>>>>>>>>>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "clean.policy=none" if they do want to disable
>>>>>>>> delete
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>> compact.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Chia-Ping
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun Rao <[email protected]> 於
>> 2025年5月3日
>>>>> 週六
>>>>>>>>>>>>>>>>>>>>> 上午1:55寫道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> It's fine not to deprecate ValidList#in for
>>>> now.
>>>>>>>>>>> Could
>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>>>>>> update
>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KIP
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> completely? There are still references to
>>>>>>>>>>> deprecation.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Fri, May 2, 2025 at 4:59 AM 黃竣陽 <
>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jun,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I don’t think we should deprecate the
>>>>>>> ValidList#in
>>>>>>>>>>>>>>>>>>>>> method,
>>>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>>>>>>> there
>>>>>>>>>>>>>>>>>>>>>>>>>>>> may
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> future scenarios where we want
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to allow list configs to be empty. It’s
>>>> useful
>>>>>>> to
>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>>> both
>>>>>>>>>>>>>>>>>>>>>>>>> methods:
>>>>>>>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (which allows empty lists)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and inNonEmpty (which enforces non-empty
>>>>> lists).
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Just a minor comment. It would be useful to
>>>>>>>>>>> document
>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>> during
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> upgrade,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if cleanup.policy is empty, the broker will
>>>>>>> fail
>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> start.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I’ve updated the KIP accordingly.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best Regards,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun Rao <[email protected]> 於
>>>>> 2025年5月2日
>>>>>>>>>>>>>> 凌晨12:50
>>>>>>>>>>>>>>>>>>>>> 寫道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the reply. Sounds good.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Just a minor comment. It would be useful to
>>>>>>>>>>> document
>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>> during
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> upgrade,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if cleanup.policy is empty, the broker will
>>>>>>> fail
>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> start.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Thu, May 1, 2025 at 8:40 AM 黃竣陽 <
>>>>>>>>>>>>>> [email protected]>
>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hello Jun,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Since ValidList is a public API, we need
>> to
>>>>>>>>>>> maintain
>>>>>>>>>>>>>>>>>>>>>> backward
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> compatibility. Therefore, the
>>>> isEmptyAllowed
>>>>>>>> flag
>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> necessary.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> We can update the signature of
>> isNonEmpty()
>>>>> to
>>>>>>>>>>>> remove
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>> boolean
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> parameter.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best Regards,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun Rao <[email protected]> 於
>>>>>>> 2025年5月1日
>>>>>>>>>>>>>> 凌晨4:17
>>>>>>>>>>>>>>>>>>>>>> 寫道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the reply.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Do we really need isEmptyAllowed? It's
>>>>>>> awkward
>>>>>>>>>>>> since
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> method
>>>>>>>>>>>>>>>>>>>>>>>>>>>> name
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> inNonEmpty. Also, it's not clear when
>> it's
>>>>>>> set
>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> true.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Fri, Apr 25, 2025 at 6:26 AM 黃竣陽 <
>>>>>>>>>>>>>>>>>>>>> [email protected]>
>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jun,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thank you for pointing that out.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I have revised the KIP as follows:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> “In this case, the change does not
>>>>> introduce
>>>>>>>> new
>>>>>>>>>>>>>>>>>>>>> invalid
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configurations
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> prevent any currently valid setup.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The main behavioral difference is that
>> we
>>>>>>> now
>>>>>>>>>>>>>>>>>>>>> explicitly
>>>>>>>>>>>>>>>>>>>>>>>>> throw a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ConfigException during the storage
>>>> format
>>>>>>>>>>>>>> validation
>>>>>>>>>>>>>>>>>>>>>> phase
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> instead of relying on the current
>>>>> behavior.”
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This reflects the correct behavior.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best Regards,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun Rao <[email protected]> 於
>>>>>>>>>>> 2025年4月25日
>>>>>>>>>>>>>>>>>>>>>> 凌晨1:17 寫道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "The main behavioral difference
>>>> introduced
>>>>>>> by
>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>> change
>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ConfigException will now be thrown
>>>> during
>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> storage
>>>>>>>>>>>>>>>>>>>>>>>> format
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> validation
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> phase, rather than during server
>>>> startup."
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> It seems that currently formating the
>>>>>>> storage
>>>>>>>>>>>>>>>>>>>>> already
>>>>>>>>>>>>>>>>>>>>>> fails
>>>>>>>>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> group.coordinator.rebalance.protocols
>>>> and
>>>>>>>>>>>>>>>>>>>>> process.roles
>>>>>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> empty.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> It
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> just
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> gets a different exception.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Thu, Apr 24, 2025 at 5:32 AM 黃竣陽 <
>>>>>>>>>>>>>>>>>>>>>> [email protected]>
>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jun, chia,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for your feedback.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I add a new section for this change:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - Validation for
>>>>>>>>>>>>>>>>>>>>>> group.coordinator.rebalance.protocols and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> process.roles
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> will be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> moved from the server startup phase to
>>>>> the
>>>>>>>>>>>>>> storage
>>>>>>>>>>>>>>>>>>>>>> format
>>>>>>>>>>>>>>>>>>>>>>>>>>>> phase.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - For cleanup.policy, setting an empty
>>>>>>> list
>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>> now
>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> considered
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> invalid
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and will
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> result in a ConfigException during
>>>>> storage
>>>>>>>>>>>> format
>>>>>>>>>>>>>>>>>>>>>> phase.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best Regards,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun Rao <[email protected]> 於
>>>>>>>>>>>> 2025年4月24日
>>>>>>>>>>>>>>>>>>>>>> 凌晨4:44
>>>>>>>>>>>>>>>>>>>>>>>> 寫道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the reply.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Q2. It's true that
>>>>>>>>>>>>>>>>>>>>>> group.coordinator.rebalance.protocols
>>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> process.roles
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configurations can't be empty right
>>>> now.
>>>>>>>> With
>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>> KIP,
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> probably get a different (and more
>>>>>>>> accurate)
>>>>>>>>>>>>>>>>>>>>>> exception.
>>>>>>>>>>>>>>>>>>>>>>>> It
>>>>>>>>>>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> useful
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to document that.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Regarding cleanup.policy, I kind of
>>>>> agree
>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>> Chia-Ping.
>>>>>>>>>>>>>>>>>>>>>>>>> If
>>>>>>>>>>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> leaves
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cleanup.policy empty, it's more
>> likely
>>>>> to
>>>>>>>> be
>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>> mistake
>>>>>>>>>>>>>>>>>>>>>>>> than
>>>>>>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> intention.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> If we automatically treat it as None,
>>>>> the
>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>> never
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> realize
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> mistake. Throwing an exception will
>>>> let
>>>>>>> the
>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>>>> realize
>>>>>>>>>>>>>>>>>>>>>>>>>> there
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> mistake.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Wed, Apr 23, 2025 at 8:26 AM
>>>>> Chia-Ping
>>>>>>>>>>> Tsai
>>>>>>>>>>>> <
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hi Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the KIP, and I understand
>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>> maintaining
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> compatibility
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> important.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> However, according to the
>>>>> documentation,
>>>>>>>> we
>>>>>>>>>>>>>> don't
>>>>>>>>>>>>>>>>>>>>>> allow
>>>>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> empty
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> value
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the cleanup.policy. Hence, should we
>>>>>>>>>>> consider
>>>>>>>>>>>>>>>>>>>>>> throwing
>>>>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> exception
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> empty value in version 4.x? This
>>>> could
>>>>>>>>>>>>>> streamline
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> code
>>>>>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> avoid
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> extra deprecation cycle.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Chia-Ping
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun Rao <[email protected]>
>> 於
>>>>>>>>>>>>>> 2025年4月23日
>>>>>>>>>>>>>>>>>>>>> 週三
>>>>>>>>>>>>>>>>>>>>>>>>>> 上午6:33寫道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Regarding "The none policy will not
>>>>>>>> delete
>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>>> compact
>>>>>>>>>>>>>>>>>>>>>>>> any
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> segments",
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> should be more accurate. We won't
>>>>>>> delete
>>>>>>>>>>>>>>>>>>>>> segments
>>>>>>>>>>>>>>>>>>>>>> based
>>>>>>>>>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> log.retention.bytes/
>>>> log.retention.ms,
>>>>>>>> but
>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>>>>>>>>>>> continue
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> delete
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> segments based on
>>>>>>>>>>> log.local.retention.bytes/
>>>>>>>>>>>>>>>>>>>>>>>>>>>> log.retention.ms.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Otherwise,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> risk running out of local disk
>> space
>>>>>>> when
>>>>>>>>>>>>>> remote
>>>>>>>>>>>>>>>>>>>>>>>> storage
>>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enabled.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, Apr 22, 2025 at 9:45 AM Jun
>>>>>>> Rao <
>>>>>>>>>>>>>>>>>>>>>>>>> [email protected]>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the reply.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Q2. What about existing empty
>>>> values
>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>> group.coordinator.rebalance.protocols
>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>> process.roles
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> during
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> upgrade?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, Apr 22, 2025 at 7:29 AM
>>>> 黃竣陽 <
>>>>>>>>>>>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hello Jun,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for review this KIP.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Q1 & Q3:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I’ve updated the method name
>>>>>>>> accordingly
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>> revised
>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cleanup.policy
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> documentation
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to clarify that the none policy
>>>>>>> cannot
>>>>>>>> be
>>>>>>>>>>>>>> used
>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>> any
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> other
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> policy.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Q2:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> For users currently using an
>> empty
>>>>>>>>>>>>>>>>>>>>>> cleanup.policy,
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> approach
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> apply the none policy
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> during the preProcessParsedConfig
>>>>>>> step.
>>>>>>>>>>>>>>>>>>>>>>>> Additionally, a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> warning
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> message
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> will be emitted to inform users
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> of the upcoming change.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best Regards,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun Rao
>> <[email protected]
>>>>>
>>>>>>> 於
>>>>>>>>>>>>>>>>>>>>> 2025年4月22日
>>>>>>>>>>>>>>>>>>>>>>>>> 凌晨4:52
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 寫道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, Jiunn-Yang,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the KIP. A few
>>>> comments.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. It's fine to introduce a new
>>>>>>> value
>>>>>>>>>>> None
>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cleanup.policy.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> But
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> now
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> all value combinations are
>> valid.
>>>>>>> For
>>>>>>>>>>>>>>>>>>>>> example,
>>>>>>>>>>>>>>>>>>>>>> None
>>>>>>>>>>>>>>>>>>>>>>>>>> can't
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> used
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Delete or Compact. It would be
>>>>>>> useful
>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>> document
>>>>>>>>>>>>>>>>>>>>>>>>> that.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. What's the behavior during
>>>>>>> upgrade
>>>>>>>>>>> when
>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>> existing
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> config
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> has
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> empty
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> list.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3. inWithEmptyCheck: It's not
>>>> clear
>>>>>>>> what
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> empty
>>>>>>>>>>>>>>>>>>>>>>>>> check
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> does.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> How
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> about
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sth like inNonEmpty ?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, Apr 15, 2025 at 8:25 AM
>>>> 黃竣陽
>>>>>>> <
>>>>>>>>>>>>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hello everyone,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I would like to start a
>>>> discussion
>>>>>>> on
>>>>>>>>>>>>>>>>>>>>> KIP-1161:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cleanup.policy
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> shouldn't
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be empty
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <
>>>>>>>>>>>>>>>>>>>>> https://cwiki.apache.org/confluence/x/HArXF>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This proposal aims to improve
>>>> the
>>>>>>>>>>>>>>>>>>>>>> cleanup.policy
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Currently,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this setting should not be left
>>>>>>>> empty.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Therefore, there are two
>>>> proposed
>>>>>>>>>>>>>>>>>>>>> improvements:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. Update ValidList to validate
>>>>>>>> whether
>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>> empty
>>>>>>>>>>>>>>>>>>>>>>>> list
>>>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> allowed.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. Introduce a new 'none' value
>>>>> for
>>>>>>>>>>>>>>>>>>>>>> cleanup.policy.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best Regards,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiunn-Yang
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>
>>