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]>