Skip to content

Commit fda56d2

Browse files
committed
fixup! WIP Refactoring and cleanup of BTree storage classes
1 parent 816d63f commit fda56d2

File tree

7 files changed

+92
-47
lines changed

7 files changed

+92
-47
lines changed

exist-core/src/main/java/org/exist/storage/btree/AbstractBTree.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@
9898

9999
import javax.annotation.Nullable;
100100
import java.io.*;
101-
import java.nio.file.Path;
102101
import java.text.NumberFormat;
103102
import java.util.*;
104103
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -1126,7 +1125,7 @@ private int getPivot(final int preferred) {
11261125
if (fileHeaderReadLock == null) {
11271126
fileHeaderReadLock = fileHeader.readLock();
11281127
}
1129-
pivot = currentLen > fileHeader.getWorkSize() ? i : i + 1;
1128+
pivot = currentLen > fileHeader.getPageContentSize() ? i : i + 1;
11301129
break;
11311130
}
11321131
}
@@ -1162,7 +1161,7 @@ private boolean mustSplit() {
11621161
}
11631162
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
11641163
try {
1165-
return getDataLen() > fileHeader.getWorkSize();
1164+
return getDataLen() > fileHeader.getPageContentSize();
11661165
} finally {
11671166
fileHeaderReadLock.unlock();
11681167
}
@@ -1251,7 +1250,7 @@ private void write() throws IOException {
12511250
final int keyLen;
12521251
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
12531252
try {
1254-
workSize = fileHeader.getWorkSize();
1253+
workSize = fileHeader.getPageContentSize();
12551254
keyLen = fileHeader.getFixedKeyLen();
12561255
} finally {
12571256
fileHeaderReadLock.unlock();
@@ -1417,7 +1416,7 @@ private long addValue(final Txn transaction, final Value value, final long point
14171416
final int workSize;
14181417
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
14191418
try {
1420-
workSize = fileHeader.getWorkSize();
1419+
workSize = fileHeader.getPageContentSize();
14211420
} finally {
14221421
fileHeaderReadLock.unlock();
14231422
}
@@ -1461,7 +1460,7 @@ private void promoteValue(final Txn transaction, final Value value, final BTreeN
14611460
final int workSize;
14621461
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
14631462
try {
1464-
workSize = fileHeader.getWorkSize();
1463+
workSize = fileHeader.getPageContentSize();
14651464
} finally {
14661465
fileHeaderReadLock.unlock();
14671466
}

exist-core/src/main/java/org/exist/storage/btree/AbstractPagedFile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ protected final void writeValue(final Page<PAGE_HEADER> page, final byte[] data)
545545
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
546546
final int workSize;
547547
try {
548-
workSize = fileHeader.getWorkSize();
548+
workSize = fileHeader.getPageContentSize();
549549
} finally {
550550
fileHeaderReadLock.unlock();
551551
}

exist-core/src/main/java/org/exist/storage/btree/AbstractPagedFileHeader.java

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,42 @@ public abstract class AbstractPagedFileHeader implements PagedFileHeader {
124124
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
125125

126126
//<editor-fold desc="Immutable state">
127+
/**
128+
* A number indicating the version of the file format in use.
129+
*/
127130
private final short version;
131+
132+
/**
133+
* Size of the header in bytes.
134+
* Historically this has always been 4KB in eXist-db,
135+
* but it can be configured in conf.xml.
136+
*/
128137
private final short headerSize;
138+
139+
/**
140+
* Size of a page in bytes.
141+
* Historically this has always been 4KB in eXist-db,
142+
* but it can be configured in conf.xml.
143+
*/
129144
private final int pageSize;
145+
146+
/**
147+
* Size of a header with in a page in bytes.
148+
* Defaults to {@link #DEFAULT_PAGE_HEADER_SIZE}.
149+
*/
130150
private final byte pageHeaderSize;
151+
152+
/**
153+
* Maximum size for a key.
154+
* Defaults to {@link #DEFAULT_MAX_KEY_SIZE}.
155+
*/
131156
private final short maxKeySize;
132-
private final int workSize;
157+
158+
/**
159+
* The size in bytes of the area within a page for writing content.
160+
* This is simply pre-calculated as {@code pageSize - pageHeaderSize}.
161+
*/
162+
private final int pageContentSize;
133163

134164
/**
135165
* This is here so that we can allocate once and reuse multiple times in {@link #write(byte[])}.
@@ -138,9 +168,25 @@ public abstract class AbstractPagedFileHeader implements PagedFileHeader {
138168
// </editor-fold>
139169

140170
//<editor-fold desc="Mutable state">
171+
/**
172+
* The total number of pages in the file.
173+
*/
141174
private long totalCount;
175+
176+
/**
177+
* The first free page in the file.
178+
*/
142179
private long firstFreePage;
180+
181+
/**
182+
* The last free page in the file.
183+
*/
143184
private long lastFreePage;
185+
186+
/**
187+
* Whether the file header has been updated
188+
* and needs to be persisted.
189+
*/
144190
private boolean dirty;
145191
//</editor-fold>
146192

@@ -153,7 +199,7 @@ protected AbstractPagedFileHeader(final short version, final short headerSize, f
153199
this.firstFreePage = firstFreePage;
154200
this.lastFreePage = lastFreePage;
155201
this.totalCount = totalCount;
156-
this.workSize = this.pageSize - this.pageHeaderSize;
202+
this.pageContentSize = this.pageSize - this.pageHeaderSize;
157203
this.headerBuf = new byte[headerSize];
158204
}
159205

@@ -264,12 +310,12 @@ public int getMaxKeySize() {
264310
}
265311

266312
/**
267-
* Gets the workSize attribute of the FileHeader object
313+
* Get the size in bytes of the area within a page for writing content.
268314
*
269-
* @return The workSize value
315+
* @return the page content size.
270316
*/
271-
public int getWorkSize() {
272-
return this.workSize;
317+
public int getPageContentSize() {
318+
return this.pageContentSize;
273319
}
274320

275321
/**

exist-core/src/main/java/org/exist/storage/btree/BTreeFileHeader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ public void setFixedKeyLen(short keyLen) {
192192

193193
@Override
194194
public int getMaxKeySize() {
195-
return (getWorkSize() / 2) - MIN_SPACE_PER_KEY;
195+
return (getPageContentSize() / 2) - MIN_SPACE_PER_KEY;
196196
}
197197

198198

exist-core/src/main/java/org/exist/storage/dom/DOMFile.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ private DOMPage createDOMPage() throws IOException {
295295
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
296296
final byte[] data;
297297
try {
298-
data = new byte[fileHeader.getWorkSize()];
298+
data = new byte[fileHeader.getPageContentSize()];
299299
} finally {
300300
fileHeaderReadLock.unlock();
301301
}
@@ -313,7 +313,7 @@ private DOMPage createDOMPage(final long pointer) throws IOException {
313313
byte[] data = newPage.read(backingFile.randomAccessFile);
314314
int len = newPage.getPageHeader().getDataLength();
315315
if (data.length == 0) {
316-
data = new byte[fileHeader.getWorkSize()];
316+
data = new byte[fileHeader.getPageContentSize()];
317317
len = 0;
318318
}
319319

@@ -413,7 +413,7 @@ public long add(final Txn transaction, final byte[] value) throws ReadOnlyExcept
413413
final int workSize;
414414
final ReentrantReadWriteLock.ReadLock fileHeaderReadlock = fileHeader.readLock();
415415
try {
416-
workSize = fileHeader.getWorkSize();
416+
workSize = fileHeader.getPageContentSize();
417417
} finally {
418418
fileHeaderReadlock.unlock();
419419
}
@@ -624,7 +624,7 @@ public long insertAfter(final Txn transaction, final DocumentImpl doc, final lon
624624
int workSize;
625625
ReentrantReadWriteLock.ReadLock fileHeaderReadlock = fileHeader.readLock();
626626
try {
627-
workSize = fileHeader.getWorkSize();
627+
workSize = fileHeader.getPageContentSize();
628628
} finally {
629629
fileHeaderReadlock.unlock();
630630
}
@@ -658,7 +658,7 @@ public long insertAfter(final Txn transaction, final DocumentImpl doc, final lon
658658
//New value fits into the page
659659
fileHeaderReadlock = fileHeader.readLock();
660660
try {
661-
workSize = fileHeader.getWorkSize();
661+
workSize = fileHeader.getPageContentSize();
662662
} finally {
663663
fileHeaderReadlock.unlock();
664664
}
@@ -675,7 +675,7 @@ public long insertAfter(final Txn transaction, final DocumentImpl doc, final lon
675675
//Still not enough free space: create a new page
676676
fileHeaderReadlock = fileHeader.readLock();
677677
try {
678-
workSize = fileHeader.getWorkSize();
678+
workSize = fileHeader.getPageContentSize();
679679
} finally {
680680
fileHeaderReadlock.unlock();
681681
}
@@ -736,7 +736,7 @@ public long insertAfter(final Txn transaction, final DocumentImpl doc, final lon
736736

737737
fileHeaderReadlock = fileHeader.readLock();
738738
try {
739-
workSize = fileHeader.getWorkSize();
739+
workSize = fileHeader.getPageContentSize();
740740
} finally {
741741
fileHeaderReadlock.unlock();
742742
}
@@ -862,7 +862,7 @@ private RecordPos splitDataPage(final Txn transaction, final RecordPos rec) thro
862862
int workSize;
863863
ReentrantReadWriteLock.ReadLock fileHeaderReadlock = fileHeader.readLock();
864864
try {
865-
workSize = fileHeader.getWorkSize();
865+
workSize = fileHeader.getPageContentSize();
866866
} finally {
867867
fileHeaderReadlock.unlock();
868868
}
@@ -894,7 +894,7 @@ private RecordPos splitDataPage(final Txn transaction, final RecordPos rec) thro
894894
if (ItemId.isLink(tupleID)) {
895895
fileHeaderReadlock = fileHeader.readLock();
896896
try {
897-
workSize = fileHeader.getWorkSize();
897+
workSize = fileHeader.getPageContentSize();
898898
} finally {
899899
fileHeaderReadlock.unlock();
900900
}
@@ -956,7 +956,7 @@ private RecordPos splitDataPage(final Txn transaction, final RecordPos rec) thro
956956
//Check if we have room in the current split page
957957
fileHeaderReadlock = fileHeader.readLock();
958958
try {
959-
workSize = fileHeader.getWorkSize();
959+
workSize = fileHeader.getPageContentSize();
960960
} finally {
961961
fileHeaderReadlock.unlock();
962962
}
@@ -1060,7 +1060,7 @@ private RecordPos splitDataPage(final Txn transaction, final RecordPos rec) thro
10601060
// the link doesn't fit into the old page. Append a new page
10611061
fileHeaderReadlock = fileHeader.readLock();
10621062
try {
1063-
workSize = fileHeader.getWorkSize();
1063+
workSize = fileHeader.getPageContentSize();
10641064
} finally {
10651065
fileHeaderReadlock.unlock();
10661066
}
@@ -2394,7 +2394,7 @@ void redoCreatePage(final CreatePageLoggable loggable) {
23942394

23952395
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
23962396
try {
2397-
newPage.data = new byte[fileHeader.getWorkSize()];
2397+
newPage.data = new byte[fileHeader.getPageContentSize()];
23982398
} finally {
23992399
fileHeaderReadLock.unlock();
24002400
}
@@ -2611,7 +2611,7 @@ void undoRemoveValue(final RemoveValueLoggable loggable) {
26112611
"; tid: " + ItemId.getId(loggable.tid) + "; required: " + required +
26122612
"; offset: " + offset + "; end: " + end +
26132613
"; len: " + (pageHeader.getDataLength() - offset) +
2614-
"; avail: " + page.data.length + "; work: " + fileHeader.getWorkSize());
2614+
"; avail: " + page.data.length + "; work: " + fileHeader.getPageContentSize());
26152615
}
26162616
}
26172617
//save TID
@@ -2695,7 +2695,7 @@ void redoRemovePage(final RemovePageLoggable loggable) {
26952695
pageHeader.setPrevDataPage(NO_PAGE);
26962696
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
26972697
try {
2698-
pageHeader.updateDataLen(fileHeader.getWorkSize());
2698+
pageHeader.updateDataLen(fileHeader.getPageContentSize());
26992699
} finally {
27002700
fileHeaderReadLock.unlock();
27012701
}
@@ -2895,7 +2895,7 @@ void redoSplitPage(final SplitPageLoggable loggable) {
28952895
final byte[] oldData = page.data;
28962896
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
28972897
try {
2898-
page.data = new byte[fileHeader.getWorkSize()];
2898+
page.data = new byte[fileHeader.getPageContentSize()];
28992899
} finally {
29002900
fileHeaderReadLock.unlock();
29012901
}
@@ -3120,7 +3120,7 @@ int write(final Txn transaction, final InputStream is) throws IOException {
31203120
final int chunkSize;
31213121
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
31223122
try {
3123-
chunkSize = fileHeader.getWorkSize();
3123+
chunkSize = fileHeader.getPageContentSize();
31243124
} finally {
31253125
fileHeaderReadLock.unlock();
31263126
}
@@ -3198,8 +3198,8 @@ int write(final Txn transaction, final byte[] data) throws IOException {
31983198
final int chunkSize;
31993199
final ReentrantReadWriteLock.ReadLock fileHeaderReadLock = fileHeader.readLock();
32003200
try {
3201-
chunkSize = remaining > fileHeader.getWorkSize() ?
3202-
fileHeader.getWorkSize() : remaining;
3201+
chunkSize = remaining > fileHeader.getPageContentSize() ?
3202+
fileHeader.getPageContentSize() : remaining;
32033203
} finally {
32043204
fileHeaderReadLock.unlock();
32053205
}

exist-core/src/main/java/org/exist/storage/dom/SplitPageLoggable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void read(final ByteBuffer in) {
6868
pageNum = in.getInt();
6969
splitOffset = in.getInt();
7070
oldLen = in.getShort();
71-
oldData = new byte[domDb.getFileHeader().getWorkSize()];
71+
oldData = new byte[domDb.getFileHeader().getPageContentSize()];
7272
in.get(oldData, 0, oldLen);
7373
}
7474

0 commit comments

Comments
 (0)