@Override public void unlock() { metadataProvider.getLocks().unlock(); } };
@Override public void lock() throws AlgebricksException { MetadataLockUtil.insertDeleteUpsertBegin(lockManager, metadataProvider.getLocks(), dataverseName + "." + stmtInsertUpsert.getDatasetName()); }
@Override public void unlock() { metadataProvider.getLocks().unlock(); // release external datasets' locks acquired during compilation of the query ExternalDatasetsRegistry.INSTANCE.releaseAcquiredLocks(metadataProvider); } };
private void rebalanceDataset(String dataverseName, String datasetName, String[] targetNodes) throws Exception { IHyracksClientConnection hcc = (IHyracksClientConnection) ctx.get(HYRACKS_CONNECTION_ATTR); MetadataProvider metadataProvider = new MetadataProvider(appCtx, null); try { ActiveNotificationHandler activeNotificationHandler = (ActiveNotificationHandler) appCtx.getActiveNotificationHandler(); activeNotificationHandler.suspend(metadataProvider); try { IMetadataLockManager lockManager = appCtx.getMetadataLockManager(); lockManager.acquireDatasetExclusiveModificationLock(metadataProvider.getLocks(), dataverseName + '.' + datasetName); RebalanceUtil.rebalance(dataverseName, datasetName, new LinkedHashSet<>(Arrays.asList(targetNodes)), metadataProvider, hcc, NoOpDatasetRebalanceCallback.INSTANCE); } finally { activeNotificationHandler.resume(metadataProvider); } } finally { metadataProvider.getLocks().unlock(); } }
protected void handleDataverseDropStatement(MetadataProvider metadataProvider, Statement stmt, IHyracksClientConnection hcc, IRequestParameters requestParameters) throws Exception { DataverseDropStatement stmtDelete = (DataverseDropStatement) stmt; SourceLocation sourceLoc = stmtDelete.getSourceLocation(); String dataverseName = stmtDelete.getDataverseName().getValue(); if (dataverseName.equals(MetadataBuiltinEntities.DEFAULT_DATAVERSE_NAME)) { throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLoc, MetadataBuiltinEntities.DEFAULT_DATAVERSE_NAME + " dataverse can't be dropped"); } lockManager.acquireDataverseWriteLock(metadataProvider.getLocks(), dataverseName); try { doDropDataverse(stmtDelete, sourceLoc, metadataProvider, hcc); } finally { metadataProvider.getLocks().unlock(); ExternalDatasetsRegistry.INSTANCE.releaseAcquiredLocks(metadataProvider); } }
@Override protected void doExecute(MetadataProvider mdProvider) throws Exception { String dataverseName = dataset.getDataverseName(); String datasetFullyQualifiedName = dataverseName + '.' + dataset.getDatasetName(); try { lockManager.acquireDataverseReadLock(mdProvider.getLocks(), dataverseName); lockManager.acquireDatasetReadLock(mdProvider.getLocks(), datasetFullyQualifiedName); if (!semaphore.tryAcquire()) { semaphore.acquire(); } } finally { mdProvider.getLocks().reset(); } } };
protected void handleCreateDataverseStatement(MetadataProvider metadataProvider, Statement stmt, IRequestParameters requestParameters) throws Exception { CreateDataverseStatement stmtCreateDataverse = (CreateDataverseStatement) stmt; String dvName = stmtCreateDataverse.getDataverseName().getValue(); MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); metadataProvider.setMetadataTxnContext(mdTxnCtx); lockManager.acquireDataverseReadLock(metadataProvider.getLocks(), dvName); try { doCreateDataverseStatement(mdTxnCtx, metadataProvider, stmtCreateDataverse); } catch (Exception e) { abort(e, e, mdTxnCtx); throw e; } finally { metadataProvider.getLocks().unlock(); } }
@Override protected void doExecute(MetadataProvider mdProvider) throws Exception { try { handler.resume(mdProvider); } finally { mdProvider.getLocks().reset(); } } };
public void handleDatasetDropStatement(MetadataProvider metadataProvider, Statement stmt, IHyracksClientConnection hcc, IRequestParameters requestParameters) throws Exception { DropDatasetStatement stmtDelete = (DropDatasetStatement) stmt; SourceLocation sourceLoc = stmtDelete.getSourceLocation(); String dataverseName = getActiveDataverse(stmtDelete.getDataverseName()); String datasetName = stmtDelete.getDatasetName().getValue(); MetadataLockUtil.dropDatasetBegin(lockManager, metadataProvider.getLocks(), dataverseName, dataverseName + "." + datasetName); try { doDropDataset(dataverseName, datasetName, metadataProvider, stmtDelete.getIfExists(), hcc, true, sourceLoc); } finally { metadataProvider.getLocks().unlock(); } }
private static void tryDropDatasetNodegroup(Dataset source, MetadataProvider metadataProvider) throws Exception { ICcApplicationContext appCtx = metadataProvider.getApplicationContext(); String sourceNodeGroup = source.getNodeGroupName(); appCtx.getMetadataLockManager().acquireNodeGroupWriteLock(metadataProvider.getLocks(), sourceNodeGroup); MetadataManager.INSTANCE.dropNodegroup(metadataProvider.getMetadataTxnContext(), sourceNodeGroup, true); }
@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 = 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 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 = 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(); } } };
@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 setRunning(MetadataProvider metadataProvider, boolean running) { try { IMetadataLockManager lockManager = metadataProvider.getApplicationContext().getMetadataLockManager(); LockList locks = metadataProvider.getLocks(); lockManager.acquireDataverseReadLock(locks, entityId.getDataverse()); lockManager.acquireActiveEntityWriteLock(locks, entityId.getDataverse() + '.' + entityId.getEntityName()); // persist entity } catch (Throwable th) { // This failure puts the system in a bad state. throw new IllegalStateException(th); } }
public IResourceFactory getPrimaryResourceFactory(IHyracksTaskContext ctx, PrimaryIndexInfo primaryIndexInfo, IStorageComponentProvider storageComponentProvider, Dataset dataset) throws AlgebricksException { Dataverse dataverse = new Dataverse(dataset.getDataverseName(), NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP); Index index = primaryIndexInfo.getIndex(); CcApplicationContext appCtx = (CcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(); MetadataProvider mdProvider = new MetadataProvider(appCtx, dataverse); try { return dataset.getResourceFactory(mdProvider, index, primaryIndexInfo.recordType, primaryIndexInfo.metaType, primaryIndexInfo.mergePolicyFactory, primaryIndexInfo.mergePolicyProperties); } finally { mdProvider.getLocks().unlock(); } }
private ARecordType getMetadataRecordType(String dataverseName, String datasetName) throws Exception { MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); // Retrieves file splits of the dataset. MetadataProvider metadataProvider = new MetadataProvider( (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(), null); try { metadataProvider.setMetadataTxnContext(mdTxnCtx); Dataset dataset = metadataProvider.findDataset(dataverseName, datasetName); ARecordType recordType = (ARecordType) metadataProvider.findType(dataset.getItemTypeDataverseName(), dataset.getItemTypeName()); // Metadata transaction commits. MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); return recordType; } finally { metadataProvider.getLocks().unlock(); } } }
private void addDataset(ICcApplicationContext appCtx, Dataset source, int datasetPostfix, boolean abort) throws Exception { Dataset dataset = new Dataset(source.getDataverseName(), "ds_" + datasetPostfix, source.getDataverseName(), source.getDatasetType().name(), source.getNodeGroupName(), NoMergePolicyFactory.NAME, null, source.getDatasetDetails(), source.getHints(), DatasetConfig.DatasetType.INTERNAL, datasetPostfix, 0); MetadataProvider metadataProvider = new MetadataProvider(appCtx, null); final MetadataTransactionContext writeTxn = MetadataManager.INSTANCE.beginTransaction(); metadataProvider.setMetadataTxnContext(writeTxn); try { MetadataManager.INSTANCE.addDataset(writeTxn, dataset); if (abort) { MetadataManager.INSTANCE.abortTransaction(writeTxn); } else { MetadataManager.INSTANCE.commitTransaction(writeTxn); } } finally { metadataProvider.getLocks().unlock(); } } }