From 7bb2ef6f61fb8f180c70e854344550a13bdb3361 Mon Sep 17 00:00:00 2001 From: "Brian S. O'Neill" Date: Sat, 24 Jul 2010 23:14:20 +0000 Subject: Allow new layouts if BDB is read-only. --- .../java/com/amazon/carbonado/layout/Layout.java | 6 +++++- .../com/amazon/carbonado/layout/LayoutFactory.java | 21 ++++++++++++++++++--- .../carbonado/repo/sleepycat/BDBRepository.java | 2 +- .../amazon/carbonado/repo/sleepycat/BDBStorage.java | 8 +++++--- 4 files changed, 29 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/main/java/com/amazon/carbonado/layout/Layout.java b/src/main/java/com/amazon/carbonado/layout/Layout.java index 0c7ab83..98df22c 100644 --- a/src/main/java/com/amazon/carbonado/layout/Layout.java +++ b/src/main/java/com/amazon/carbonado/layout/Layout.java @@ -518,13 +518,17 @@ public class Layout { } // Assumes caller is in a transaction. - void insert(int generation) throws PersistException { + void insert(boolean readOnly, int generation) throws PersistException { if (mAllProperties == null) { throw new IllegalStateException(); } mStoredLayout.setGeneration(generation); + if (readOnly) { + return; + } + try { mStoredLayout.insert(); } catch (UniqueConstraintException e) { diff --git a/src/main/java/com/amazon/carbonado/layout/LayoutFactory.java b/src/main/java/com/amazon/carbonado/layout/LayoutFactory.java index 92099dd..7b7953b 100644 --- a/src/main/java/com/amazon/carbonado/layout/LayoutFactory.java +++ b/src/main/java/com/amazon/carbonado/layout/LayoutFactory.java @@ -101,6 +101,21 @@ public class LayoutFactory implements LayoutCapability { */ public Layout layoutFor(Class type, LayoutOptions options) throws FetchException, PersistException + { + return layoutFor(false, type, options); + } + + /** + * Returns the layout matching the current definition of the given type. + * + * @param readOnly if true, don't attempt to persist new generation because + * underlying repository is read-only + * @throws PersistException if type represents a new generation, but + * persisting this information failed + */ + public Layout layoutFor(boolean readOnly, + Class type, LayoutOptions options) + throws FetchException, PersistException { if (options != null) { // Make side-effect consistently applied. @@ -132,7 +147,7 @@ public class LayoutFactory implements LayoutCapability { txn = mRepository.enterTransaction(IsolationLevel.READ_COMMITTED); } - txn.setForUpdate(true); + txn.setForUpdate(!readOnly); try { // If type represents a new generation, then a new layout needs to // be inserted. @@ -207,7 +222,7 @@ public class LayoutFactory implements LayoutCapability { cursor.close(); } - newLayout.insert(generation); + newLayout.insert(readOnly, generation); layout = newLayout; txn.commit(); @@ -247,7 +262,7 @@ public class LayoutFactory implements LayoutCapability { } } - if (resyncCap != null) { + if (!readOnly && resyncCap != null) { // Make sure that all layout records are sync'd. try { resyncCap.resync(StoredLayoutProperty.class, 1.0, null); diff --git a/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBRepository.java b/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBRepository.java index b423ab9..eb10042 100644 --- a/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBRepository.java +++ b/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBRepository.java @@ -354,7 +354,7 @@ abstract class BDBRepository extends AbstractRepository throws FetchException, PersistException { try { - return ((BDBStorage) storageFor(type)).getLayout(mStorableCodecFactory); + return ((BDBStorage) storageFor(type)).getLayout(true, mStorableCodecFactory); } catch (PersistException e) { throw e; } catch (RepositoryException e) { diff --git a/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBStorage.java b/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBStorage.java index 66e8475..f4d8f24 100644 --- a/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBStorage.java +++ b/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBStorage.java @@ -419,7 +419,7 @@ abstract class BDBStorage implements Storage, Storag { StorableInfo info = StorableIntrospector.examine(getStorableType()); StorableCodecFactory codecFactory = mRepository.getStorableCodecFactory(); - final Layout layout = getLayout(codecFactory); + final Layout layout = getLayout(readOnly, codecFactory); // Open primary database. Object primaryDatabase; @@ -766,7 +766,9 @@ abstract class BDBStorage implements Storage, Storag } } - Layout getLayout(StorableCodecFactory codecFactory) throws RepositoryException { + Layout getLayout(boolean readOnly, StorableCodecFactory codecFactory) + throws RepositoryException + { if (Unevolvable.class.isAssignableFrom(getStorableType())) { // Don't record generation for storables marked as unevolvable. return null; @@ -782,7 +784,7 @@ abstract class BDBStorage implements Storage, Storag } Class type = getStorableType(); - return factory.layoutFor(type, codecFactory.getLayoutOptions(type)); + return factory.layoutFor(readOnly, type, codecFactory.getLayoutOptions(type)); } /** -- cgit v1.2.3