Repository: asterixdb Updated Branches: refs/heads/master b5d4f56ae -> b8cc121cf
[ASTERIXDB-2005][CLUS] Treat dataset rebalance to no nodes as drop - user model changes: no - storage format changes: no - interface changes: no Details: - Drop dataset when rebalanced to empty target nodes Change-Id: I46f687e6006cba952dbfa1fa7771c7c2b7c13472 Reviewed-on: https://asterix-gerrit.ics.uci.edu/1906 Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> BAD: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Till Westmann <ti...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/b8cc121c Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/b8cc121c Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/b8cc121c Branch: refs/heads/master Commit: b8cc121cf5b38bce3c0c758c008ab036efe71d9d Parents: b5d4f56 Author: Murtadha Hubail <mhub...@apache.org> Authored: Sat Jul 29 02:00:31 2017 +0300 Committer: Murtadha Hubail <mhub...@apache.org> Committed: Sat Jul 29 02:22:46 2017 -0700 ---------------------------------------------------------------------- .../org/apache/asterix/utils/RebalanceUtil.java | 51 +++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/b8cc121c/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java ---------------------------------------------------------------------- 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 4174685..ceaf4cf 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 @@ -112,17 +112,21 @@ public class RebalanceUtil { return; } - // Creates a node group for rebalance. - String nodeGroupName = DatasetUtil.createNodeGroupForNewDataset(sourceDataset.getDataverseName(), - sourceDataset.getDatasetName(), sourceDataset.getRebalanceCount() + 1, targetNcNames, - metadataProvider); - - // The target dataset for rebalance. - targetDataset = sourceDataset.getTargetDatasetForRebalance(nodeGroupName); - - // Rebalances the source dataset into the target dataset. - rebalance(sourceDataset, targetDataset, metadataProvider, hcc, datasetRebalanceCallback); - + if (!targetNcNames.isEmpty()) { + // Creates a node group for rebalance. + String nodeGroupName = DatasetUtil + .createNodeGroupForNewDataset(sourceDataset.getDataverseName(), sourceDataset.getDatasetName(), + sourceDataset.getRebalanceCount() + 1, targetNcNames, metadataProvider); + // The target dataset for rebalance. + targetDataset = sourceDataset.getTargetDatasetForRebalance(nodeGroupName); + + // Rebalances the source dataset into the target dataset. + rebalance(sourceDataset, targetDataset, metadataProvider, hcc, datasetRebalanceCallback); + } else { + targetDataset = null; + // if this the last NC in the cluster, just drop the dataset + purgeDataset(sourceDataset, metadataProvider, hcc); + } // Complete the metadata transaction. MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); } catch (Exception e) { @@ -130,6 +134,10 @@ public class RebalanceUtil { throw e; } + if (targetNcNames.isEmpty()) { + // Nothing else to do since the dataset was dropped. + return; + } // 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, // which means that they will always succeed and could possibly throw InterruptedException as the last step. @@ -243,7 +251,11 @@ public class RebalanceUtil { // been detached at this point. dropDatasetFiles(source, metadataProvider, hcc); - // Drops the metadata entry of source dataset's node group. + tryDropDatasetNodegroup(source, metadataProvider); + } + + // Drops the metadata entry of source dataset's node group. + private static void tryDropDatasetNodegroup(Dataset source, MetadataProvider metadataProvider) throws Exception { ICcApplicationContext appCtx = metadataProvider.getApplicationContext(); String sourceNodeGroup = source.getNodeGroupName(); appCtx.getMetadataLockManager().acquireNodeGroupWriteLock(metadataProvider.getLocks(), sourceNodeGroup); @@ -373,4 +385,19 @@ public class RebalanceUtil { } return pkIndexes; } + + private static void purgeDataset(Dataset dataset, MetadataProvider metadataProvider, IHyracksClientConnection hcc) + throws Exception { + runWithRetryAfterInterrupt(() -> { + // drop dataset files + dropDatasetFiles(dataset, metadataProvider, hcc); + + // drop dataset entry from metadata + runMetadataTransaction(metadataProvider, () -> MetadataManager.INSTANCE + .dropDataset(metadataProvider.getMetadataTxnContext(), dataset.getDataverseName(), + dataset.getDatasetName())); + // try to drop the dataset's node group + runMetadataTransaction(metadataProvider, () -> tryDropDatasetNodegroup(dataset, metadataProvider)); + }); + } }