Skip to content

Commit 7aaffd1

Browse files
committed
GH-5017 improve performance of Changeset and reduce memory load of LinkedHashModel
1 parent 9c8fae2 commit 7aaffd1

2 files changed

Lines changed: 24 additions & 4 deletions

File tree

core/model/src/main/java/org/eclipse/rdf4j/model/impl/LinkedHashModel.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -341,13 +341,13 @@ private static class ModelNode<V extends Value> implements Serializable {
341341

342342
private static final long serialVersionUID = -1205676084606998540L;
343343

344-
Set<ModelStatement> subjects = new LinkedHashSet<>();
344+
Set<ModelStatement> subjects = new LinkedHashSet<>(1);
345345

346-
Set<ModelStatement> predicates = new LinkedHashSet<>();
346+
Set<ModelStatement> predicates = new LinkedHashSet<>(1);
347347

348-
Set<ModelStatement> objects = new LinkedHashSet<>();
348+
Set<ModelStatement> objects = new LinkedHashSet<>(1);
349349

350-
Set<ModelStatement> contexts = new LinkedHashSet<>();
350+
Set<ModelStatement> contexts = new LinkedHashSet<>(1);
351351

352352
private final V value;
353353

core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/Changeset.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.Arrays;
1616
import java.util.Collection;
1717
import java.util.Collections;
18+
import java.util.ConcurrentModificationException;
1819
import java.util.HashMap;
1920
import java.util.HashSet;
2021
import java.util.IdentityHashMap;
@@ -806,6 +807,25 @@ Iterable<Triple> getApprovedTriples(Resource subj, IRI pred, Value obj) {
806807

807808
void removeApproved(Statement next) {
808809
assert !closed;
810+
811+
try {
812+
Model localApproved = approved;
813+
if (localApproved != null && !readWriteLock.writeLock.isWriteLocked() && !localApproved.contains(next)) {
814+
boolean readLock = readWriteLock.readLock();
815+
try {
816+
if (approved != null && !approvedEmpty) {
817+
if (!approved.contains(next)) {
818+
return;
819+
}
820+
}
821+
} finally {
822+
readWriteLock.unlockReader(readLock);
823+
}
824+
}
825+
826+
} catch (ConcurrentModificationException ignored) {
827+
}
828+
809829
long writeLock = readWriteLock.writeLock();
810830
try {
811831
if (approved != null) {

0 commit comments

Comments
 (0)