You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/12/02 23:17:09 UTC
svn commit: r1547211 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java
Author: jukka
Date: Mon Dec 2 22:17:08 2013
New Revision: 1547211
URL: http://svn.apache.org/r1547211
Log:
OAK-593: Segment-based MK
Avoid extra notifyAll() calls when nobody is waiting
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java?rev=1547211&r1=1547210&r2=1547211&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java Mon Dec 2 22:17:08 2013
@@ -18,7 +18,6 @@ package org.apache.jackrabbit.oak.plugin
import static com.google.common.collect.Sets.newHashSet;
import static org.apache.jackrabbit.oak.plugins.segment.SegmentIdFactory.isBulkSegmentId;
-import static org.apache.jackrabbit.oak.plugins.segment.SegmentIdFactory.isDataSegmentId;
import java.util.Set;
import java.util.UUID;
@@ -41,6 +40,12 @@ public abstract class AbstractStore impl
*/
private final Set<UUID> currentlyLoading = newHashSet();
+ /**
+ * Number of threads that are currently waiting for segments to be loaded.
+ * Used to avoid extra {@link #notifyAll()} calls when nobody is waiting.
+ */
+ private int currentlyWaiting = 0;
+
private final Cache<RecordId, Object> records =
CacheLIRS.newBuilder().maximumSize(1000).build();
@@ -87,9 +92,12 @@ public abstract class AbstractStore impl
// ... or currently being loaded
while (segment == null && currentlyLoading.contains(id)) {
try {
+ currentlyWaiting++;
wait(); // for another thread to load the segment
} catch (InterruptedException e) {
throw new RuntimeException("Interrupted", e);
+ } finally {
+ currentlyWaiting--;
}
segment = segments.getIfPresent(id);
}
@@ -108,7 +116,9 @@ public abstract class AbstractStore impl
} finally {
synchronized (this) {
currentlyLoading.remove(id);
- notifyAll();
+ if (currentlyWaiting > 0) {
+ notifyAll();
+ }
}
}
}