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);
+ }
+ }
+ }
}
/**