Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
46187bb
feat: implement FlyweightNode for all XML node types with unified pag…
Feb 22, 2026
906a43d
refactor: remove legacy format code and rename unifiedPage to slotted…
Feb 22, 2026
caad7bd
feat: zero-allocation write path with LeanStore-style singleton cursors
Feb 23, 2026
5b14410
perf: eliminate lambda allocations and stale singleton reads on write…
Feb 23, 2026
7295214
feat: TIL-aware singleton moveTo for write transactions
Feb 24, 2026
fb46f80
fix: use getDeweyIDAsBytes() in toSnapshot() to prevent null DeweyID …
Feb 24, 2026
98a6032
perf: reduce itable dispatch and inline pageKey on write hot path
Feb 24, 2026
c3f563c
perf: eliminate moveTo before adaptForInsert on write hot path
Feb 24, 2026
28e38f1
perf: defer slotted page serialization to commit time on write path
Feb 24, 2026
0c53cce
perf: factory creates new objects instead of reusing singletons on wr…
Feb 24, 2026
e3c869b
Revert "perf: factory creates new objects instead of reusing singleto…
Feb 24, 2026
b4c0e04
perf: revert ObjectNode to varint+offset table encoding (~55% space s…
Feb 24, 2026
3edb832
perf: direct-to-heap serialization for full LeanStore write path
Feb 25, 2026
8a4bc03
fix: re-acquire write singleton after adaptPathForChangedNode in setName
Feb 25, 2026
735c4c5
fix: resource session leak in ResourceStoreImpl.close() and remove de…
Feb 25, 2026
989b4c4
perf: skip moveTo + snapshot on insert hot path when no indexes exist
Feb 26, 2026
cbdf9ed
perf: raw-copy field resize eliminates unbind+re-serialize on varint …
Feb 26, 2026
a989ded
perf: direct-to-heap node creation for all JSON and XML node types
Feb 26, 2026
4e1f70c
perf: zero-alloc computeHash via MemorySegment-native hashDirect, rem…
Feb 26, 2026
7322ef8
refactor: eliminate legacy ByteBuffer from entire node layer
Feb 26, 2026
955178f
perf: devirtualize itable stubs and lazy DeweyID parsing on write hot…
Feb 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,9 @@
public enum BinaryEncodingVersion {

/**
* Zero-copy format: slot offsets array + raw slotMemory blob. Enables direct buffer slice as page
* storage without copying.
* Unified page format: Header(32B) + Bitmap(128B) + Directory(8KB) + Heap.
* FlyweightNode records bind directly to page memory for zero-copy reads.
* Non-FlyweightNode records are serialized to the heap at commit time.
*/
V0((byte) 0);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
* @author Sebastian Graf, University of Konstanz
*/
public final class Databases {

/**
* Private constructor to prevent instantiation.
*/
Expand Down Expand Up @@ -596,4 +595,5 @@ public static synchronized void reinitializeBufferManagerForTesting(long recordP

logger.info("BufferManager reinitialized for testing");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,10 @@ public R getOpenResourceSession(final Path resourceFile) {

@Override
public void close() {
resourceSessions.forEach((_, resourceSession) -> resourceSession.close());
resourceSessions.forEach((resourceFile, resourceSession) -> {
resourceSession.close();
allResourceSessions.removeObject(resourceFile, resourceSession);
});
resourceSessions.clear();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,25 @@ public void setAutoCommit(final boolean value) {

/**
* Adapting the structure with a hash for all ancestors only with insert.
* Uses the current cursor position as the start node.
*
* @throws SirixIOException if an I/O error occurs
*/
public void adaptHashesWithAdd() {
adaptHashesWithAdd(nodeReadOnlyTrx.getNodeKey());
}

/**
* Adapting the structure with a hash for all ancestors only with insert.
* Accepts the start node key directly, avoiding a moveTo to position the cursor.
*
* @param startNodeKey the node key to start hashing from
* @throws SirixIOException if an I/O error occurs
*/
public void adaptHashesWithAdd(final long startNodeKey) {
if (!bulkInsert || autoCommit) {
switch (hashType) {
case ROLLING -> rollingAdd();
case ROLLING -> rollingAdd(startNodeKey);
case POSTORDER -> postorderAdd();
case NONE -> {
}
Expand Down Expand Up @@ -190,7 +202,8 @@ private void postorderAdd() {
protected abstract StructNode getStructuralNode();

private void persistNode(final Node node) {
storageEngineWriter.updateRecordSlot(node, IndexType.DOCUMENT, -1);
// Ensure the mutated node is stored in the TIL's modified page.
storageEngineWriter.persistRecord(node, IndexType.DOCUMENT, -1);
}

/**
Expand Down Expand Up @@ -290,10 +303,14 @@ private static void setRemoveDescendants(final long startDescendantCount, final
*
* @throws SirixIOException if an I/O error occurs
*/
private void rollingAdd() {
// start with hash to add
final Node startNode = storageEngineWriter.prepareRecordForModification(nodeReadOnlyTrx.getNodeKey(), IndexType.DOCUMENT, -1);
final long startNodeKey = startNode.getNodeKey();
private void rollingAdd(final long startNodeKey) {
// Position cursor on start node — needed for getStructuralNode().getDescendantCount()
// and to restore position at end. The caller eliminated the moveTo before adaptForInsert
// which is the bigger win (adaptForInsert is called unconditionally; rollingAdd only
// when hashing is enabled).
nodeReadOnlyTrx.moveTo(startNodeKey);
// start with hash to add — startNodeKey passed directly
final Node startNode = storageEngineWriter.prepareRecordForModification(startNodeKey, IndexType.DOCUMENT, -1);
// Capture all needed values from startNode before any subsequent prepareRecordForModification
// calls, which may return the same write-path singleton and overwrite startNode's fields.
final long startParentKey = startNode.getParentKey();
Expand Down
Loading
Loading