You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by wi...@apache.org on 2016/05/02 11:49:56 UTC
[19/50] [abbrv] marmotta git commit: MARMOTTA-620: Merged patch from
@marktriggs on github, closes PR #15
MARMOTTA-620: Merged patch from @marktriggs on github, closes PR #15
Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/83be62b4
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/83be62b4
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/83be62b4
Branch: refs/heads/MARMOTTA-584
Commit: 83be62b495ce73e49313c97ebc4dfd3ac7881a26
Parents: ea28ddb
Author: Sergio Fern�ndez <wi...@apache.org>
Authored: Tue Feb 2 10:27:53 2016 +0100
Committer: Sergio Fern�ndez <wi...@apache.org>
Committed: Tue Feb 2 10:27:53 2016 +0100
----------------------------------------------------------------------
.../marmotta/kiwi/sail/KiWiValueFactory.java | 28 ++++++++++++++++----
1 file changed, 23 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/marmotta/blob/83be62b4/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/sail/KiWiValueFactory.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/sail/KiWiValueFactory.java b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/sail/KiWiValueFactory.java
index 42dd4ed..3a717a2 100644
--- a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/sail/KiWiValueFactory.java
+++ b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/sail/KiWiValueFactory.java
@@ -565,6 +565,8 @@ public class KiWiValueFactory implements ValueFactory {
KiWiTriple result = new KiWiTriple(ksubject,kpredicate,kobject,kcontext);
+ boolean needsDBLookup = false;
+
synchronized (registry) {
long tripleId = registry.lookupKey(cacheKey);
@@ -575,13 +577,29 @@ public class KiWiValueFactory implements ValueFactory {
registry.registerKey(cacheKey, connection.getTransactionId(), result.getId());
} else {
// not found in registry, try loading from database
- result.setId(connection.getTripleId(ksubject,kpredicate,kobject,kcontext));
+ needsDBLookup = true;
}
+ }
+
+ if(needsDBLookup) {
+ result.setId(connection.getTripleId(ksubject,kpredicate,kobject,kcontext));
+ }
- // triple has no id from registry or database, so we create one and flag it for reasoning
- if(result.getId() < 0) {
- result.setId(connection.getNextSequence());
- result.setNewTriple(true);
+ // triple has no id from registry or database, so we create one and flag it for reasoning
+ if(result.getId() < 0) {
+ synchronized (registry) {
+ // It's possible a concurrent thread might have created this
+ // triple while we were blocked. Check the registry again.
+ long tripleId = registry.lookupKey(cacheKey);
+
+ if(tripleId >= 0) {
+ // A concurrent thread got in first. Take the one it created.
+ result.setId(tripleId);
+ } else {
+ // Create the new triple
+ result.setId(connection.getNextSequence());
+ result.setNewTriple(true);
+ }
registry.registerKey(cacheKey, connection.getTransactionId(), result.getId());
}