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 am...@apache.org on 2018/09/12 10:25:10 UTC

svn commit: r1840652 - in /jackrabbit/oak/trunk: oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/ oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/ oak-blob-cloud/src/ma...

Author: amitj
Date: Wed Sep 12 10:25:09 2018
New Revision: 1840652

URL: http://svn.apache.org/viewvc?rev=1840652&view=rev
Log:
OAK-7738: Add method to check for existence of metadata in SharedDataStore

- Added a new method to the ShareDataStore and implementations

Modified:
    jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java
    jackrabbit/oak/trunk/oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureDataStoreTest.java
    jackrabbit/oak/trunk/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3Backend.java
    jackrabbit/oak/trunk/oak-blob-cloud/src/test/java/org/apache/jackrabbit/oak/blob/cloud/s3/TestS3DataStore.java
    jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java
    jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/SharedDataStore.java
    jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
    jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java
    jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/OakFileDataStore.java
    jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java
    jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/BlobGCTest.java
    jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/SharedDataStoreTest.java
    jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/SharedBackend.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/AbstractActiveDeletedBlobTest.java

Modified: jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java (original)
+++ jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java Wed Sep 12 10:25:09 2018
@@ -688,6 +688,28 @@ public class AzureBlobStoreBackend exten
         }
     }
 
+    @Override
+    public boolean metadataRecordExists(String name) {
+        long start = System.currentTimeMillis();
+        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+            CloudBlockBlob blob = getAzureContainer().getBlockBlobReference(addMetaKeyPrefix(name));
+            boolean exists = blob.exists();
+            LOG.debug("Metadata record {} exists {}. duration={}", name, exists, (System.currentTimeMillis() - start));
+            return exists;
+        }
+        catch (DataStoreException | StorageException | URISyntaxException e) {
+            LOG.debug("Error checking existence of metadata record = {}", name, e);
+        }
+        finally {
+            if (contextClassLoader != null) {
+                Thread.currentThread().setContextClassLoader(contextClassLoader);
+            }
+        }
+        return false;
+    }
+
 
     /**
      * Get key from data identifier. Object is stored with key in ADS.

Modified: jackrabbit/oak/trunk/oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureDataStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureDataStoreTest.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureDataStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureDataStoreTest.java Wed Sep 12 10:25:09 2018
@@ -642,6 +642,24 @@ public class AzureDataStoreTest {
         assertTrue(backend.deleteMetadataRecord("name"));
     }
 
+    // MetadataRecordExists (Backend)
+    @Test
+    public void testBackendMetadataRecordExists() throws DataStoreException {
+        backend.addMetadataRecord(randomStream(0, 10), "name");
+        for (String name : Lists.newArrayList("invalid", "", null)) {
+            if (Strings.isNullOrEmpty(name)) {
+                try {
+                    backend.metadataRecordExists(name);
+                }
+                catch (IllegalArgumentException e) { }
+            }
+            else {
+                assertFalse(backend.metadataRecordExists(name));
+            }
+        }
+        assertTrue(backend.metadataRecordExists("name"));
+    }
+
     // DeleteAllMetadataRecords (Backend)
 
     @Test

Modified: jackrabbit/oak/trunk/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3Backend.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3Backend.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3Backend.java (original)
+++ jackrabbit/oak/trunk/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3Backend.java Wed Sep 12 10:25:09 2018
@@ -519,11 +519,15 @@ public class S3Backend extends AbstractS
             ObjectMetadata meta = s3service.getObjectMetadata(bucket, addMetaKeyPrefix(name));
             return new S3DataRecord(this, s3service, bucket, new DataIdentifier(name),
                 meta.getLastModified().getTime(), meta.getContentLength(), true);
-        } finally {
+        } catch(Exception e) {
+            LOG.error("Error getting metadata record for {}", name, e);
+        }
+        finally {
             if (contextClassLoader != null) {
                 Thread.currentThread().setContextClassLoader(contextClassLoader);
             }
         }
+        return null;
     }
 
     @Override
@@ -647,7 +651,7 @@ public class S3Backend extends AbstractS
             } else {
                 byte[] key;
                 // Try reading from the metadata folder if it exists
-                if (metadataExists(REF_KEY)) {
+                if (metadataRecordExists(REF_KEY)) {
                     key = readMetadataBytes(REF_KEY);
                 } else {
                     // Create a new key and then retrieve it to use it
@@ -674,7 +678,8 @@ public class S3Backend extends AbstractS
         }
     }
 
-    private boolean metadataExists(String name) {
+    @Override
+    public boolean metadataRecordExists(String name) {
         ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
         try {
             Thread.currentThread().setContextClassLoader(

Modified: jackrabbit/oak/trunk/oak-blob-cloud/src/test/java/org/apache/jackrabbit/oak/blob/cloud/s3/TestS3DataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-cloud/src/test/java/org/apache/jackrabbit/oak/blob/cloud/s3/TestS3DataStore.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-cloud/src/test/java/org/apache/jackrabbit/oak/blob/cloud/s3/TestS3DataStore.java (original)
+++ jackrabbit/oak/trunk/oak-blob-cloud/src/test/java/org/apache/jackrabbit/oak/blob/cloud/s3/TestS3DataStore.java Wed Sep 12 10:25:09 2018
@@ -55,6 +55,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.blob.cloud.s3.S3DataStoreUtils.isS3Configured;
 import static org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreUtils.randomStream;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -314,6 +315,27 @@ public class TestS3DataStore {
         s3ds.getAllMetadataRecords(null);
     }
 
+    // MetadataRecordExists (Backend)
+    @Test
+    public void testBackendMetadataRecordExists() throws Exception {
+        assumeTrue(isS3Configured());
+        S3DataStore s3ds = getDataStore();
+
+        s3ds.addMetadataRecord(randomStream(0, 10), "name");
+        for (String name : Lists.newArrayList("invalid", "", null)) {
+            if (Strings.isNullOrEmpty(name)) {
+                try {
+                    s3ds.metadataRecordExists(name);
+                }
+                catch (IllegalArgumentException e) { }
+            }
+            else {
+                assertFalse(s3ds.metadataRecordExists(name));
+            }
+        }
+        assertTrue(s3ds.metadataRecordExists("name"));
+    }
+
     // DeleteMetadataRecord (Backend)
 
     @Test

Modified: jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java (original)
+++ jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java Wed Sep 12 10:25:09 2018
@@ -415,6 +415,11 @@ public abstract class AbstractSharedCach
     }
 
     @Override
+    public boolean metadataRecordExists(String name) {
+        return backend.metadataRecordExists(name);
+    }
+
+    @Override
     public List<DataRecord> getAllMetadataRecords(String prefix) {
         return backend.getAllMetadataRecords(prefix);
     }

Modified: jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/SharedDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/SharedDataStore.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/SharedDataStore.java (original)
+++ jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/SharedDataStore.java Wed Sep 12 10:25:09 2018
@@ -65,6 +65,14 @@ public interface SharedDataStore {
     DataRecord getMetadataRecord(String name);
 
     /**
+     * Checks if the metadata record with the name exists
+     *
+     * @param name
+     * @return
+     */
+    boolean metadataRecordExists(String name);
+
+    /**
      * Gets the all root records.
      * 
      * @return the all root records

Modified: jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java (original)
+++ jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/DataStoreBlobStore.java Wed Sep 12 10:25:09 2018
@@ -487,6 +487,11 @@ public class DataStoreBlobStore
     }
 
     @Override
+    public boolean metadataRecordExists(String name) {
+        return delegate instanceof SharedDataStore && ((SharedDataStore) delegate).metadataRecordExists(name);
+    }
+
+    @Override
     public List<DataRecord> getAllMetadataRecords(String prefix) {
         if (delegate instanceof SharedDataStore) {
             return ((SharedDataStore) delegate).getAllMetadataRecords(prefix);

Modified: jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java (original)
+++ jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java Wed Sep 12 10:25:09 2018
@@ -270,6 +270,22 @@ public class FSBackend extends AbstractS
     }
 
     @Override
+    public boolean metadataRecordExists(String name) {
+        for (File file : FileFilterUtils
+            .filterList(FileFilterUtils.nameFileFilter(name), fsPathDir.listFiles())) {
+            if (!file.isDirectory()) { // skip directories which are actual data store files
+                if (!file.exists()) {
+                    LOG.debug("File does not exist {} ",
+                        new Object[] {file.getAbsolutePath()});
+                } else {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
     public Iterator<DataRecord> getAllRecords() {
         final AbstractSharedBackend backend = this;
         return Files.fileTreeTraverser().postOrderTraversal(fsPathDir)

Modified: jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/OakFileDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/OakFileDataStore.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/OakFileDataStore.java (original)
+++ jackrabbit/oak/trunk/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/OakFileDataStore.java Wed Sep 12 10:25:09 2018
@@ -194,6 +194,27 @@ public class OakFileDataStore extends Fi
     }
 
     @Override
+    public boolean metadataRecordExists(String name) {
+        checkArgument(!Strings.isNullOrEmpty(name), "name should not be empty");
+
+        File root = new File(getPath());
+
+        for (File file : FileFilterUtils.filterList(
+            FileFilterUtils.nameFileFilter(name),
+            root.listFiles())) {
+            if (!file.isDirectory()) { // skip directories which are actual data store files
+                if (!file.exists()) {
+                    LOG.debug("File does not exist {} ",
+                        new Object[] {file.getAbsolutePath()});
+                } else {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
     public List<DataRecord> getAllMetadataRecords(String prefix) {
         checkArgument(null != prefix, "prefix should not be null");
 

Modified: jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java (original)
+++ jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/AbstractDataStoreCacheTest.java Wed Sep 12 10:25:09 2018
@@ -391,6 +391,10 @@ public class AbstractDataStoreCacheTest
         @Override public void deleteAllMetadataRecords(String prefix) {
         }
 
+        @Override public boolean metadataRecordExists(String name) {
+            return false;
+        }
+
         @Override public void init() throws DataStoreException {
 
         }

Modified: jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/BlobGCTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/BlobGCTest.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/BlobGCTest.java (original)
+++ jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/BlobGCTest.java Wed Sep 12 10:25:09 2018
@@ -568,6 +568,10 @@ public class BlobGCTest {
             return metadata.get(name);
         }
 
+        @Override public boolean metadataRecordExists(String name) {
+            return metadata.containsKey(name);
+        }
+
         @Override public List<DataRecord> getAllMetadataRecords(String prefix) {
             List<DataRecord> recs = Lists.newArrayList();
             Iterator<Map.Entry<String, DataRecord>> iter = metadata.entrySet().iterator();

Modified: jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/SharedDataStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/SharedDataStoreTest.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/SharedDataStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/SharedDataStoreTest.java Wed Sep 12 10:25:09 2018
@@ -61,6 +61,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.blob.datastore.SharedDataStoreTest.FixtureHelper.DATA_STORE.CACHING_FDS;
 import static org.apache.jackrabbit.oak.plugins.blob.datastore.SharedDataStoreTest.FixtureHelper.DATA_STORE.FDS;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -384,4 +385,24 @@ public class SharedDataStoreTest {
         SharedDataStore fds = dataStore;
         fds.deleteAllMetadataRecords(null);
     }
+
+    // MetadataRecordExists (Backend)
+    @Test
+    public void testBackendMetadataRecordExists() throws DataStoreException {
+        SharedDataStore fds = dataStore;
+
+        fds.addMetadataRecord(randomStream(0, 10), "name");
+        for (String name : Lists.newArrayList("invalid", "", null)) {
+            if (Strings.isNullOrEmpty(name)) {
+                try {
+                    fds.metadataRecordExists(name);
+                }
+                catch (IllegalArgumentException e) { }
+            }
+            else {
+                assertFalse(fds.metadataRecordExists(name));
+            }
+        }
+        assertTrue(fds.metadataRecordExists("name"));
+    }
 }

Modified: jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/SharedBackend.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/SharedBackend.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/SharedBackend.java (original)
+++ jackrabbit/oak/trunk/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/SharedBackend.java Wed Sep 12 10:25:09 2018
@@ -156,6 +156,14 @@ public interface SharedBackend {
     void deleteAllMetadataRecords(String prefix);
 
     /**
+     * Checks if the metadata record with the specified name exists.
+     *
+     * @param name the name of the record
+     * @return whether record exists
+     */
+    boolean metadataRecordExists(String name);
+
+    /**
      * Initialize
      */
     void init() throws DataStoreException;

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/AbstractActiveDeletedBlobTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/AbstractActiveDeletedBlobTest.java?rev=1840652&r1=1840651&r2=1840652&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/AbstractActiveDeletedBlobTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/AbstractActiveDeletedBlobTest.java Wed Sep 12 10:25:09 2018
@@ -246,6 +246,13 @@ public abstract class AbstractActiveDele
             return null;
         }
 
+        @Override public boolean metadataRecordExists(String name) {
+            if (delegate instanceof BlobTrackingStore) {
+                return ((BlobTrackingStore) delegate).metadataRecordExists(name);
+            }
+            return false;
+        }
+
         @Override public List<DataRecord> getAllMetadataRecords(String prefix) {
             if (delegate instanceof BlobTrackingStore) {
                 return ((BlobTrackingStore) delegate).getAllMetadataRecords(prefix);