summaryrefslogtreecommitdiff
path: root/src/main/java/com/amazon/carbonado/layout/Layout.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/amazon/carbonado/layout/Layout.java')
-rw-r--r--src/main/java/com/amazon/carbonado/layout/Layout.java50
1 files changed, 35 insertions, 15 deletions
diff --git a/src/main/java/com/amazon/carbonado/layout/Layout.java b/src/main/java/com/amazon/carbonado/layout/Layout.java
index 89806fe..d11e4ef 100644
--- a/src/main/java/com/amazon/carbonado/layout/Layout.java
+++ b/src/main/java/com/amazon/carbonado/layout/Layout.java
@@ -41,6 +41,7 @@ import com.amazon.carbonado.FetchException;
import com.amazon.carbonado.FetchNoneException;
import com.amazon.carbonado.PersistException;
import com.amazon.carbonado.Query;
+import com.amazon.carbonado.Repository;
import com.amazon.carbonado.RepositoryException;
import com.amazon.carbonado.Storable;
import com.amazon.carbonado.Storage;
@@ -343,30 +344,38 @@ public class Layout {
{
final String filter = "storableTypeName = ? & generation = ?";
- final FetchNoneException ex;
try {
- return mLayoutFactory.mLayoutStorage
+ StoredLayoutEquivalence equiv =
+ mLayoutFactory.mRepository.storageFor(StoredLayoutEquivalence.class)
.query(filter)
.with(getStorableTypeName()).with(generation)
- .loadOne();
- } catch (FetchNoneException e) {
- ex = e;
+ .tryLoadOne();
+ if (equiv != null) {
+ generation = equiv.getMatchedGeneration();
+ }
+ } catch (RepositoryException e) {
+ throw e.toFetchException();
}
- // Index might be inconsistent.
- Cursor<StoredLayout> c =
- FilteredCursor.applyFilter(mLayoutFactory.mLayoutStorage.query().fetch(),
- StoredLayout.class, filter,
- getStorableTypeName(), generation);
-
try {
- if (c.hasNext()) {
- return c.next();
+ Cursor<StoredLayout> c = findLayouts
+ (mLayoutFactory.mRepository, getStorableTypeName(), generation);
+
+ try {
+ if (c.hasNext()) {
+ return c.next();
+ }
+ } finally {
+ c.close();
}
- } finally {
- c.close();
+ } catch (RepositoryException e) {
+ throw e.toFetchException();
}
+ FetchException ex = new FetchNoneException
+ ("Layout generation not found: " + getStorableTypeName() + ", " + generation);
+
+
// Try to resync with a master.
ResyncCapability cap =
mLayoutFactory.mRepository.getCapability(ResyncCapability.class);
@@ -400,6 +409,17 @@ public class Layout {
return storedLayout;
}
+ static Cursor<StoredLayout> findLayouts(Repository repo,
+ String storableTypeName, int generation)
+ throws RepositoryException
+ {
+ // Query without using the index, in case it's inconsistent.
+ return FilteredCursor.applyFilter
+ (repo.storageFor(StoredLayout.class).query().fetch(),
+ StoredLayout.class, "storableTypeName = ? & generation = ?",
+ storableTypeName, generation);
+ }
+
/**
* Returns the previous known generation of the storable's layout, or null
* if none.