>From Michael Blow <[email protected]>:
Michael Blow has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17608 )
Change subject: [NO ISSUE][*DB] Provide ability for IDatasetRebalanceCallback
to decline a rebalance
......................................................................
[NO ISSUE][*DB] Provide ability for IDatasetRebalanceCallback to decline a
rebalance
Change-Id: I1b2cdb56d70ce47c7b15061cc5ecc4af36ed8f61
---
M
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/NodeGroup.java
M
asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
M
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
M
asterixdb/asterix-app/src/main/java/org/apache/asterix/rebalance/IDatasetRebalanceCallback.java
M
asterixdb/asterix-app/src/main/java/org/apache/asterix/rebalance/NoOpDatasetRebalanceCallback.java
5 files changed, 33 insertions(+), 13 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/08/17608/1
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/rebalance/IDatasetRebalanceCallback.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/rebalance/IDatasetRebalanceCallback.java
index e8683c9..8758ee8 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/rebalance/IDatasetRebalanceCallback.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/rebalance/IDatasetRebalanceCallback.java
@@ -40,9 +40,10 @@
* the target dataset.
* @param hcc,
* the hyracks client connection.
+ * @return <code>false</code> if the rebalance will be safely skipped
* @throws HyracksDataException
*/
- void beforeRebalance(MetadataProvider metadataProvider, Dataset source,
Dataset target,
+ boolean beforeRebalance(MetadataProvider metadataProvider, Dataset source,
Dataset target,
IHyracksClientConnection hcc) throws HyracksDataException;
/**
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/rebalance/NoOpDatasetRebalanceCallback.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/rebalance/NoOpDatasetRebalanceCallback.java
index 680adbf..6f1de86 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/rebalance/NoOpDatasetRebalanceCallback.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/rebalance/NoOpDatasetRebalanceCallback.java
@@ -33,9 +33,10 @@
}
@Override
- public void beforeRebalance(MetadataProvider metadataProvider, Dataset
source, Dataset target,
+ public boolean beforeRebalance(MetadataProvider metadataProvider, Dataset
source, Dataset target,
IHyracksClientConnection hcc) {
// Does nothing.
+ return false;
}
@Override
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
index 61562d8..ba031c4 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
@@ -90,13 +90,15 @@
* the metadata provider.
* @param hcc,
* the reusable hyracks connection.
+ * @return <code>false</code> if the rebalance was safely skipped
* @throws Exception
*/
- public static void rebalance(DataverseName dataverseName, String
datasetName, Set<String> targetNcNames,
+ public static boolean rebalance(DataverseName dataverseName, String
datasetName, Set<String> targetNcNames,
MetadataProvider metadataProvider, IHyracksClientConnection hcc,
IDatasetRebalanceCallback datasetRebalanceCallback, boolean
forceRebalance) throws Exception {
Dataset sourceDataset;
Dataset targetDataset;
+ boolean success = true;
// Executes the first Metadata transaction.
// Generates the rebalance target files. While doing that, hold read
locks on the dataset so
// that no one can drop the rebalance source dataset.
@@ -108,13 +110,13 @@
// If the source dataset doesn't exist, then it's a no-op.
if (sourceDataset == null) {
- return;
+ return true;
}
Set<String> sourceNodes = new
HashSet<>(metadataProvider.findNodes(sourceDataset.getNodeGroupName()));
if (!forceRebalance && sourceNodes.equals(targetNcNames)) {
- return;
+ return true;
}
if (!targetNcNames.isEmpty()) {
@@ -130,7 +132,7 @@
targetDataset.getNodeGroupName(), targetNcNames);
// Rebalances the source dataset into the target dataset.
if (sourceDataset.getDatasetType() != DatasetType.EXTERNAL) {
- rebalance(sourceDataset, targetDataset, metadataProvider,
hcc, datasetRebalanceCallback);
+ success = rebalance(sourceDataset, targetDataset,
metadataProvider, hcc, datasetRebalanceCallback);
}
} else {
targetDataset = null;
@@ -146,7 +148,10 @@
if (targetNcNames.isEmpty()) {
// Nothing else to do since the dataset was dropped.
- return;
+ return true;
+ } else if (!success) {
+ LOGGER.info("Dataset {} rebalance was skipped, see above log for
reason", datasetName);
+ return false;
}
// Up to this point, since the bulk part of a rebalance operation is
done,
// the following two operations will retry after interrupt and finally
rethrow InterruptedException,
@@ -165,6 +170,7 @@
runMetadataTransaction(metadataProvider, () ->
dropSourceDataset(sourceDataset, metadataProvider, hcc));
});
LOGGER.info("Dataset {} rebalance completed successfully",
datasetName);
+ return true;
}
@FunctionalInterface
@@ -214,13 +220,14 @@
}
// Rebalances from the source to the target.
- private static void rebalance(Dataset source, Dataset target,
MetadataProvider metadataProvider,
+ private static boolean rebalance(Dataset source, Dataset target,
MetadataProvider metadataProvider,
IHyracksClientConnection hcc, IDatasetRebalanceCallback
datasetRebalanceCallback) throws Exception {
+ boolean success;
// Drops the target dataset files (if any) to make rebalance
idempotent.
dropDatasetFiles(target, metadataProvider, hcc);
// Performs the specified operation before the target dataset is
populated.
- datasetRebalanceCallback.beforeRebalance(metadataProvider, source,
target, hcc);
+ success = datasetRebalanceCallback.beforeRebalance(metadataProvider,
source, target, hcc);
// Creates the rebalance target.
createRebalanceTarget(target, metadataProvider, hcc);
@@ -233,6 +240,8 @@
// Performs the specified operation after the target dataset is
populated.
datasetRebalanceCallback.afterRebalance(metadataProvider, source,
target, hcc);
+
+ return success;
}
// Switches the metadata entity from the source dataset to the target
dataset.
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/NodeGroup.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/NodeGroup.java
index a8d027f..a50fd4a 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/NodeGroup.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/NodeGroup.java
@@ -20,6 +20,7 @@
package org.apache.asterix.metadata.entities;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -42,7 +43,7 @@
this.nodeNames = nodeNames;
}
- public static NodeGroup createOrdered(String groupName, List<String>
nodeNames) {
+ public static NodeGroup createOrdered(String groupName, Collection<String>
nodeNames) {
List<String> sortedNodeNames = new ArrayList<>(nodeNames);
Collections.sort(sortedNodeNames);
return new NodeGroup(groupName, sortedNodeNames);
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
index 6529794..b2e6817 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
@@ -21,7 +21,6 @@
import static org.apache.asterix.common.utils.IdentifierUtil.dataset;
import java.io.DataOutput;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -613,10 +612,10 @@
appCtx.getMetadataLockManager().acquireNodeGroupWriteLock(metadataProvider.getLocks(),
nodeGroup);
NodeGroup ng = MetadataManager.INSTANCE.getNodegroup(mdTxnCtx,
nodeGroup);
if (ng != null) {
- nodeGroup = nodeGroup + "_" + UUID.randomUUID().toString();
+ nodeGroup = nodeGroup + "_" + UUID.randomUUID();
appCtx.getMetadataLockManager().acquireNodeGroupWriteLock(metadataProvider.getLocks(),
nodeGroup);
}
- MetadataManager.INSTANCE.addNodegroup(mdTxnCtx,
NodeGroup.createOrdered(nodeGroup, new ArrayList<>(ncNames)));
+ MetadataManager.INSTANCE.addNodegroup(mdTxnCtx,
NodeGroup.createOrdered(nodeGroup, ncNames));
return nodeGroup;
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17608
To unsubscribe, or for help writing mail filters, visit
https://asterix-gerrit.ics.uci.edu/settings
Gerrit-Project: asterixdb
Gerrit-Branch: neo
Gerrit-Change-Id: I1b2cdb56d70ce47c7b15061cc5ecc4af36ed8f61
Gerrit-Change-Number: 17608
Gerrit-PatchSet: 1
Gerrit-Owner: Michael Blow <[email protected]>
Gerrit-MessageType: newchange