Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
cc85387
Attempt to change to single MemorySegment for slots
JohannesLichtenberger Aug 29, 2024
53976ab
Remove some output
JohannesLichtenberger Aug 29, 2024
e0773dc
Update slotted page stuff...
JohannesLichtenberger Sep 4, 2024
9db8291
Disable tests (shouldn't have been committed)
JohannesLichtenberger Sep 4, 2024
b8ee7fb
Update adding reference counting to the cached pages
JohannesLichtenberger Sep 14, 2024
18a2af0
Fix closing/clearing of pages
JohannesLichtenberger Sep 14, 2024
1aaafd1
Fix closing/clearing of pages
JohannesLichtenberger Sep 14, 2024
e34784d
Minor updates regarding less memory usage, also fixing a resource leak
JohannesLichtenberger Sep 19, 2024
0ae7926
Minor simplifications
JohannesLichtenberger Sep 20, 2024
bfa8ee3
Minor simplifications
JohannesLichtenberger Sep 21, 2024
d98608e
Fix memory leak
JohannesLichtenberger Sep 23, 2024
cac1b97
Remove leftover stuff from reusing a byte-array for decompression
JohannesLichtenberger Sep 23, 2024
6feeeed
Add custom allocator and page pool
JohannesLichtenberger Jun 25, 2025
788b805
Several fixes for custom allocator and page pool
JohannesLichtenberger Aug 3, 2025
59d1d27
Refactor JSON nodes to use consistent lazy MemorySegment deserialization
Oct 1, 2025
ad02c77
Refactor JSON node serialization with size prefix for efficient deser…
Oct 3, 2025
4d75cdd
Add JVM arguments to allow hashing library access to internal JDK mod…
Oct 5, 2025
2d5f576
Fix ArrayNodeTest and ObjectNodeTest to use proper NodeKind byte + pa…
Oct 5, 2025
635dcf4
Fix all JSON node tests to use proper NodeKind byte + size prefix + p…
Oct 5, 2025
fb19518
Extract JSON node test serialization helpers to reduce duplication
Oct 5, 2025
523962f
Refactor JSON node serialization utilities into shared JsonNodeSerial…
Oct 5, 2025
3ec8a5b
Fix JsonNodeFactoryImplTest serialization tests to use proper alignment
Oct 5, 2025
ee01392
Refactor: Move shared number serialization logic to NodeKind
Oct 5, 2025
d844034
Change GrowingMemorySegment to use Arena.ofAuto() instead of Arena.gl…
Oct 5, 2025
3fca3b8
Effectively remove the bin folder from version control
Oct 5, 2025
6c28331
Effectively remove the bin folder from version control
Oct 5, 2025
064ea29
Fix compilation errors: Update JsonNodeFactoryImpl to use NodeKind.se…
Oct 5, 2025
964421d
Fix RB node serialization: Use variable-length encoding for parent ke…
Oct 5, 2025
227816c
Adapt .gitignore to ignore the sirix-core bin-directory
Oct 5, 2025
3c150c6
Optimize memory management with hybrid Arena approach
Oct 6, 2025
cb7b610
Attempt to change to single MemorySegment for slots
JohannesLichtenberger Aug 29, 2024
e7fb7af
Remove some output
JohannesLichtenberger Aug 29, 2024
53602e3
Update slotted page stuff...
JohannesLichtenberger Sep 4, 2024
0b6e8db
Disable tests (shouldn't have been committed)
JohannesLichtenberger Sep 4, 2024
5994bcb
Update adding reference counting to the cached pages
JohannesLichtenberger Sep 14, 2024
7640da8
Fix closing/clearing of pages
JohannesLichtenberger Sep 14, 2024
6482b63
Fix closing/clearing of pages
JohannesLichtenberger Sep 14, 2024
fb1fc89
Minor updates regarding less memory usage, also fixing a resource leak
JohannesLichtenberger Sep 19, 2024
a80a29f
Minor simplifications
JohannesLichtenberger Sep 20, 2024
9369e78
Minor simplifications
JohannesLichtenberger Sep 21, 2024
4b66653
Fix memory leak
JohannesLichtenberger Sep 23, 2024
259bd72
Remove leftover stuff from reusing a byte-array for decompression
JohannesLichtenberger Sep 23, 2024
2c7608e
Add custom allocator and page pool
JohannesLichtenberger Jun 25, 2025
8682520
Several fixes for custom allocator and page pool
JohannesLichtenberger Aug 3, 2025
22b9254
Refactor JSON nodes to use consistent lazy MemorySegment deserialization
Oct 1, 2025
0eeb39f
Refactor JSON node serialization with size prefix for efficient deser…
Oct 3, 2025
db1d6aa
Add JVM arguments to allow hashing library access to internal JDK mod…
Oct 5, 2025
1523736
Fix ArrayNodeTest and ObjectNodeTest to use proper NodeKind byte + pa…
Oct 5, 2025
5010c51
Fix all JSON node tests to use proper NodeKind byte + size prefix + p…
Oct 5, 2025
b28a89f
Extract JSON node test serialization helpers to reduce duplication
Oct 5, 2025
8961497
Refactor JSON node serialization utilities into shared JsonNodeSerial…
Oct 5, 2025
9ceba73
Fix JsonNodeFactoryImplTest serialization tests to use proper alignment
Oct 5, 2025
8df4029
Refactor: Move shared number serialization logic to NodeKind
Oct 5, 2025
44ed013
Change GrowingMemorySegment to use Arena.ofAuto() instead of Arena.gl…
Oct 5, 2025
317f0eb
Effectively remove the bin folder from version control
Oct 5, 2025
8c98d95
Effectively remove the bin folder from version control
Oct 5, 2025
87f1068
Fix compilation errors: Update JsonNodeFactoryImpl to use NodeKind.se…
Oct 5, 2025
a135c38
Fix RB node serialization: Use variable-length encoding for parent ke…
Oct 5, 2025
5a8eac8
Adapt .gitignore to ignore the sirix-core bin-directory
Oct 5, 2025
cd3d820
Optimize memory management with hybrid Arena approach
Oct 6, 2025
8c711a5
Merge remote-tracking branch 'origin/refactor-json-nodes-lazy-deseria…
Oct 6, 2025
67eb966
Refactor ElementNode to MemorySegment-backed storage with lazy deseri…
Oct 7, 2025
a65a919
Refactor AttributeNode to MemorySegment-backed storage with lazy dese…
Oct 7, 2025
337cd78
Refactor NamespaceNode to MemorySegment-backed storage with lazy dese…
Oct 7, 2025
280b59d
Refactor CommentNode to MemorySegment-backed storage with lazy deseri…
Oct 7, 2025
69a23bd
Refactor PINode to MemorySegment-backed storage with lazy deserializa…
Oct 7, 2025
44b205d
Refactor TextNode to MemorySegment-backed storage with lazy deseriali…
Oct 7, 2025
8dce18e
Add lazy decompression for TextNode values
Oct 7, 2025
18d7b04
Rename JsonNodeTestHelper to NodeTestHelper and move to io.sirix.node…
Oct 7, 2025
6670161
Remove unused imports from MemorySegment-backed XML nodes
Oct 7, 2025
38aad49
Refactor value nodes to remove redundant childCount/descendantCount s…
Oct 8, 2025
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,4 @@ bundles/sirix-rest-api/.idea/compiler.xml
/bundles/sirix-rest-api/zgc-generational-insert.log
/bundles/sirix-core/zgc-generational-insert.log
/bundles/sirix-core/src/test/resources/json/cityofchicago.json
/bundles/sirix-core/bin/
Binary file not shown.
Binary file removed analysis-5-trxs.jfr
Binary file not shown.
12 changes: 7 additions & 5 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,8 @@ subprojects {
"--add-exports=java.base/sun.nio.ch=ALL-UNNAMED",
"--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED",
"--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
"--add-exports=java.base/java.lang.reflect=ALL-UNNAMED"]
"--add-exports=java.base/java.lang.reflect=ALL-UNNAMED"
]
}

compileTestJava {
Expand Down Expand Up @@ -260,13 +261,14 @@ subprojects {
"--add-opens=java.base/java.io=ALL-UNNAMED",
"--add-opens=java.base/java.util=ALL-UNNAMED",
"--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
"--enable-native-access=ALL-UNNAMED",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+DebugNonSafepoints",
//"-XX:+UseShenandoahGC",
// "-Xlog:gc*=debug:file=g1.log",
// "-XX:+UseZGC",
"-Xlog:gc*=debug:file=g1.log",
"-XX:+UseZGC",
// "-XX:+ZGenerational",
// "-verbose:gc",
"-verbose:gc",
"-XX:+HeapDumpOnOutOfMemoryError",
//"-XX:HeapDumpPath=heapdump.hprof",
"-XX:+UseStringDeduplication",
Expand All @@ -285,7 +287,7 @@ subprojects {
/* "-XX:MaxInlineSize=500" */])

minHeapSize = '5g'
maxHeapSize = '8g'
maxHeapSize = '12g'
}
}

Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
5 changes: 4 additions & 1 deletion bundles/sirix-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ dependencies {
implementation implLibraries.snappyJava
implementation implLibraries.browniesCollections
implementation implLibraries.integercompression
implementation implLibraries.chronicleBytes
implementation implLibraries.fastObjectPool
implementation implLibraries.zeroAllocationHashing

Expand Down Expand Up @@ -54,4 +53,8 @@ jar {

test {
useJUnitPlatform()
jvmArgs = [
'--add-opens', 'java.base/sun.nio.ch=ALL-UNNAMED',
'--add-opens', 'java.base/java.nio=ALL-UNNAMED'
]
}
253 changes: 0 additions & 253 deletions bundles/sirix-core/g1-chicago.log

This file was deleted.

38,662 changes: 0 additions & 38,662 deletions bundles/sirix-core/g1-detailed.log

This file was deleted.

13,733 changes: 0 additions & 13,733 deletions bundles/sirix-core/shenandoah.log

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@ public static int compareStructure(final Path file) {
*/
private DatabaseType databaseType;

/**
* Maximum buffer size for memory segment allocation.
* Default is 1GB.
*/
private long maxSegmentAllocationSize = 1L << 30; // 1GB default

/**
* Constructor with the path to be set.
*
Expand Down Expand Up @@ -180,6 +186,28 @@ public DatabaseType getDatabaseType() {
return databaseType;
}

/**
* Set the maximum buffer size for memory segment allocation.
*
* @param size maximum buffer size in bytes
* @return this {@link DatabaseConfiguration} instance
*/
public DatabaseConfiguration setMaxSegmentAllocationSize(final long size) {
checkArgument(size > 0, "Max buffer size must be positive");
this.maxSegmentAllocationSize = size;
return this;
}

/**
* Get the maximum buffer size for memory segment allocation.
*
* @return maximum buffer size in bytes
*/
public long getMaxSegmentAllocationSize() {
return maxSegmentAllocationSize;
}


/**
* Set unique maximum resource ID.
*
Expand Down Expand Up @@ -260,6 +288,7 @@ public static void serialize(final DatabaseConfiguration config) throws SirixIOE
jsonWriter.name("file").value(filePath);
jsonWriter.name("ID").value(config.maxResourceID);
jsonWriter.name("databaseType").value(config.databaseType.toString());
jsonWriter.name("maxSegmentAllocationSize").value(config.maxSegmentAllocationSize);
jsonWriter.endObject();
} catch (final IOException e) {
throw new SirixIOException(e);
Expand Down Expand Up @@ -287,10 +316,13 @@ public static DatabaseConfiguration deserialize(final Path file) {
final String databaseType = jsonReader.nextName();
assert databaseType.equals("databaseType");
final String type = jsonReader.nextString();
final String maxSegmentAllocationSizeName = jsonReader.nextName();
assert maxSegmentAllocationSizeName.equals("maxSegmentAllocationSize");
final long maxSegmentAllocationSize = jsonReader.nextLong();
jsonReader.endObject();
final DatabaseType dbType = DatabaseType.fromString(type)
.orElseThrow(() -> new IllegalStateException("Type can not be unknown."));
return new DatabaseConfiguration(dbFile).setMaximumResourceID(ID).setDatabaseType(dbType);
return new DatabaseConfiguration(dbFile).setMaximumResourceID(ID).setDatabaseType(dbType).setMaxSegmentAllocationSize(maxSegmentAllocationSize);
} catch (final IOException e) {
throw new SirixIOException(e);
}
Expand Down
37 changes: 35 additions & 2 deletions bundles/sirix-core/src/main/java/io/sirix/access/Databases.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
import io.sirix.api.*;
import io.sirix.api.json.JsonResourceSession;
import io.sirix.api.xml.XmlResourceSession;
import io.sirix.cache.BufferManager;
import io.sirix.cache.*;
import io.sirix.exception.SirixIOException;
import io.sirix.exception.SirixUsageException;
import io.sirix.utils.LogWrapper;
import io.sirix.utils.OS;
import io.sirix.utils.SirixFiles;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -40,7 +41,8 @@ private Databases() {
/**
* Buffer managers / page cache for each resource.
*/
private static final ConcurrentMap<Path, ConcurrentMap<Path, BufferManager>> BUFFER_MANAGERS = new ConcurrentHashMap<>();
private static final ConcurrentMap<Path, ConcurrentMap<Path, BufferManager>> BUFFER_MANAGERS =
new ConcurrentHashMap<>();

/**
* DI component that manages the database.
Expand Down Expand Up @@ -82,6 +84,10 @@ public static synchronized boolean createJsonDatabase(final DatabaseConfiguratio
}

private static boolean createTheDatabase(final DatabaseConfiguration dbConfig) {
requireNonNull(dbConfig);

initAllocator(dbConfig.getMaxSegmentAllocationSize());

boolean returnVal = true;
// if file is existing, skipping
final var databaseFile = dbConfig.getDatabaseFile();
Expand Down Expand Up @@ -158,6 +164,22 @@ public static synchronized void removeDatabase(final Path dbFile) {
bufferManagers.values().forEach(BufferManager::clearAllCaches);
}
SirixFiles.recursiveRemove(dbFile);

freeAllocatedMemory();
} else {
logger.warn("Database at {} could not be removed, because it is either not existing or still in use.", dbFile);
}
}

public static void freeAllocatedMemory() {
if (MANAGER.sessions().isEmpty()) {
// // If no sessions are left, we can clean up the allocator.
// MemorySegmentAllocator segmentAllocator =
// OS.isWindows() ? WindowsMemorySegmentAllocator.getInstance() : LinuxMemorySegmentAllocator.getInstance();
// segmentAllocator.free();
KeyValueLeafPagePool.getInstance().free();
BUFFER_MANAGERS.values()
.forEach((resourcePathsToBufferManagers -> resourcePathsToBufferManagers.forEach((_, bufferManager) -> bufferManager.clearAllCaches())));
}
}

Expand Down Expand Up @@ -257,9 +279,20 @@ private static <M extends ResourceSession<R, W>, R extends NodeReadOnlyTrx & Nod
if (dbConfig == null) {
throw new IllegalStateException("Configuration may not be null!");
}

initAllocator(dbConfig.getMaxSegmentAllocationSize());
return databaseType.createDatabase(dbConfig, user);
}

private static void initAllocator(long maxSegmentAllocationSize) {
if (MANAGER.sessions().isEmpty()) {
KeyValueLeafPagePool.getInstance().init(maxSegmentAllocationSize);
// MemorySegmentAllocator segmentAllocator =
// OS.isWindows() ? WindowsMemorySegmentAllocator.getInstance() : LinuxMemorySegmentAllocator.getInstance();
// segmentAllocator.init(maxSegmentAllocationSize);
}
}

/**
* Determines if a database already exists.
*
Expand Down
23 changes: 13 additions & 10 deletions bundles/sirix-core/src/main/java/io/sirix/access/LocalDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public final class LocalDatabase<T extends ResourceSession<? extends NodeReadOnl
*/
private final ResourceStore<T> resourceStore;

private final PathBasedPool<ResourceSession<?, ?>> resourceManagers;
private final PathBasedPool<ResourceSession<?, ?>> resourceSessions;

/**
* This field should be use to fetch the locks for resource managers.
Expand All @@ -102,24 +102,24 @@ public final class LocalDatabase<T extends ResourceSession<? extends NodeReadOnl
* @param sessions The database sessions management instance.
* @param resourceStore The resource store used by this database.
* @param writeLocks Manages the locks for resource managers.
* @param resourceManagers The pool for resource managers.
* @param resourceSessions The pool for resource managers.
*/
public LocalDatabase(final TransactionManager transactionManager, final DatabaseConfiguration dbConfig,
final PathBasedPool<Database<?>> sessions, final ResourceStore<T> resourceStore,
final WriteLocksRegistry writeLocks, final PathBasedPool<ResourceSession<?, ?>> resourceManagers) {
final WriteLocksRegistry writeLocks, final PathBasedPool<ResourceSession<?, ?>> resourceSessions) {
this.transactionManager = transactionManager;
this.dbConfig = requireNonNull(dbConfig);
this.sessions = sessions;
this.resourceStore = resourceStore;
this.resourceManagers = resourceManagers;
this.resourceSessions = resourceSessions;
this.writeLocks = writeLocks;
this.resourceIDsToResourceNames = Maps.synchronizedBiMap(HashBiMap.create());
this.sessions.putObject(dbConfig.getDatabaseFile(), this);
this.bufferManagers = Databases.getBufferManager(dbConfig.getDatabaseFile());
}

private void addResourceToBufferManagerMapping(Path resourceFile, ResourceConfiguration resourceConfig) {
bufferManagers.put(resourceFile, new BufferManagerImpl(10_000, 1_000, 5_000, 50_000, 500, 20));
private void addResourceToBufferManagerMapping(Path resourceFile) {
bufferManagers.put(resourceFile, new BufferManagerImpl(500_000, 65_536 * 100, 5_000, 50_000, 500, 20));
}

@Override
Expand Down Expand Up @@ -148,7 +148,7 @@ private void addResourceToBufferManagerMapping(Path resourceFile, ResourceConfig

// Add resource to buffer manager mapping.
if (!bufferManagers.containsKey(resourcePath)) {
addResourceToBufferManagerMapping(resourcePath, resourceConfig);
addResourceToBufferManagerMapping(resourcePath);
}

return resourceStore.beginResourceSession(resourceConfig, bufferManagers.get(resourcePath), resourcePath);
Expand Down Expand Up @@ -220,7 +220,7 @@ public synchronized boolean createResource(final ResourceConfiguration resourceC
}

if (!bufferManagers.containsKey(path)) {
addResourceToBufferManagerMapping(path, resourceConfig);
addResourceToBufferManagerMapping(path);
}

return returnVal;
Expand Down Expand Up @@ -269,8 +269,8 @@ public synchronized Database<T> removeResource(final String name) {
dbConfig.getDatabaseFile().resolve(DatabaseConfiguration.DatabasePaths.DATA.getFile()).resolve(name);

// Check that no running resource managers / sessions are opened.
if (this.resourceManagers.containsAnyEntry(resourceFile)) {
throw new IllegalStateException("Open resource managers found, must be closed first: " + resourceManagers);
if (this.resourceSessions.containsAnyEntry(resourceFile)) {
throw new IllegalStateException("Open resource managers found, must be closed first: " + resourceSessions);
}

// If file is existing and folder is a Sirix-dataplace, delete it.
Expand Down Expand Up @@ -362,6 +362,9 @@ public synchronized void close() {
// Remove from database mapping.
this.sessions.removeObject(dbConfig.getDatabaseFile(), this);

// Free all allocated memory if it's the last database which is closed.
Databases.freeAllocatedMemory();

// Remove lock file.
SirixFiles.recursiveRemove(dbConfig.getDatabaseFile().resolve(DatabaseConfiguration.DatabasePaths.LOCK.getFile()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import static java.util.Collections.unmodifiableMap;

Expand All @@ -29,7 +30,7 @@ public class PathBasedPool<E> {
/**
* The thread safe map of objects in the pool.
*/
private final Map<Path, Set<E>> sessions;
private final ConcurrentMap<Path, Set<E>> sessions;

/**
* Default Constructor
Expand Down Expand Up @@ -58,6 +59,15 @@ public boolean containsAnyEntry(final Path file) {
return this.sessions.containsKey(file);
}

/**
* Checks if the pool is empty.
*
* @return {@code true} if the pool is empty, {@code false} otherwise.
*/
public boolean isEmpty() {
return this.sessions.isEmpty();
}

/**
* Package private method to remove a database.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,19 @@
import com.google.common.base.MoreObjects;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import io.sirix.access.trx.node.HashType;
import io.sirix.node.NodeSerializerImpl;
import io.sirix.node.interfaces.RecordSerializer;
import net.openhft.hashing.LongHashFunction;
import org.checkerframework.checker.index.qual.NonNegative;
import io.sirix.BinaryEncodingVersion;
import io.sirix.access.trx.node.HashType;
import io.sirix.exception.SirixIOException;
import io.sirix.io.StorageType;
import io.sirix.io.bytepipe.ByteHandler;
import io.sirix.io.bytepipe.ByteHandlerKind;
import io.sirix.io.bytepipe.ByteHandlerPipeline;
import io.sirix.io.bytepipe.LZ4Compressor;
import io.sirix.node.NodeSerializerImpl;
import io.sirix.node.interfaces.RecordSerializer;
import io.sirix.settings.VersioningType;
import io.sirix.utils.OS;
import net.openhft.hashing.LongHashFunction;
import org.checkerframework.checker.index.qual.NonNegative;

import java.io.FileReader;
import java.io.FileWriter;
Expand Down Expand Up @@ -169,8 +168,8 @@ public static int compareStructure(final Path file) {
/**
* Standard storage.
*/
private static final StorageType STORAGE =
OS.isWindows() ? StorageType.FILE_CHANNEL : OS.is64Bit() ? StorageType.MEMORY_MAPPED : StorageType.FILE_CHANNEL;
private static final StorageType STORAGE = StorageType.FILE_CHANNEL;
//OS.isWindows() ? StorageType.FILE_CHANNEL : OS.is64Bit() ? StorageType.MEMORY_MAPPED : StorageType.FILE_CHANNEL;

/**
* Standard versioning approach.
Expand Down Expand Up @@ -709,7 +708,7 @@ public static final class Builder {
/**
* Determines if node history should be stored or not.
*/
private boolean storeNodeHistory;
private boolean storeNodeHistory = true;

private BinaryEncodingVersion binaryEncodingVersion = BINARY_ENCODING_VERSION;

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

@Override
public void close() {
resourceSessions.forEach((resourceName, resourceMgr) -> resourceMgr.close());
resourceSessions.forEach((_, resourceSession) -> resourceSession.close());
resourceSessions.clear();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,15 @@
import io.sirix.api.PageTrx;
import io.sirix.exception.SirixIOException;
import io.sirix.index.IndexType;
import io.sirix.node.Bytes;
import io.sirix.node.BytesOut;
import io.sirix.node.NodeKind;
import io.sirix.node.interfaces.Node;
import io.sirix.node.interfaces.StructNode;
import io.sirix.node.interfaces.immutable.ImmutableNode;
import io.sirix.node.xml.ElementNode;
import net.openhft.chronicle.bytes.Bytes;
import org.checkerframework.checker.index.qual.NonNegative;

import java.nio.ByteBuffer;

public abstract class AbstractNodeHashing<N extends ImmutableNode, T extends NodeCursor & NodeReadOnlyTrx> {

/**
Expand Down Expand Up @@ -45,7 +44,7 @@ public abstract class AbstractNodeHashing<N extends ImmutableNode, T extends Nod

private boolean autoCommit;

private final Bytes<ByteBuffer> bytes = Bytes.elasticHeapByteBuffer();
private final BytesOut<?> bytes = Bytes.elasticHeapByteBuffer();

/**
* Constructor.
Expand Down
Loading
Loading