summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian S. O'Neill <bronee@gmail.com>2012-01-26 02:53:21 +0000
committerBrian S. O'Neill <bronee@gmail.com>2012-01-26 02:53:21 +0000
commitbf9c0e6ce8568d0e37ea1d2947aba141ae4c7fe4 (patch)
tree26b07a042caf2812c2e352286871d192d57ec625
parente640c47ae16d9d375010a18facd8a5bf4bd5c83e (diff)
Added option for index access to fetch ahead to reduce likelihood of deadlocks.
-rw-r--r--src/main/java/com/amazon/carbonado/cursor/FetchAheadCursor.java73
-rw-r--r--src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java14
2 files changed, 86 insertions, 1 deletions
diff --git a/src/main/java/com/amazon/carbonado/cursor/FetchAheadCursor.java b/src/main/java/com/amazon/carbonado/cursor/FetchAheadCursor.java
new file mode 100644
index 0000000..743364d
--- /dev/null
+++ b/src/main/java/com/amazon/carbonado/cursor/FetchAheadCursor.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012 Amazon Technologies, Inc. or its affiliates.
+ * Amazon, Amazon.com and Carbonado are trademarks or registered trademarks
+ * of Amazon Technologies, Inc. or its affiliates. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.amazon.carbonado.cursor;
+
+import java.util.ArrayDeque;
+import java.util.NoSuchElementException;
+import java.util.Queue;
+
+import com.amazon.carbonado.Cursor;
+import com.amazon.carbonado.FetchException;
+
+/**
+ * Cursor implementation which fetches records in advance, in order to release locks.
+ *
+ * @author Brian S O'Neill
+ */
+public class FetchAheadCursor<S> extends AbstractCursor<S> {
+ private final Cursor<S> mSource;
+ private final int mFetchAhead;
+ private final Queue<Object> mQueue;
+
+ /**
+ * @param fetchAhead how much to fetch ahead from source
+ */
+ public FetchAheadCursor(Cursor<S> source, int fetchAhead) {
+ mSource = source;
+ mFetchAhead = fetchAhead;
+ mQueue = new ArrayDeque<Object>(fetchAhead + 1);
+ }
+
+ public void close() throws FetchException {
+ mQueue.clear();
+ mSource.close();
+ }
+
+ public boolean hasNext() throws FetchException {
+ while (mQueue.size() <= mFetchAhead && mSource.hasNext()) {
+ try {
+ mQueue.add(mSource.next());
+ } catch (FetchException e) {
+ mQueue.add(e);
+ }
+ }
+ return !mQueue.isEmpty();
+ }
+
+ public S next() throws FetchException {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
+ }
+ Object next = mQueue.remove();
+ if (next instanceof FetchException) {
+ throw (FetchException) next;
+ }
+ return (S) next;
+ }
+}
diff --git a/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java b/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java
index bce6975..04eb478 100644
--- a/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java
+++ b/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java
@@ -32,6 +32,7 @@ import com.amazon.carbonado.Storage;
import com.amazon.carbonado.Transaction;
import com.amazon.carbonado.cursor.AbstractCursor;
+import com.amazon.carbonado.cursor.FetchAheadCursor;
import com.amazon.carbonado.spi.RepairExecutor;
@@ -44,6 +45,13 @@ import com.amazon.carbonado.synthetic.SyntheticStorableReferenceAccess;
* @author Brian S O'Neill
*/
class IndexedCursor<S extends Storable> extends AbstractCursor<S> {
+ private static final int FETCH_AHEAD;
+
+ static {
+ String prefix = IndexedCursor.class.getName() + '.';
+ FETCH_AHEAD = Integer.getInteger(prefix + "fetchAhead", 0);
+ }
+
private final Cursor<? extends Storable> mCursor;
private final IndexedStorage<S> mStorage;
private final SyntheticStorableReferenceAccess<S> mAccessor;
@@ -52,7 +60,11 @@ class IndexedCursor<S extends Storable> extends AbstractCursor<S> {
IndexedCursor(Cursor<? extends Storable> indexEntryCursor,
IndexedStorage<S> storage,
- SyntheticStorableReferenceAccess<S> indexAccessor) {
+ SyntheticStorableReferenceAccess<S> indexAccessor)
+ {
+ if (FETCH_AHEAD > 0) {
+ indexEntryCursor = new FetchAheadCursor(indexEntryCursor, FETCH_AHEAD);
+ }
mCursor = indexEntryCursor;
mStorage = storage;
mAccessor = indexAccessor;