Author: tomekr
Date: Thu May 31 13:55:26 2018
New Revision: 1832615

URL: http://svn.apache.org/viewvc?rev=1832615&view=rev
Log:
OAK-7520: AzureArchiveManager#copyBlob() hangs indefinitely

Modified:
    jackrabbit/oak/trunk/oak-segment-azure/pom.xml
    
jackrabbit/oak/trunk/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java
    
jackrabbit/oak/trunk/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java

Modified: jackrabbit/oak/trunk/oak-segment-azure/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-azure/pom.xml?rev=1832615&r1=1832614&r2=1832615&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-azure/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-segment-azure/pom.xml Thu May 31 13:55:26 2018
@@ -145,6 +145,11 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>io.dropwizard.metrics</groupId>
+            <artifactId>metrics-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.jackrabbit</groupId>
             <artifactId>oak-store-spi</artifactId>
             <version>${project.version}</version>
@@ -168,6 +173,16 @@
             <version>2.1.0</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jul-to-slf4j</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>

Modified: 
jackrabbit/oak/trunk/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java?rev=1832615&r1=1832614&r2=1832615&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java
 Thu May 31 13:55:26 2018
@@ -232,8 +232,15 @@ public class AzureArchiveManager impleme
             String blobName = getName(blob);
             CloudBlockBlob newBlob = newParent.getBlockBlobReference(blobName);
             newBlob.startCopy(blob.getUri());
-            while (newBlob.getCopyState().getStatus() == CopyStatus.PENDING) {
-                Thread.sleep(100);
+
+            boolean isStatusPending = true;
+            while (isStatusPending) {
+                newBlob.downloadAttributes();
+                if (newBlob.getCopyState().getStatus() == CopyStatus.PENDING) {
+                    Thread.sleep(100);
+                } else {
+                    isStatusPending = false;
+                }
             }
 
             CopyStatus finalStatus = newBlob.getCopyState().getStatus();

Modified: 
jackrabbit/oak/trunk/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java?rev=1832615&r1=1832614&r2=1832615&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java
 Thu May 31 13:55:26 2018
@@ -18,14 +18,24 @@ package org.apache.jackrabbit.oak.segmen
 
 import com.microsoft.azure.storage.StorageException;
 import com.microsoft.azure.storage.blob.CloudBlobContainer;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.segment.SegmentNodeStore;
+import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
+import org.apache.jackrabbit.oak.segment.file.FileStore;
+import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
+import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
 import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveWriter;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
 
+import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.security.InvalidKeyException;
@@ -71,4 +81,23 @@ public class AzureArchiveManagerTest {
         assertEquals(uuids.subList(0, 5), newArrayList(recovered.keySet()));
     }
 
+    @Test
+    public void testUncleanStop() throws URISyntaxException, IOException, 
InvalidFileStoreVersionException, CommitFailedException, StorageException {
+        AzurePersistence p = new 
AzurePersistence(container.getDirectoryReference("oak"));
+        FileStore fs = FileStoreBuilder.fileStoreBuilder(new 
File("target")).withCustomPersistence(p).build();
+        SegmentNodeStore segmentNodeStore = 
SegmentNodeStoreBuilders.builder(fs).build();
+        NodeBuilder builder = segmentNodeStore.getRoot().builder();
+        builder.setProperty("foo", "bar");
+        segmentNodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+        fs.close();
+
+        container.getBlockBlobReference("oak/data00000a.tar/closed").delete();
+        
container.getBlockBlobReference("oak/data00000a.tar/data00000a.tar.brf").delete();
+        
container.getBlockBlobReference("oak/data00000a.tar/data00000a.tar.gph").delete();
+
+        fs = FileStoreBuilder.fileStoreBuilder(new 
File("target")).withCustomPersistence(p).build();
+        segmentNodeStore = SegmentNodeStoreBuilders.builder(fs).build();
+        assertEquals("bar", segmentNodeStore.getRoot().getString("foo"));
+        fs.close();
+    }
 }


Reply via email to