Murtadha Hubail has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/2763

Change subject: [NO ISSUE][STO] Delete Corrupted Resources Metadata Files
......................................................................

[NO ISSUE][STO] Delete Corrupted Resources Metadata Files

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
- Delete corrupted resources metadata files cannot be
  read and deserialized during NC startup/shutdown.
- Add test case.

Change-Id: Ib205453a6620734930b9dde7652277d2c5a1d6ed
---
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
M 
asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/PersistentLocalResourceRepositoryTest.java
M 
asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
3 files changed, 44 insertions(+), 0 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/63/2763/1

diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
index dc5582b..b7b7c39 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
@@ -237,6 +237,7 @@
         final Set<Integer> nodePartitions = 
runtimeContext.getReplicaManager().getPartitions();
         final PersistentLocalResourceRepository localResourceRepository =
                 (PersistentLocalResourceRepository) 
runtimeContext.getLocalResourceRepository();
+        localResourceRepository.deleteCorruptedResources();
         for (Integer partition : nodePartitions) {
             localResourceRepository.cleanup(partition);
         }
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/PersistentLocalResourceRepositoryTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/PersistentLocalResourceRepositoryTest.java
index fb1adde..93015c0 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/PersistentLocalResourceRepositoryTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/PersistentLocalResourceRepositoryTest.java
@@ -166,4 +166,25 @@
                 .filter(file -> 
file.getName().startsWith(validComponentTimestamp.get())).count();
         Assert.assertTrue(validComponentFilesCount > 0);
     }
+
+    @Test
+    public void deleteCorruptedResourcesTest() throws Exception {
+        final INcApplicationContext ncAppCtx = (INcApplicationContext) 
integrationUtil.ncs[0].getApplicationContext();
+        final String nodeId = ncAppCtx.getServiceContext().getNodeId();
+        final String datasetName = "ds";
+        TestDataUtil.createIdOnlyDataset(datasetName);
+        final Dataset dataset = TestDataUtil.getDataset(integrationUtil, 
datasetName);
+        final String indexPath = TestDataUtil.getIndexPath(integrationUtil, 
dataset, nodeId);
+        final FileReference indexDirRef = 
ncAppCtx.getIoManager().resolve(indexPath);
+        final File indexMetadataFile = new File(indexDirRef.getFile(), 
StorageConstants.METADATA_FILE_NAME);
+        // delete original file and replace by corrupted file
+        final Path metadataFilePath = 
indexMetadataFile.toPath().toAbsolutePath();
+        Files.delete(metadataFilePath);
+        Files.createFile(metadataFilePath);
+        Assert.assertTrue(indexMetadataFile.exists());
+        // restart the node and ensure the resource metadata file was deleted
+        integrationUtil.deinit(false);
+        integrationUtil.init(false, TEST_CONFIG_FILE_NAME);
+        Assert.assertFalse(indexMetadataFile.exists());
+    }
 }
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 56b5910..2987239 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
@@ -28,6 +28,7 @@
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.ObjectOutputStream;
+import java.nio.channels.ClosedByInterruptException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -418,6 +419,27 @@
         return resourcesStats;
     }
 
+    public void deleteCorruptedResources() throws HyracksDataException {
+        for (Path root : storageRoots) {
+            final Collection<File> metadataFiles =
+                    FileUtils.listFiles(root.toFile(), METADATA_FILES_FILTER, 
ALL_DIR_FILTER);
+            for (File metadataFile : metadataFiles) {
+                final Path filePath = 
Paths.get(metadataFile.getAbsolutePath());
+                try {
+                    final JsonNode jsonNode = 
OBJECT_MAPPER.readValue(Files.readAllBytes(filePath), JsonNode.class);
+                    persistedResourceRegistry.deserialize(jsonNode);
+                } catch (ClosedByInterruptException e) {
+                    Thread.currentThread().interrupt();
+                    throw HyracksDataException.create(e);
+                } catch (IOException e) {
+                    LOGGER.error("Couldn't read resource {}. Deleting metadata 
file", metadataFile.getAbsolutePath(),
+                            e);
+                    IoUtil.delete(metadataFile);
+                }
+            }
+        }
+    }
+
     private void deleteIndexMaskedFiles(File index) throws IOException {
         File[] masks = index.listFiles(MASK_FILES_FILTER);
         if (masks != null) {

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2763
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib205453a6620734930b9dde7652277d2c5a1d6ed
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Murtadha Hubail <[email protected]>

Reply via email to