Hi Jun, thanks for having the time to review this > JR1. While the KIP is potentially useful, I am wondering who is responsible > for retention for the objects in the payload store. Once a message with a > reference is deleted, the key of the external object is lost and the object > may never be deleted.
The `ttl` in the object store is the responsibility of the owner of this store it should be configured in away that is reasonable with the retention config in Kafka. I have updated the KIP with `Consideration` section. > > JR2. Configs: For all new configs, it would be useful to list their types. Updated the KIP now > > JR3. value.serializers: Why is this required? If a user doesn't set it, we > should just use value.serializer, right? Ditto for key.serializers. No you right this was copy/past mistake > > JR4. For all new public interfaces such as LargeMessageSerializer, > PayloadStore and PayloadResponse, it would be useful to include the full > package name. Updated the KIP now > > JR5. large.message.payload.store.retry.max.backoff.ms and > large.message.payload.store.retry.delay.backoff.ms: Is the intention to > implement exponential backoff on retries? If so, it's more consistent if we > can follow the existing naming convention like retry.backoff.max.ms > <http://retry.backoff.max.ms/> and > retry.backoff.ms <http://retry.backoff.ms/>. I have removed these to simplify the config more (as Luke suggested initially) and added these to the consideration section. > > JR6. large.message.skip.not.found.error : If the reference can't be found, > what value does the deserializer return? Note that null has a special > meaning for tombstone in compacted topics. The deserialiser will return `new byte[0]` not null. > > JR7. PayloadResponse: Why do we have both responseCode and > PayloadStoreException? We can do without responseCode, the initial though was to report response code form payload store. Update the KIP. > JR8. Why do we need PayloadStore.metrics? Note that we could monitor the > metrics in a plugin through the Monitorable interface. Oh nice, I didn’t know about this interface before. Updated the KIP with this now. > > JR9. Why do we need the protected field PayloadStoreException.isRetryable? Initial thought here was the serializer can retry the upload. But I have removed all the retry logic from serializer and it will be up to the PayloadStore provider to implement this if they need it. > > JR10. As Luke mentioned earlier, we could turn PayloadStore to an interface. It is updated now to interface. Hope the last version of the KIP is more simpler now Thanks Omnia > On 23 Jul 2025, at 00:43, Jun Rao <j...@confluent.io.INVALID> wrote: > > Thanks for the KIP. A few comments. > > JR1. While the KIP is potentially useful, I am wondering who is responsible > for retention for the objects in the payload store. Once a message with a > reference is deleted, the key of the external object is lost and the object > may never be deleted. > > JR2. Configs: For all new configs, it would be useful to list their types. > > JR3. value.serializers: Why is this required? If a user doesn't set it, we > should just use value.serializer, right? Ditto for key.serializers. > > JR4. For all new public interfaces such as LargeMessageSerializer, > PayloadStore and PayloadResponse, it would be useful to include the full > package name. > > JR5. large.message.payload.store.retry.max.backoff.ms and > large.message.payload.store.retry.delay.backoff.ms: Is the intention to > implement exponential backoff on retries? If so, it's more consistent if we > can follow the existing naming convention like retry.backoff.max.ms > <http://retry.backoff.max.ms/> and > retry.backoff.ms <http://retry.backoff.ms/>. > > JR6. large.message.skip.not.found.error : If the reference can't be found, > what value does the deserializer return? Note that null has a special > meaning for tombstone in compacted topics. > > JR7. PayloadResponse: Why do we have both responseCode and > PayloadStoreException? > > JR8. Why do we need PayloadStore.metrics? Note that we could monitor the > metrics in a plugin through the Monitorable interface. > > JR9. Why do we need the protected field PayloadStoreException.isRetryable? > > JR10. As Luke mentioned earlier, we could turn PayloadStore to an interface. > > Thanks,