Author: reschke
Date: Fri May 31 09:40:56 2019
New Revision: 1860442

URL: http://svn.apache.org/viewvc?rev=1860442&view=rev
Log:
OAK-8251: RDBBlobStore instantiated from ReadOnly DocumentNodeStore should 
never modify persistence

Modified:
    
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
    
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentNodeStoreBuilder.java
    
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentNodeStoreBuilderTest.java

Modified: 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java?rev=1860442&r1=1860441&r2=1860442&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
 Fri May 31 09:40:56 2019
@@ -44,9 +44,12 @@ import javax.sql.DataSource;
 import org.apache.jackrabbit.oak.commons.PerfLogger;
 import org.apache.jackrabbit.oak.commons.StringUtils;
 import org.apache.jackrabbit.oak.plugins.blob.CachingBlobStore;
+import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreBuilder;
 import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
 import 
org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.PreparedStatementComponent;
 import org.apache.jackrabbit.oak.spi.blob.AbstractBlobStore;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,11 +60,12 @@ public class RDBBlobStore extends Cachin
 
     /**
      * Creates a {@linkplain RDBBlobStore} instance using the provided
-     * {@link DataSource} using the given {@link RDBOptions}.
+     * {@link DataSource} using the given {@link DocumentNodeStoreBuilder} and
+     * {@link RDBOptions}.
      */
-    public RDBBlobStore(DataSource ds, RDBOptions options) {
+    public RDBBlobStore(@NotNull DataSource ds, @Nullable 
DocumentNodeStoreBuilder<?> builder, @Nullable RDBOptions options) {
         try {
-            initialize(ds, options);
+            initialize(ds, builder, options == null ? new RDBOptions() : 
options);
         } catch (Exception ex) {
             throw new DocumentStoreException("initializing RDB blob store", 
ex);
         }
@@ -69,10 +73,20 @@ public class RDBBlobStore extends Cachin
 
     /**
      * Creates a {@linkplain RDBBlobStore} instance using the provided
-     * {@link DataSource} using default {@link RDBOptions}.
+     * {@link DataSource} using default {@link DocumentNodeStoreBuilder} and 
the
+     * given {@link RDBOptions}.
      */
-    public RDBBlobStore(DataSource ds) {
-        this(ds, new RDBOptions());
+    public RDBBlobStore(@NotNull DataSource ds, @Nullable RDBOptions options) {
+        this(ds, null, options);
+    }
+
+    /**
+     * Creates a {@linkplain RDBBlobStore} instance using the provided
+     * {@link DataSource} using default {@link DocumentNodeStoreBuilder} and
+     * {@link RDBOptions}.
+     */
+    public RDBBlobStore(@NotNull DataSource ds) {
+        this(ds, null, null);
     }
 
     @Override
@@ -146,10 +160,12 @@ public class RDBBlobStore extends Cachin
     protected String tnData;
     protected String tnMeta;
     private Set<String> tablesToBeDropped = new HashSet<String>();
+    private boolean readOnly;
 
+    private void initialize(DataSource ds, DocumentNodeStoreBuilder<?> 
builder, RDBOptions options) throws Exception {
 
-    private void initialize(DataSource ds, RDBOptions options) throws 
Exception {
-
+        this.readOnly = builder == null ? false : builder.getReadOnlyMode();
+ 
         this.tnData = RDBJDBCTools.createTableName(options.getTablePrefix(), 
"DATASTORE_DATA");
         this.tnMeta = RDBJDBCTools.createTableName(options.getTablePrefix(), 
"DATASTORE_META");
 
@@ -200,6 +216,12 @@ public class RDBBlobStore extends Cachin
                     // table does not appear to exist
                     con.rollback();
 
+                    LOG.debug("trying to read from '" + tableName + "'", ex);
+                    if (this.readOnly) {
+                        throw new SQLException("Would like to create table '" 
+ tableName
+                                + "', but RDBBlobStore has been initialized in 
'readonly' mode");
+                    }
+
                     createStatement = con.createStatement();
 
                     if (this.tnMeta.equals(tableName)) {
@@ -244,6 +266,10 @@ public class RDBBlobStore extends Cachin
 
     @Override
     protected void storeBlock(byte[] digest, int level, byte[] data) throws 
IOException {
+        if (this.readOnly) {
+            throw new IOException("RDBBlobStore has been initialized in 
'readonly' mode");
+        }
+
         try {
             storeBlockInDatabase(digest, level, data);
         } catch (SQLException e) {

Modified: 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentNodeStoreBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentNodeStoreBuilder.java?rev=1860442&r1=1860441&r2=1860442&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentNodeStoreBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentNodeStoreBuilder.java
 Fri May 31 09:40:56 2019
@@ -82,7 +82,7 @@ public class RDBDocumentNodeStoreBuilder
     public RDBDocumentNodeStoreBuilder setRDBConnection(DataSource 
documentStoreDataSource, DataSource blobStoreDataSource, RDBOptions options) {
         this.documentStoreSupplier = memoize(() -> new 
RDBDocumentStore(documentStoreDataSource, this, options));
         if (this.blobStoreSupplier == null) {
-            this.blobStoreSupplier = memoize(() -> new 
RDBBlobStore(blobStoreDataSource, options));
+            this.blobStoreSupplier = memoize(() -> new 
RDBBlobStore(blobStoreDataSource, this, options));
         }
         return thisBuilder();
     }

Modified: 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentNodeStoreBuilderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentNodeStoreBuilderTest.java?rev=1860442&r1=1860441&r2=1860442&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentNodeStoreBuilderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentNodeStoreBuilderTest.java
 Fri May 31 09:40:56 2019
@@ -23,7 +23,6 @@ import java.util.UUID;
 import javax.sql.DataSource;
 
 import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class RDBDocumentNodeStoreBuilderTest {
@@ -42,7 +41,6 @@ public class RDBDocumentNodeStoreBuilder
         }
     }
 
-    @Ignore("OAK-8251")
     @Test
     public void testReadOnlyBS() throws Exception {
         // see OAK-8251


Reply via email to