You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2021/06/03 21:57:43 UTC
[asterixdb] 05/08: [NO ISSUE][STO] Ignore resource doesn't exist on
dataset drop
This is an automated email from the ASF dual-hosted git repository.
mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 276b65ccf583b0318b94eaf777964c06c22678ed
Author: Murtadha Hubail <mh...@apache.org>
AuthorDate: Thu May 27 01:38:51 2021 +0300
[NO ISSUE][STO] Ignore resource doesn't exist on dataset drop
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- When attempting to drop a dataset, do not fail the operation
due to not finding the index on an NC.
- Ignore resource doesn't exist error code when attempting to
drop a dataset.
- Always invalidate the resource on a delete attempt from the
PersistentLocalResourceRepository cache.
- Start a new metadata transaction before attempting to execute
the drop dataset compensating operations.
Change-Id: I591b009f0ffdf348bcfe989424f47a20fff44a1b
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/11644
Reviewed-by: Michael Blow <mb...@apache.org>
Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
---
.../asterix/app/translator/QueryTranslator.java | 6 +++++-
.../PersistentLocalResourceRepository.java | 25 +++++++++++-----------
.../dataflow/IndexDropOperatorNodePushable.java | 3 ++-
3 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index 754e2b6..7ddf877 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -1704,7 +1704,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen
validateDatasetState(metadataProvider, ds, sourceLoc);
ds.drop(metadataProvider, mdTxnCtx, jobsToExecute, bActiveTxn, progress, hcc, dropCorrespondingNodeGroup,
- sourceLoc, Collections.emptySet(), requestParameters.isForceDropDataset());
+ sourceLoc, EnumSet.of(DropOption.IF_EXISTS), requestParameters.isForceDropDataset());
MetadataManager.INSTANCE.commitTransaction(mdTxnCtx.getValue());
return true;
@@ -1720,6 +1720,10 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen
try {
if (ds != null) {
jobsToExecute.clear();
+ // start another txn for the compensating operations
+ mdTxnCtx.setValue(MetadataManager.INSTANCE.beginTransaction());
+ bActiveTxn.setValue(true);
+ metadataProvider.setMetadataTxnContext(mdTxnCtx.getValue());
ds.drop(metadataProvider, mdTxnCtx, jobsToExecute, bActiveTxn, progress, hcc,
dropCorrespondingNodeGroup, sourceLoc, EnumSet.of(DropOption.IF_EXISTS),
requestParameters.isForceDropDataset());
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 508eb76..29dedf7 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
@@ -230,20 +230,21 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito
@Override
public synchronized void delete(String relativePath) throws HyracksDataException {
FileReference resourceFile = getLocalResourceFileByName(ioManager, relativePath);
- if (resourceFile.getFile().exists()) {
- if (isReplicationEnabled) {
- createReplicationJob(ReplicationOperation.DELETE, resourceFile);
+ try {
+ if (resourceFile.getFile().exists()) {
+ if (isReplicationEnabled) {
+ createReplicationJob(ReplicationOperation.DELETE, resourceFile);
+ }
+ final LocalResource localResource = readLocalResource(resourceFile.getFile());
+ IoUtil.delete(resourceFile);
+ // delete all checkpoints
+ indexCheckpointManagerProvider.get(DatasetResourceReference.of(localResource)).delete();
+ } else {
+ throw HyracksDataException.create(org.apache.hyracks.api.exceptions.ErrorCode.RESOURCE_DOES_NOT_EXIST,
+ relativePath);
}
- final LocalResource localResource = readLocalResource(resourceFile.getFile());
- // Invalidate before deleting the file just in case file deletion throws some exception.
- // Since it's just a cache invalidation, it should not affect correctness.
+ } finally {
resourceCache.invalidate(relativePath);
- IoUtil.delete(resourceFile);
- // delete all checkpoints
- indexCheckpointManagerProvider.get(DatasetResourceReference.of(localResource)).delete();
- } else {
- throw HyracksDataException.create(org.apache.hyracks.api.exceptions.ErrorCode.RESOURCE_DOES_NOT_EXIST,
- relativePath);
}
}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDropOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDropOperatorNodePushable.java
index e48db2b..3b6669e 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDropOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDropOperatorNodePushable.java
@@ -21,6 +21,7 @@ package org.apache.hyracks.storage.am.common.dataflow;
import static org.apache.hyracks.api.exceptions.ErrorCode.CANNOT_DROP_IN_USE_INDEX;
import static org.apache.hyracks.api.exceptions.ErrorCode.INDEX_DOES_NOT_EXIST;
+import static org.apache.hyracks.api.exceptions.ErrorCode.RESOURCE_DOES_NOT_EXIST;
import static org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.DropOption.IF_EXISTS;
import static org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.DropOption.WAIT_ON_IN_USE;
@@ -96,7 +97,7 @@ public class IndexDropOperatorNodePushable extends AbstractOperatorNodePushable
}
private boolean isIgnorable(HyracksDataException e) {
- return e.matches(INDEX_DOES_NOT_EXIST) && options.contains(IF_EXISTS);
+ return (e.matches(INDEX_DOES_NOT_EXIST) || e.matches(RESOURCE_DOES_NOT_EXIST)) && options.contains(IF_EXISTS);
}
private boolean canRetry(HyracksDataException e) throws HyracksDataException {