Search in sources :

Example 1 with DeserializationResult

use of org.apache.kafka.streams.state.internals.TimeOrderedKeyValueBufferChangelogDeserializationHelper.DeserializationResult in project kafka by apache.

the class InMemoryTimeOrderedKeyValueBuffer method restoreBatch.

private void restoreBatch(final Collection<ConsumerRecord<byte[], byte[]>> batch) {
    for (final ConsumerRecord<byte[], byte[]> record : batch) {
        if (record.partition() != partition) {
            throw new IllegalStateException(String.format("record partition [%d] is being restored by the wrong suppress partition [%d]", record.partition(), partition));
        }
        final Bytes key = Bytes.wrap(record.key());
        if (record.value() == null) {
            // This was a tombstone. Delete the record.
            final BufferKey bufferKey = index.remove(key);
            if (bufferKey != null) {
                final BufferValue removed = sortedMap.remove(bufferKey);
                if (removed != null) {
                    memBufferSize -= computeRecordSize(bufferKey.key(), removed);
                }
                if (bufferKey.time() == minTimestamp) {
                    minTimestamp = sortedMap.isEmpty() ? Long.MAX_VALUE : sortedMap.firstKey().time();
                }
            }
        } else {
            final Header versionHeader = record.headers().lastHeader("v");
            if (versionHeader == null) {
                // Version 0:
                // value:
                // - buffer time
                // - old value
                // - new value
                final byte[] previousBufferedValue = index.containsKey(key) ? internalPriorValueForBuffered(key) : null;
                final DeserializationResult deserializationResult = deserializeV0(record, key, previousBufferedValue);
                cleanPut(deserializationResult.time(), deserializationResult.key(), deserializationResult.bufferValue());
            } else if (Arrays.equals(versionHeader.value(), V_3_CHANGELOG_HEADER_VALUE)) {
                // Version 3:
                // value:
                // - record context
                // - prior value
                // - old value
                // - new value
                // - buffer time
                final DeserializationResult deserializationResult = deserializeV3(record, key);
                cleanPut(deserializationResult.time(), deserializationResult.key(), deserializationResult.bufferValue());
            } else if (Arrays.equals(versionHeader.value(), V_2_CHANGELOG_HEADER_VALUE)) {
                // Version 2:
                // value:
                // - record context
                // - old value
                // - new value
                // - prior value
                // - buffer time
                // NOTE: 2.4.0, 2.4.1, and 2.5.0 actually encode Version 3 formatted data,
                // but still set the Version 2 flag, so to deserialize, we have to duck type.
                final DeserializationResult deserializationResult = duckTypeV2(record, key);
                cleanPut(deserializationResult.time(), deserializationResult.key(), deserializationResult.bufferValue());
            } else if (Arrays.equals(versionHeader.value(), V_1_CHANGELOG_HEADER_VALUE)) {
                // Version 1:
                // value:
                // - buffer time
                // - record context
                // - old value
                // - new value
                final byte[] previousBufferedValue = index.containsKey(key) ? internalPriorValueForBuffered(key) : null;
                final DeserializationResult deserializationResult = deserializeV1(record, key, previousBufferedValue);
                cleanPut(deserializationResult.time(), deserializationResult.key(), deserializationResult.bufferValue());
            } else {
                throw new IllegalArgumentException("Restoring apparently invalid changelog record: " + record);
            }
        }
    }
    updateBufferMetrics();
}
Also used : Bytes(org.apache.kafka.common.utils.Bytes) RecordHeader(org.apache.kafka.common.header.internals.RecordHeader) Header(org.apache.kafka.common.header.Header) DeserializationResult(org.apache.kafka.streams.state.internals.TimeOrderedKeyValueBufferChangelogDeserializationHelper.DeserializationResult)

Aggregations

Header (org.apache.kafka.common.header.Header)1 RecordHeader (org.apache.kafka.common.header.internals.RecordHeader)1 Bytes (org.apache.kafka.common.utils.Bytes)1 DeserializationResult (org.apache.kafka.streams.state.internals.TimeOrderedKeyValueBufferChangelogDeserializationHelper.DeserializationResult)1