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 mi...@apache.org on 2022/11/11 13:14:29 UTC

[jackrabbit-oak] 01/01: delete only non sequential missing segments

This is an automated email from the ASF dual-hosted git repository.

miroslav pushed a commit to branch snfe_during_recovery
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 905764959e759d9ed5ac5b0f5c4a50ad17eccda8
Author: smiroslav <mi...@apache.org>
AuthorDate: Fri Nov 11 14:08:10 2022 +0100

    delete only non sequential missing segments
---
 .../oak/segment/azure/AzureArchiveManager.java     | 42 +++++++++++++++++-----
 1 file changed, 34 insertions(+), 8 deletions(-)

diff --git a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java
index a087d11a83..e823f7f6ca 100644
--- a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java
+++ b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java
@@ -22,6 +22,7 @@ import com.microsoft.azure.storage.blob.CloudBlob;
 import com.microsoft.azure.storage.blob.CloudBlobDirectory;
 import com.microsoft.azure.storage.blob.CloudBlockBlob;
 import com.microsoft.azure.storage.blob.CopyStatus;
+import org.apache.jackrabbit.oak.segment.remote.RemoteSegmentArchiveEntry;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
 import org.apache.jackrabbit.oak.segment.remote.RemoteUtilities;
 import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitor;
@@ -37,13 +38,19 @@ import java.net.URISyntaxException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.EnumSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.OptionalInt;
 import java.util.UUID;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -229,16 +236,35 @@ public class AzureArchiveManager implements SegmentArchiveManager {
     }
 
     private void delete(String archiveName, Set<UUID> recoveredEntries) throws IOException {
-        getBlobs(archiveName)
-                .forEach(cloudBlob -> {
-                    if (!recoveredEntries.contains(RemoteUtilities.getSegmentUUID(getName(cloudBlob)))) {
-                        try {
-                            cloudBlob.delete();
-                        } catch (StorageException e) {
-                            log.error("Can't delete segment {}", cloudBlob.getUri().getPath(), e);
+        int previousSegmentIndex = -2;
+
+        List<CloudBlob> blobs = getBlobs(archiveName);
+        Collections.sort(blobs, Comparator.comparing(CloudBlob::getName));
+
+        for (CloudBlob cloudBlob : blobs) {
+            if (!recoveredEntries.contains(RemoteUtilities.getSegmentUUID(getName(cloudBlob)))) {
+                try {
+                    String blobName = cloudBlob.getName();
+
+                    Map<String, String> metadata = cloudBlob.getMetadata();
+                    if (AzureBlobMetadata.isSegment(metadata)) {
+
+                        //get the segment index, i.e.  5  for "0005.1455efcc-4b4d-4de7-a478-91f0906191c3"
+                        int segmentIndex = Integer.parseInt(blobName.substring(blobName.lastIndexOf("/")+1, blobName.lastIndexOf(".")));
+
+                        if (previousSegmentIndex + 1 == segmentIndex) {
+                            previousSegmentIndex = segmentIndex;
+                            // we do not delete segment since there is no gap
+                            continue;
                         }
                     }
-                });
+
+                    cloudBlob.delete();
+                } catch (StorageException e) {
+                    log.error("Can't delete segment {}", cloudBlob.getUri().getPath(), e);
+                }
+            }
+        }
     }
 
     /**