You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by al...@apache.org on 2021/09/09 10:32:25 UTC

[asterixdb] branch master updated: [NO ISSUE][STO] Add utility to clean up partition directory

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

alsuliman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 025797c  [NO ISSUE][STO] Add utility to clean up partition directory
025797c is described below

commit 025797c29022ce8469db13425e6b2237c0a53e52
Author: Ali Alsuliman <al...@gmail.com>
AuthorDate: Wed Sep 8 04:02:46 2021 +0300

    [NO ISSUE][STO] Add utility to clean up partition directory
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    
    Change-Id: Ic78864d3f8f7c3bda5e4711db00d3be0ae8f7aea
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/13105
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
    Reviewed-by: Murtadha Hubail <mh...@apache.org>
---
 .../asterix/common/utils/StoragePathUtil.java      |  6 ++++--
 .../PersistentLocalResourceRepository.java         | 25 ++++++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
index 32a226e..f84472e 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
@@ -90,9 +90,11 @@ public class StoragePathUtil {
     }
 
     public static int getPartitionNumFromRelativePath(String relativePath) {
-        int startIdx = relativePath.indexOf(StorageConstants.PARTITION_DIR_PREFIX)
+        int startIdx = relativePath.lastIndexOf(StorageConstants.PARTITION_DIR_PREFIX)
                 + StorageConstants.PARTITION_DIR_PREFIX.length();
-        String partition = relativePath.substring(startIdx, relativePath.indexOf(File.separatorChar, startIdx));
+        int partitionEndIdx = relativePath.indexOf(File.separatorChar, startIdx);
+        int idxEnd = partitionEndIdx != -1 ? partitionEndIdx : relativePath.length();
+        String partition = relativePath.substring(startIdx, idxEnd);
         return Integer.parseInt(partition);
     }
 
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
index 3b192aa..4d15385 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
@@ -33,6 +33,7 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -646,4 +647,28 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito
     public Path[] getStorageRoots() {
         return storageRoots;
     }
+
+    public void keepPartitions(Set<Integer> keepPartitions) {
+        List<File> onDiskPartitions = getOnDiskPartitions();
+        for (File onDiskPartition : onDiskPartitions) {
+            int partitionNum = StoragePathUtil.getPartitionNumFromRelativePath(onDiskPartition.getAbsolutePath());
+            if (!keepPartitions.contains(partitionNum)) {
+                LOGGER.warn("deleting partition {} since it is not on partitions to keep {}", partitionNum,
+                        keepPartitions);
+                FileUtils.deleteQuietly(onDiskPartition);
+            }
+        }
+    }
+
+    public List<File> getOnDiskPartitions() {
+        List<File> onDiskPartitions = new ArrayList<>();
+        for (Path root : storageRoots) {
+            File[] partitions = root.toFile().listFiles(
+                    (dir, name) -> dir.isDirectory() && name.startsWith(StorageConstants.PARTITION_DIR_PREFIX));
+            if (partitions != null) {
+                onDiskPartitions.addAll(Arrays.asList(partitions));
+            }
+        }
+        return onDiskPartitions;
+    }
 }