Hi Fede;
> FV1: Looking at PayloadStore and PayloadResponse, "id" and "path"
> seems to be the same thing, which is a reference to the data in the
> external store. If my interpretation is correct, could we converge to
> using one of the two terms?
 
Path usually refers to the full path stored in Kafka topic as a full reference 
while an id is for file name for example 
`s3://my-bucket/my-topic/<random_uuid>` or `redis:cluster1:<key_id>`.

> FV2: I think PayloadResponse javadoc or PayloadStore interface may
> need some updates. It says "Response from publish / download", but
> PayloadStore.download returns a byte array, not a PayloadResponse.
Updated the KIP now and removed PayloadResponse and used the 
PayloadStoreException as this seems to be enough now after all the previous 
simplification after the last update. 

> FV3: In PayloadStore interface, public and abstract are implicit
> modifiers, so I think we can remove them.
Updated now 

Thanks 
Omnia
> On 26 Jul 2025, at 16:06, Federico Valeri <fedeval...@gmail.com> wrote:
> 
> Hi Omnia, nice design. I have few questions:
> 
> FV1: Looking at PayloadStore and PayloadResponse, "id" and "path"
> seems to be the same thing, which is a reference to the data in the
> external store. If my interpretation is correct, could we converge to
> using one of the two terms?
> 
> FV2: I think PayloadResponse javadoc or PayloadStore interface may
> need some updates. It says "Response from publish / download", but
> PayloadStore.download returns a byte array, not a PayloadResponse.
> 
> FV3: In PayloadStore interface, public and abstract are implicit
> modifiers, so I think we can remove them.
> 
> Thanks
> Fede
> 
> On Fri, Jul 25, 2025 at 3:28 PM Omnia Ibrahim <o.g.h.ibra...@gmail.com 
> <mailto:o.g.h.ibra...@gmail.com>> wrote:
>> 
>> 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/> <http://retry.backoff.max.ms/> and
>>> retry.backoff.ms <http://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 
>>> <mailto: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/> <http://retry.backoff.max.ms/> and
>>> retry.backoff.ms <http://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,

Reply via email to