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();
}
Aggregations