Skip to content

Commit

Permalink
fix: re-use space only in page that have enough of it, issue #10005
Browse files Browse the repository at this point in the history
  • Loading branch information
tglman committed Aug 1, 2023
1 parent 31b400c commit 21c49f9
Showing 1 changed file with 27 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ public final class OPaginatedClusterV2 extends OPaginatedCluster {
private static final int MAX_ENTRY_SIZE =
OClusterPage.MAX_RECORD_SIZE - OByteSerializer.BYTE_SIZE - OLongSerializer.LONG_SIZE;

private static final int MIN_ENTRY_SIZE = OByteSerializer.BYTE_SIZE + OLongSerializer.LONG_SIZE;

private static final int STATE_ENTRY_INDEX = 0;
private static final int BINARY_VERSION = 2;

Expand Down Expand Up @@ -433,34 +435,37 @@ private int[] serializeRecord(

int maxRecordSize;
try {
final int pageChunkSize = Math.min(page.getMaxRecordSize(), chunkSize);

final ORawPair<byte[], Integer> pair =
serializeEntryChunk(
content, pageChunkSize, bytesToWrite, nextRecordPointers, recordType);
final byte[] chunk = pair.first;

final OCacheEntry cacheEntry = page.getCacheEntry();
nextPageOffset =
page.appendRecord(
recordVersion,
chunk,
-1,
atomicOperation.getBookedRecordPositions(id, cacheEntry.getPageIndex()));
assert nextPageOffset >= 0;
int availableInPage = page.getMaxRecordSize();
if (availableInPage > MIN_ENTRY_SIZE) {

maxRecordSize = page.getMaxRecordSize();
final int pageChunkSize = Math.min(availableInPage, chunkSize);

final ORawPair<byte[], Integer> pair =
serializeEntryChunk(
content, pageChunkSize, bytesToWrite, nextRecordPointers, recordType);
final byte[] chunk = pair.first;

bytesToWrite -= pair.second;
assert bytesToWrite >= 0;
final OCacheEntry cacheEntry = page.getCacheEntry();
nextPageOffset =
page.appendRecord(
recordVersion,
chunk,
-1,
atomicOperation.getBookedRecordPositions(id, cacheEntry.getPageIndex()));
assert nextPageOffset >= 0;

nextPageIndex = cacheEntry.getPageIndex();
bytesToWrite -= pair.second;
assert bytesToWrite >= 0;

if (bytesToWrite > 0) {
chunkSize = calculateChunkSize(bytesToWrite);
nextPageIndex = cacheEntry.getPageIndex();

nextRecordPointers = createPagePointer(nextPageIndex, nextPageOffset);
if (bytesToWrite > 0) {
chunkSize = calculateChunkSize(bytesToWrite);

nextRecordPointers = createPagePointer(nextPageIndex, nextPageOffset);
}
}
maxRecordSize = page.getMaxRecordSize();
} finally {
pagePostProcessor.accept(page);
}
Expand Down

0 comments on commit 21c49f9

Please sign in to comment.