Skip to content

Commit 5d49a46

Browse files
JohannesLichtenbergerJohannes Lichtenberger
and
Johannes Lichtenberger
authored
Fix GC issue (#607)
* Fix GC issue * Disable tests and delete everything during setup * Fix bug regarding concurrent/parallel access. * Update build.gradle --------- Co-authored-by: Johannes Lichtenberger <[email protected]>
1 parent 0049706 commit 5d49a46

13 files changed

+64
-45
lines changed

bundles/sirix-core/src/main/java/org/sirix/access/LocalDatabase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ public LocalDatabase(final TransactionManager transactionManager, final Database
119119

120120
private void addResourceToBufferManagerMapping(Path resourceFile, ResourceConfiguration resourceConfig) {
121121
if (resourceConfig.getStorageType() == StorageType.MEMORY_MAPPED) {
122-
bufferManagers.put(resourceFile, new BufferManagerImpl(100, 10_000_000, 100_000, 50_000_000, 1_000, 20));
122+
bufferManagers.put(resourceFile, new BufferManagerImpl(100, 1_000, 5_000, 50_000, 500, 20));
123123
} else {
124-
bufferManagers.put(resourceFile, new BufferManagerImpl(50_000, 10_000_000, 100_000, 50_000_000, 1_000, 20));
124+
bufferManagers.put(resourceFile, new BufferManagerImpl(500, 1_000, 5_000, 50_000, 500, 20));
125125
}
126126
}
127127

bundles/sirix-core/src/main/java/org/sirix/access/trx/page/NodePageReadOnlyTrx.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ void assertNotClosed() {
245245
}
246246
}
247247

248-
@SuppressWarnings("unchecked")
249248
@Override
250249
public <V extends DataRecord> V getRecord(final long recordKey, @NonNull final IndexType indexType,
251250
@NonNegative final int index) {
@@ -571,7 +570,6 @@ PageReference getLeafPageReference(final PageReference pageReferenceToSubtree, f
571570
* @return dereferenced pages
572571
* @throws SirixIOException if an I/O-error occurs within the creation process
573572
*/
574-
@SuppressWarnings("unchecked")
575573
List<KeyValuePage<DataRecord>> getPageFragments(final PageReference pageReference) {
576574
assert pageReference != null;
577575
final ResourceConfiguration config = resourceSession.getResourceConfig();
@@ -618,7 +616,6 @@ private List<KeyValuePage<DataRecord>> getPreviousPageFragments(final List<PageF
618616
.collect(Collectors.toList());
619617
}
620618

621-
@SuppressWarnings("unchecked")
622619
private CompletableFuture<KeyValuePage<DataRecord>> readPage(final PageFragmentKey pageFragmentKey) {
623620
final var pageReference = new PageReference().setKey(pageFragmentKey.key());
624621
if (trxIntentLog == null) {
@@ -629,7 +626,6 @@ private CompletableFuture<KeyValuePage<DataRecord>> readPage(final PageFragmentK
629626
}
630627
}
631628
final var pageReadOnlyTrx = resourceSession.beginPageReadOnlyTrx(pageFragmentKey.revision());
632-
//noinspection unchecked
633629
return (CompletableFuture<KeyValuePage<DataRecord>>) pageReadOnlyTrx.getReader()
634630
.readAsync(pageReference, pageReadOnlyTrx)
635631
.whenComplete((page, exception) -> {

bundles/sirix-core/src/main/java/org/sirix/access/trx/page/NodePageTrx.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,6 @@ public <V extends DataRecord> V getRecord(final long recordKey, @NonNull final I
313313
if (node == null) {
314314
node = pageRtx.getValue(((KeyValueLeafPage) pageCont.getComplete()), recordKey);
315315
}
316-
//noinspection unchecked
317316
return (V) pageRtx.checkItemIfDeleted(node);
318317
}
319318
}

bundles/sirix-core/src/main/java/org/sirix/cache/Cache.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
package org.sirix.cache;
2323

24+
import com.github.benmanes.caffeine.cache.Scheduler;
2425
import org.checkerframework.checker.nullness.qual.NonNull;
2526

2627
import java.util.Map;
@@ -37,6 +38,8 @@
3738
* @param <V> the value
3839
*/
3940
public interface Cache<K, V> {
41+
Scheduler scheduler = Scheduler.systemScheduler();
42+
4043
/**
4144
* Clearing the cache. That is removing all elements.
4245
*/

bundles/sirix-core/src/main/java/org/sirix/cache/IndexLogKey.java

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
* @author Johannes Lichtenberger
1010
*/
1111
public final class IndexLogKey {
12-
private final IndexType indexType;
13-
private final long recordPageKey;
14-
private final @NonNegative int indexNumber;
15-
private final @NonNegative int revisionNumber;
12+
private IndexType indexType;
13+
private long recordPageKey;
14+
private @NonNegative int indexNumber;
15+
private @NonNegative int revisionNumber;
1616

1717
public IndexLogKey(IndexType indexType, long recordPageKey, @NonNegative int indexNumber,
1818
@NonNegative int revisionNumber) {
@@ -22,6 +22,26 @@ public IndexLogKey(IndexType indexType, long recordPageKey, @NonNegative int ind
2222
this.revisionNumber = revisionNumber;
2323
}
2424

25+
public IndexLogKey setIndexType(IndexType indexType) {
26+
this.indexType = indexType;
27+
return this;
28+
}
29+
30+
public IndexLogKey setRecordPageKey(long recordPageKey) {
31+
this.recordPageKey = recordPageKey;
32+
return this;
33+
}
34+
35+
public IndexLogKey setIndexNumber(int indexNumber) {
36+
this.indexNumber = indexNumber;
37+
return this;
38+
}
39+
40+
public IndexLogKey setRevisionNumber(int revisionNumber) {
41+
this.revisionNumber = revisionNumber;
42+
return this;
43+
}
44+
2545
private int hash;
2646

2747
@Override
@@ -48,22 +68,6 @@ public int getRevisionNumber() {
4868
return revisionNumber;
4969
}
5070

51-
public IndexType indexType() {
52-
return indexType;
53-
}
54-
55-
public long recordPageKey() {
56-
return recordPageKey;
57-
}
58-
59-
public @NonNegative int indexNumber() {
60-
return indexNumber;
61-
}
62-
63-
public @NonNegative int revisionNumber() {
64-
return revisionNumber;
65-
}
66-
6771
@Override
6872
public boolean equals(Object obj) {
6973
if (obj == this)

bundles/sirix-core/src/main/java/org/sirix/cache/NamesCache.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66
import java.util.Map;
77
import java.util.concurrent.TimeUnit;
88

9-
public class NamesCache implements Cache<NamesCacheKey, Names> {
9+
public final class NamesCache implements Cache<NamesCacheKey, Names> {
1010

1111
private final com.github.benmanes.caffeine.cache.Cache<NamesCacheKey, Names> cache;
1212

1313
public NamesCache(final int maxSize) {
1414
cache = Caffeine.newBuilder()
1515
.maximumSize(maxSize)
16+
.expireAfterAccess(5, TimeUnit.MINUTES)
17+
.scheduler(scheduler)
1618
.build();
1719
}
1820

bundles/sirix-core/src/main/java/org/sirix/cache/PageCache.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,24 @@
77
import org.sirix.page.interfaces.Page;
88

99
import java.util.Map;
10+
import java.util.concurrent.TimeUnit;
1011

1112
public final class PageCache implements Cache<PageReference, Page> {
1213

1314
private final com.github.benmanes.caffeine.cache.Cache<PageReference, Page> pageCache;
1415

1516
public PageCache(final int maxSize) {
16-
RemovalListener<PageReference, Page> removalListener =
17-
(PageReference key, Page value, RemovalCause cause) -> key.setPage(null);
17+
RemovalListener<PageReference, Page> removalListener = (PageReference key, Page value, RemovalCause cause) -> {
18+
key.setPage(null);
19+
// if (value instanceof KeyValueLeafPage keyValueLeafPage) {
20+
// keyValueLeafPage.clearPage();
21+
// }
22+
};
1823

1924
pageCache = Caffeine.newBuilder()
2025
.maximumSize(maxSize)
26+
.expireAfterAccess(5, TimeUnit.MINUTES)
27+
.scheduler(scheduler)
2128
.removalListener(removalListener)
2229
.build();
2330
}
@@ -58,5 +65,6 @@ public void remove(PageReference key) {
5865
}
5966

6067
@Override
61-
public void close() {}
68+
public void close() {
69+
}
6270
}

bundles/sirix-core/src/main/java/org/sirix/cache/PathSummaryCache.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.github.benmanes.caffeine.cache.Caffeine;
44

55
import java.util.Map;
6+
import java.util.concurrent.TimeUnit;
67

78
public class PathSummaryCache implements Cache<Integer, PathSummaryData> {
89

@@ -11,6 +12,7 @@ public class PathSummaryCache implements Cache<Integer, PathSummaryData> {
1112
public PathSummaryCache(final int maxSize) {
1213
cache = Caffeine.newBuilder()
1314
.maximumSize(maxSize)
15+
.expireAfterAccess(5, TimeUnit.MINUTES)
1416
.build();
1517
}
1618

bundles/sirix-core/src/main/java/org/sirix/cache/RecordPageCache.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,18 @@ public final class RecordPageCache implements Cache<PageReference, Page> {
1515
private final com.github.benmanes.caffeine.cache.Cache<PageReference, Page> pageCache;
1616

1717
public RecordPageCache(final int maxSize) {
18-
final RemovalListener<PageReference, Page> removalListener = (PageReference key, Page value, RemovalCause cause) -> {
19-
assert key != null;
20-
key.setPage(null);
21-
};
18+
final RemovalListener<PageReference, Page> removalListener =
19+
(PageReference key, Page value, RemovalCause cause) -> {
20+
key.setPage(null);
21+
// if (value instanceof KeyValueLeafPage keyValueLeafPage) {
22+
// keyValueLeafPage.clearPage();
23+
// }
24+
};
2225

2326
pageCache = Caffeine.newBuilder()
2427
.maximumSize(maxSize)
25-
.expireAfterWrite(15, TimeUnit.SECONDS)
26-
.expireAfterAccess(15, TimeUnit.SECONDS)
28+
.expireAfterAccess(5, TimeUnit.MINUTES)
29+
.scheduler(scheduler)
2730
.removalListener(removalListener)
2831
.build();
2932
}

bundles/sirix-core/src/main/java/org/sirix/cache/RedBlackTreeNodeCache.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public RedBlackTreeNodeCache(final int maxSize) {
2828
}
2929
};
3030

31-
cache = Caffeine.newBuilder().maximumSize(maxSize).removalListener(removalListener).build();
31+
cache = Caffeine.newBuilder().maximumSize(maxSize).removalListener(removalListener).scheduler(scheduler).build();
3232
}
3333

3434
@Override

bundles/sirix-core/src/main/java/org/sirix/cache/RevisionRootPageCache.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727
*/
2828
package org.sirix.cache;
2929

30+
import com.github.benmanes.caffeine.cache.Caffeine;
31+
import org.sirix.page.RevisionRootPage;
32+
3033
import java.util.Map;
3134
import java.util.concurrent.TimeUnit;
32-
import org.sirix.page.RevisionRootPage;
33-
import com.github.benmanes.caffeine.cache.Caffeine;
3435

3536
/**
3637
* @author Johannes Lichtenberger <a href="mailto:[email protected]">mail</a>
@@ -42,8 +43,8 @@ public final class RevisionRootPageCache implements Cache<Integer, RevisionRootP
4243
public RevisionRootPageCache(final int maxSize) {
4344
pageCache = Caffeine.newBuilder()
4445
.maximumSize(maxSize)
45-
.expireAfterWrite(30, TimeUnit.SECONDS)
46-
.expireAfterAccess(30, TimeUnit.SECONDS)
46+
.expireAfterAccess(5, TimeUnit.MINUTES)
47+
.scheduler(scheduler)
4748
.build();
4849
}
4950

@@ -83,5 +84,6 @@ public void remove(Integer key) {
8384
}
8485

8586
@Override
86-
public void close() {}
87+
public void close() {
88+
}
8789
}

bundles/sirix-core/src/main/java/org/sirix/page/PageReference.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
public final class PageReference {
4242

4343
/** In-memory deserialized page instance. */
44-
private Page page;
44+
private volatile Page page;
4545

4646
/** Key in persistent storage. */
4747
private long key = Constants.NULL_ID_LONG;

libraries.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ implLibraries = [
1818
guavaTestlib : 'com.google.guava:guava-testlib:31.0.1-jre',
1919
checkerFramework : 'org.checkerframework:checker:3.21.2',
2020
brackit : 'io.sirix:brackit:0.3-SNAPSHOT',
21-
caffeine : 'com.github.ben-manes.caffeine:caffeine:2.8.1',
21+
caffeine : 'com.github.ben-manes.caffeine:caffeine:3.1.6',
2222
snappyJava : 'org.xerial.snappy:snappy-java:1.1.8.4',
2323
lz4 : 'org.lz4:lz4-java:1.8.0',
2424
browniesCollections : 'org.magicwerk:brownies-collections:0.9.14',

0 commit comments

Comments
 (0)