private FileChannelRecordBatch nextAppendableBatch(Iterator<FileChannelRecordBatch> recordBatches,
                                                       ByteBuffer readBuffer,
                                                       int bytesToAppend) throws IOException {
        if (recordBatches.hasNext()) {
            FileChannelRecordBatch batch = recordBatches.next();
            if (canConvertToRelativeOffset(batch.lastOffset()) &&
                    (bytesToAppend == 0 || bytesToAppend + batch.sizeInBytes() < readBuffer.capacity()))
                return batch;
        }
        return null;
    }
Append the given messages starting with the given offset. Add
an entry to the index if needed.

It is assumed this method is being called from within a lock, it is not thread-safe otherwise.

@param largestOffset The last offset in the message set
@param largestTimestampMs The largest timestamp in the message set.
@param shallowOffsetOfMaxTimestamp The last offset of earliest batch with max timestamp in the messages to append.
@param records The log entries to append.
@throws LogSegmentOffsetOverflowException if the largest offset causes index offset overflow
storage/src/main/java/org/apache/kafka/storage/internals/log/LogSegment.java