Wojciech Trefon created NIFI-16350:
--------------------------------------

             Summary: ConsumeKafka RECORD strategy and verification treat Kafka 
tombstones as parse failures
                 Key: NIFI-16350
                 URL: https://issues.apache.org/jira/browse/NIFI-16350
             Project: Apache NiFi
          Issue Type: Bug
            Reporter: Wojciech Trefon


h2. Summary

A Kafka tombstone is a record with a non-null key and a null value. When 
ConsumeKafka uses the RECORD processing strategy, tombstones are passed to the 
configured Record Reader as zero-length content.

With StandardProtobufReader and ConfluentEncodedSchemaReferenceReader, this 
causes tombstones to be treated as malformed Protobuf records. The same record 
also causes ConsumeKafka verification to fail in the Parse Records step.

h2. Steps to reproduce

# Publish a Kafka record with a non-null key and a null value.
# Configure ConsumeKafka with Processing Strategy set to RECORD.
# Configure StandardProtobufReader with ConfluentEncodedSchemaReferenceReader.
# Stop ConsumeKafka and run Verify.
# Observe that the Parse Records verification step fails on the tombstone.
# Start ConsumeKafka normally.
# Observe that the tombstone is routed as a parse failure while the consumer 
offset advances.

h2. Actual behavior

Verify reports an error similar to:

{code}
Parse Records
Failed to parse Record number 9: 
org.apache.nifi.schema.access.SchemaNotFoundException: Failed to read header in 
first 5 bytes from stream
{code}

During normal RECORD processing, the zero-length value reaches 
StandardProtobufReader and is routed to the parse failure relationship. If that 
relationship is auto-terminated, the tombstone is silently discarded while 
consumption continues and the offset advances.

This differs from FLOW_FILE processing, where a tombstone can be represented by 
an empty FlowFile with the kafka.tombstone attribute set to true and routed 
through success.

h2. Expected behavior

A valid Kafka tombstone should not be classified as a malformed Protobuf record 
solely because it has no schema header. Verification and normal processing 
should handle the same tombstone consistently and preserve the distinction 
between a null Kafka value and a non-null empty value.

h2. Code observation

Kafka3ConsumerService converts a null ConsumerRecord value to a zero-length 
byte array before RECORD processing. At that point, downstream record parsing 
cannot distinguish a tombstone from a non-null empty value.

h2. Related issues

* [NIFI-12371|https://issues.apache.org/jira/browse/NIFI-12371] added tombstone 
support for non-record Kafka processors and noted that record-based processors 
might require separate handling.
* [NIFI-14122|https://issues.apache.org/jira/browse/NIFI-14122] and 
[NIFI-14123|https://issues.apache.org/jira/browse/NIFI-14123] restored 
tombstone support in Kafka publish paths.
* [NIFI-14247|https://issues.apache.org/jira/browse/NIFI-14247] covers 
ConsumeKafka tombstones in FLOW_FILE processing.

The related issues do not cover ConsumeKafka RECORD processing or the Verify 
Parse Records step.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to