You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mh...@apache.org on 2019/09/03 13:55:17 UTC
[asterixdb] branch master updated: [NO ISSUE][OTH] Make Active
Recovery Task Extensible
This is an automated email from the ASF dual-hosted git repository.
mhubail 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 1f59a5e [NO ISSUE][OTH] Make Active Recovery Task Extensible
1f59a5e is described below
commit 1f59a5eec0a3874f9bb701405a592009e64e4e86
Author: Murtadha Hubail <mh...@apache.org>
AuthorDate: Tue Sep 3 01:40:49 2019 +0300
[NO ISSUE][OTH] Make Active Recovery Task Extensible
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Allow active entity listeners to create their own
recovery tasks.
- Make lock acquisition in recovery task extensible.
Change-Id: I801eec74f7c1723e8243fe0f36db6148638bde35
Reviewed-on: https://asterix-gerrit.ics.uci.edu/3538
Sonar-Qube: Jenkins <je...@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <je...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
Reviewed-by: Murtadha Hubail <mh...@apache.org>
Reviewed-by: Till Westmann <ti...@apache.org>
---
.../app/active/ActiveEntityEventsListener.java | 6 ++-
.../apache/asterix/app/active/RecoveryTask.java | 46 +++++++++++++++-------
2 files changed, 36 insertions(+), 16 deletions(-)
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
index 3b847b3..882afc5 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
@@ -366,7 +366,7 @@ public abstract class ActiveEntityEventsListener implements IActiveEntityControl
ExecutorService executor = appCtx.getServiceContext().getControllerService().getExecutor();
setState(ActivityState.TEMPORARILY_FAILED);
LOGGER.log(level, "Recovery task has been submitted");
- rt = new RecoveryTask(appCtx, this, retryPolicyFactory);
+ rt = createRecoveryTask();
executor.submit(rt.recover());
}
}
@@ -685,6 +685,10 @@ public abstract class ActiveEntityEventsListener implements IActiveEntityControl
return suspended;
}
+ protected RecoveryTask createRecoveryTask() {
+ return new RecoveryTask(appCtx, this, retryPolicyFactory);
+ }
+
@Override
public String toString() {
return "{\"class\":\"" + getClass().getSimpleName() + "\"," + "\"entityId\":\"" + entityId + "\","
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java
index 0172b28..a1989fc 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java
@@ -119,13 +119,7 @@ public class RecoveryTask {
}
IMetadataLockManager lockManager = metadataProvider.getApplicationContext().getMetadataLockManager();
try {
- lockManager.acquireActiveEntityWriteLock(metadataProvider.getLocks(),
- listener.getEntityId().getDataverse() + '.' + listener.getEntityId().getEntityName());
- for (Dataset dataset : listener.getDatasets()) {
- lockManager.acquireDataverseReadLock(metadataProvider.getLocks(), dataset.getDataverseName());
- lockManager.acquireDatasetExclusiveModificationLock(metadataProvider.getLocks(),
- DatasetUtil.getFullyQualifiedName(dataset));
- }
+ acquireRecoveryLocks(lockManager);
synchronized (listener) {
try {
if (!cancelRecovery && listener.getState() == ActivityState.TEMPORARILY_FAILED) {
@@ -143,7 +137,7 @@ public class RecoveryTask {
listener.setState(ActivityState.TEMPORARILY_FAILED);
failure = e;
} finally {
- metadataProvider.getLocks().reset();
+ releaseRecoveryLocks(metadataProvider);
}
}
// Recovery task is essntially over now either through failure or through cancellation(stop)
@@ -163,12 +157,7 @@ public class RecoveryTask {
}
IMetadataLockManager lockManager = metadataProvider.getApplicationContext().getMetadataLockManager();
try {
- lockManager.acquireActiveEntityWriteLock(metadataProvider.getLocks(),
- listener.getEntityId().getDataverse() + '.' + listener.getEntityId().getEntityName());
- for (Dataset dataset : listener.getDatasets()) {
- MetadataLockUtil.modifyDatasetBegin(lockManager, metadataProvider.getLocks(), dataset.getDatasetName(),
- DatasetUtil.getFullyQualifiedName(dataset));
- }
+ acquirePostRecoveryLocks(lockManager);
synchronized (listener) {
if (!cancelRecovery && listener.getState() == ActivityState.TEMPORARILY_FAILED) {
LOGGER.warn("Recovery for {} permanently failed", listener.getEntityId());
@@ -178,8 +167,35 @@ public class RecoveryTask {
listener.notifyAll();
}
} finally {
- metadataProvider.getLocks().reset();
+ releasePostRecoveryLocks();
}
return null;
}
+
+ protected void acquireRecoveryLocks(IMetadataLockManager lockManager) throws AlgebricksException {
+ lockManager.acquireActiveEntityWriteLock(metadataProvider.getLocks(),
+ listener.getEntityId().getDataverse() + '.' + listener.getEntityId().getEntityName());
+ for (Dataset dataset : listener.getDatasets()) {
+ lockManager.acquireDataverseReadLock(metadataProvider.getLocks(), dataset.getDataverseName());
+ lockManager.acquireDatasetExclusiveModificationLock(metadataProvider.getLocks(),
+ DatasetUtil.getFullyQualifiedName(dataset));
+ }
+ }
+
+ protected void releaseRecoveryLocks(MetadataProvider metadataProvider) {
+ metadataProvider.getLocks().reset();
+ }
+
+ protected void acquirePostRecoveryLocks(IMetadataLockManager lockManager) throws AlgebricksException {
+ lockManager.acquireActiveEntityWriteLock(metadataProvider.getLocks(),
+ listener.getEntityId().getDataverse() + '.' + listener.getEntityId().getEntityName());
+ for (Dataset dataset : listener.getDatasets()) {
+ MetadataLockUtil.modifyDatasetBegin(lockManager, metadataProvider.getLocks(), dataset.getDatasetName(),
+ DatasetUtil.getFullyQualifiedName(dataset));
+ }
+ }
+
+ protected void releasePostRecoveryLocks() {
+ metadataProvider.getLocks().reset();
+ }
}