Skip to content

PHOENIX-7958 Reduce per-record and per-block copies in replication log writer#2572

Merged
tkhurana merged 2 commits into
apache:PHOENIX-7562-feature-newfrom
tkhurana:PHOENIX-7958
Jul 15, 2026
Merged

PHOENIX-7958 Reduce per-record and per-block copies in replication log writer#2572
tkhurana merged 2 commits into
apache:PHOENIX-7562-feature-newfrom
tkhurana:PHOENIX-7958

Conversation

@tkhurana

Copy link
Copy Markdown
Contributor

No description provided.

tkhurana added 2 commits July 10, 2026 16:09
…g writer

Switch the record encoder and block writer from java.io.ByteArrayOutputStream
to HBase's ByteArrayOutputStream and write directly from the backing buffer
via getBuffer()/size() instead of toByteArray(). This eliminates the
per-record body copy in LogFileCodec and the per-block copy in
LogFileFormatWriter (the latter previously copied the whole ~1MB block even
in the uncompressed path). Also hoist the per-record DataOutputStream wrapper
to a field.

Add an opt-in allocation A/B microbenchmark (testAllocationMicrobenchmark)
that drives the full append path and measures heap bytes per record via
ThreadMXBean. Measured -22.5% heap/record (3583.5 -> 2776.1 B).
Add testCodecLargeRecordThenSmallReusesBufferCleanly, which encodes a
large record then a small one through the same encoder so the reused
scratch buffer has grown, then asserts both round-trip with no trailing
garbage. This pins the getBuffer()+size() invariant: writing the full
backing-array length instead of size() would misframe the stream after
the small record.

Also correct the testAllocationMicrobenchmark javadoc, which referenced
the per-record/per-block toByteArray() calls this change removed.
@tkhurana tkhurana merged commit 3cd652d into apache:PHOENIX-7562-feature-new Jul 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant