@Override protected void doExecute(MetadataProvider mdProvider) throws Exception { String dataverseName = actionListener.getEntityId().getDataverse(); String entityName = actionListener.getEntityId().getEntityName(); try { lockManager.acquireActiveEntityWriteLock(mdProvider.getLocks(), dataverseName + '.' + entityName); List<Dataset> datasets = actionListener.getDatasets(); for (Dataset dataset : datasets) { MetadataLockUtil.modifyDatasetBegin(lockManager, mdProvider.getLocks(), dataverseName, DatasetUtil.getFullyQualifiedName(dataset)); } actionListener.stop(mdProvider); } finally { mdProvider.getLocks().reset(); } } };
@Override protected void doExecute(MetadataProvider mdProvider) throws Exception { String dataverseName = dataset.getDataverseName(); String datasetFullyQualifiedName = dataverseName + '.' + dataset.getDatasetName(); try { MetadataLockUtil.dropIndexBegin(lockManager, mdProvider.getLocks(), dataverseName, datasetFullyQualifiedName); if (actionListener.isActive()) { throw new RuntimeDataException( ErrorCode.CANNOT_REMOVE_INDEX_FROM_DATASET_CONNECTED_TO_ACTIVE_ENTITY, datasetFullyQualifiedName + ".index", actionListener.getEntityId(), actionListener.getState()); } } finally { mdProvider.getLocks().reset(); } } };
@Override protected void doExecute(MetadataProvider mdProvider) throws Exception { String dataverseName = actionListener.getEntityId().getDataverse(); String entityName = actionListener.getEntityId().getEntityName(); try { lockManager.acquireActiveEntityWriteLock(mdProvider.getLocks(), dataverseName + '.' + entityName); List<Dataset> datasets = actionListener.getDatasets(); for (Dataset dataset : datasets) { MetadataLockUtil.modifyDatasetBegin(lockManager, mdProvider.getLocks(), dataverseName, DatasetUtil.getFullyQualifiedName(dataset)); } actionListener.start(mdProvider); } finally { mdProvider.getLocks().reset(); } } };
@Override protected void doExecute(MetadataProvider mdProvider) throws Exception { String dataverseName = actionListener.getEntityId().getDataverse(); String entityName = actionListener.getEntityId().getEntityName(); List<Dataset> datasets = actionListener.getDatasets(); try { lockManager.acquireActiveEntityWriteLock(mdProvider.getLocks(), dataverseName + '.' + entityName); for (Dataset dataset : datasets) { lockManager.acquireDatasetExclusiveModificationLock(mdProvider.getLocks(), DatasetUtil.getFullyQualifiedName(dataset)); } actionListener.suspend(mdProvider); } catch (Exception e) { // only release in case of failure mdProvider.getLocks().reset(); throw e; } } };
@Override protected void doExecute(MetadataProvider mdProvider) throws Exception { String dataverseName = actionListener.getEntityId().getDataverse(); String entityName = actionListener.getEntityId().getEntityName(); try { lockManager.acquireActiveEntityWriteLock(mdProvider.getLocks(), dataverseName + '.' + entityName); List<Dataset> datasets = actionListener.getDatasets(); for (Dataset dataset : datasets) { lockManager.upgradeDatasetLockToWrite(mdProvider.getLocks(), DatasetUtil.getFullyQualifiedName(dataset)); lockManager.downgradeDatasetLockToExclusiveModify(mdProvider.getLocks(), DatasetUtil.getFullyQualifiedName(dataset)); } actionListener.resume(mdProvider); } finally { mdProvider.getLocks().reset(); } } };
@Override protected void doExecute(MetadataProvider mdProvider) throws Exception { String entityDataverseName = actionListener.getEntityId().getDataverse(); String entityName = actionListener.getEntityId().getEntityName(); try { lockManager.acquireActiveEntityReadLock(mdProvider.getLocks(), entityDataverseName + '.' + entityName); lockManager.acquireDatasetWriteLock(mdProvider.getLocks(), DatasetUtil.getFullyQualifiedName(dataset)); List<Dataset> datasets = clusterController.getAllDatasets(); if (datasets.contains(dataset)) { throw new HyracksDataException("Dataset " + dataset + " already exists"); } actionListener.add(dataset); datasets.add(dataset); } finally { mdProvider.getLocks().reset(); } } };
@Override protected void doExecute(MetadataProvider mdProvider) throws Exception { String entityDataverseName = actionListener.getEntityId().getDataverse(); String entityName = actionListener.getEntityId().getEntityName(); try { lockManager.acquireActiveEntityReadLock(mdProvider.getLocks(), entityDataverseName + '.' + entityName); // we have to first read lock all active entities before deleting a dataset lockManager.acquireDatasetWriteLock(mdProvider.getLocks(), DatasetUtil.getFullyQualifiedName(dataset)); List<Dataset> datasets = clusterController.getAllDatasets(); if (!datasets.contains(dataset)) { throw new HyracksDataException("Dataset " + dataset + " does not exist"); } actionListener.remove(dataset); datasets.remove(dataset); } finally { mdProvider.getLocks().reset(); } } };
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(source)); LOGGER.info("Updating dataset {} node group from {} to {}", source.getDatasetName(), source.getNodeGroupName(), target.getNodeGroupName()); try { // Updates the dataset entry in the metadata storage MetadataManager.INSTANCE.updateDataset(mdTxnCtx, target); for (IActiveEntityEventsListener listener : activeNotificationHandler.getEventListeners()) { if (listener instanceof IActiveEntityController) { IActiveEntityController controller = (IActiveEntityController) listener; controller.replace(target); } } MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); LOGGER.info("dataset {} node group updated to {}", target.getDatasetName(), target.getNodeGroupName()); } finally { lockManager.downgradeDatasetLockToExclusiveModify(metadataProvider.getLocks(), DatasetUtil.getFullyQualifiedName(target)); } }
@Override protected void doExecute(MetadataProvider mdProvider) throws Exception { String dataverseName = dataset.getDataverseName(); String datasetFullyQualifiedName = dataverseName + '.' + dataset.getDatasetName(); String indexFullyQualifiedName = datasetFullyQualifiedName + ".index"; try { MetadataLockUtil.createIndexBegin(lockManager, mdProvider.getLocks(), dataverseName, datasetFullyQualifiedName); if (actionListener.isActive()) { throw new RuntimeDataException(ErrorCode.CANNOT_ADD_INDEX_TO_DATASET_CONNECTED_TO_ACTIVE_ENTITY, indexFullyQualifiedName, actionListener.getEntityId(), actionListener.getState()); } } finally { mdProvider.getLocks().reset(); } } };