Repository: asterixdb Updated Branches: refs/heads/master 1af5f7e76 -> 76c11424f
[ASTERIXDB-2246][STO] Ensure Metadata Cache Updated on Rebalance - user model changes: no - storage format changes: no - interface changes: no Details: - Ensure metadata cache is updated to the target dataset by commiting the transaction before downgrading the write lock. This prevents waiting readers from reading a stale cache that points to the source dataset that will be dropped. Change-Id: I222be5d551a6dae66bf97c4bccf696f5b916d9b5 Reviewed-on: https://asterix-gerrit.ics.uci.edu/2282 Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Michael Blow <mb...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/76c11424 Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/76c11424 Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/76c11424 Branch: refs/heads/master Commit: 76c11424f43e62ffce4a5824e7507c9f44363047 Parents: 1af5f7e Author: Murtadha Hubail <mhub...@apache.org> Authored: Tue Jan 16 17:07:27 2018 +0300 Committer: Murtadha Hubail <mhub...@apache.org> Committed: Tue Jan 16 10:01:33 2018 -0800 ---------------------------------------------------------------------- .../org/apache/asterix/utils/RebalanceUtil.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76c11424/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 1a14864..16ffd40 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 @@ -21,6 +21,7 @@ package org.apache.asterix.utils; import static org.apache.asterix.app.translator.QueryTranslator.abort; import static org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.DropOption; +import java.rmi.RemoteException; import java.util.ArrayList; import java.util.EnumSet; import java.util.HashSet; @@ -153,7 +154,7 @@ public class RebalanceUtil { // Executes the 2nd Metadata transaction for switching the metadata entity. // It detaches the source dataset and attaches the target dataset to metadata's point of view. runMetadataTransaction(metadataProvider, - () -> rebalanceSwitch(sourceDataset, targetDataset, metadataProvider, hcc)); + () -> rebalanceSwitch(sourceDataset, targetDataset, metadataProvider)); // Executes the 3rd Metadata transaction to drop the source dataset files and the node group for // the source dataset. runMetadataTransaction(metadataProvider, () -> dropSourceDataset(sourceDataset, metadataProvider, hcc)); @@ -200,8 +201,6 @@ public class RebalanceUtil { try { // Performs the actual work. work.run(); - // Complete the metadata transaction. - MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); } catch (Exception e) { abort(e, e, mdTxnCtx); throw e; @@ -231,15 +230,15 @@ public class RebalanceUtil { } // Switches the metadata entity from the source dataset to the target dataset. - private static void rebalanceSwitch(Dataset source, Dataset target, MetadataProvider metadataProvider, - IHyracksClientConnection hcc) throws Exception { + private static void rebalanceSwitch(Dataset source, Dataset target, MetadataProvider metadataProvider) + throws AlgebricksException, RemoteException { MetadataTransactionContext mdTxnCtx = metadataProvider.getMetadataTxnContext(); // upgrade lock ICcApplicationContext appCtx = metadataProvider.getApplicationContext(); ActiveNotificationHandler activeNotificationHandler = (ActiveNotificationHandler) appCtx.getActiveNotificationHandler(); IMetadataLockManager lockManager = appCtx.getMetadataLockManager(); - lockManager.upgradeDatasetLockToWrite(metadataProvider.getLocks(), DatasetUtil.getFullyQualifiedName(target)); + lockManager.upgradeDatasetLockToWrite(metadataProvider.getLocks(), DatasetUtil.getFullyQualifiedName(source)); try { // Updates the dataset entry in the metadata storage MetadataManager.INSTANCE.updateDataset(mdTxnCtx, target); @@ -249,6 +248,7 @@ public class RebalanceUtil { controller.replace(target); } } + MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); } finally { lockManager.downgradeDatasetLockToExclusiveModify(metadataProvider.getLocks(), DatasetUtil.getFullyQualifiedName(target)); @@ -261,8 +261,8 @@ public class RebalanceUtil { // Drops the source dataset files. No need to lock the dataset entity here because the source dataset has // been detached at this point. dropDatasetFiles(source, metadataProvider, hcc); - tryDropDatasetNodegroup(source, metadataProvider); + MetadataManager.INSTANCE.commitTransaction(metadataProvider.getMetadataTxnContext()); } // Drops the metadata entry of source dataset's node group. @@ -408,8 +408,10 @@ public class RebalanceUtil { runMetadataTransaction(metadataProvider, () -> MetadataManager.INSTANCE .dropDataset(metadataProvider.getMetadataTxnContext(), dataset.getDataverseName(), dataset.getDatasetName())); + MetadataManager.INSTANCE.commitTransaction(metadataProvider.getMetadataTxnContext()); // try to drop the dataset's node group runMetadataTransaction(metadataProvider, () -> tryDropDatasetNodegroup(dataset, metadataProvider)); + MetadataManager.INSTANCE.commitTransaction(metadataProvider.getMetadataTxnContext()); }); } }