This is an automated email from the ASF dual-hosted git repository. dlych pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit fae6e3b7ae81bb06818ef4e909db1e7604d54edb Author: Ali Alsuliman <ali.al.solai...@gmail.com> AuthorDate: Tue Dec 15 11:13:24 2020 -0800 [NO ISSUE] Force flag for dataset drop & query service servlet refactoring - user model changes: no - storage format changes: no - interface changes: no Details: Expose the force flag for dataset drop to extensions. Change-Id: I0cf4afa65752e3faa4351d51098f9f78412ba88c Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/9325 Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Ali Alsuliman <ali.al.solai...@gmail.com> Reviewed-by: Dmitry Lychagin <dmitry.lycha...@couchbase.com> --- .../apache/asterix/translator/IRequestParameters.java | 6 ++++++ .../asterix/api/http/server/QueryServiceServlet.java | 19 ++++++++++++++----- .../asterix/app/translator/QueryTranslator.java | 13 ++++++++----- .../asterix/app/translator/RequestParameters.java | 17 +++++++++++++++++ .../java/org/apache/asterix/utils/RebalanceUtil.java | 2 +- .../org/apache/asterix/metadata/MetadataManager.java | 6 +++--- .../org/apache/asterix/metadata/MetadataNode.java | 4 ---- .../apache/asterix/metadata/api/IMetadataManager.java | 4 +++- .../apache/asterix/metadata/api/IMetadataNode.java | 4 +++- .../asterix/metadata/bootstrap/MetadataBootstrap.java | 2 +- .../org/apache/asterix/metadata/entities/Dataset.java | 8 ++++---- 11 files changed, 60 insertions(+), 25 deletions(-) diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java index 417a130..4ad1040 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java @@ -67,4 +67,10 @@ public interface IRequestParameters extends ICommonRequestParameters { * {@code 0} if all categories are allowed */ int getStatementCategoryRestrictionMask(); + + /** + * @return true if DROP DATASET statements in the request should force drop datasets which could make the metadata + * inconsistent. + */ + boolean isForceDropDataset(); } diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java index d43e611..6de91d8 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java @@ -90,6 +90,7 @@ import org.apache.hyracks.api.application.IServiceContext; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.api.exceptions.HyracksException; import org.apache.hyracks.api.exceptions.Warning; +import org.apache.hyracks.api.result.IResultSet; import org.apache.hyracks.control.common.controllers.CCConfig; import org.apache.hyracks.http.api.IServletRequest; import org.apache.hyracks.http.api.IServletResponse; @@ -269,7 +270,7 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { SessionOutput sessionOutput = createSessionOutput(httpWriter); ResponsePrinter responsePrinter = new ResponsePrinter(sessionOutput); ResultDelivery delivery = ResultDelivery.IMMEDIATE; - QueryServiceRequestParameters param = newRequestParameters(); + QueryServiceRequestParameters param = newQueryRequestParameters(); RequestExecutionState executionState = newRequestExecutionState(); try { // buffer the output until we are ready to set the status of the response message correctly @@ -411,9 +412,8 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { int stmtCategoryRestriction = org.apache.asterix.app.translator.RequestParameters .getStatementCategoryRestrictionMask(param.isReadOnly()); IRequestParameters requestParameters = - new org.apache.asterix.app.translator.RequestParameters(requestReference, statementsText, - getResultSet(), resultProperties, stats, statementProperties, null, param.getClientContextID(), - optionalParameters, stmtParams, param.isMultiStatement(), stmtCategoryRestriction); + newRequestParameters(param, requestReference, statementsText, getResultSet(), resultProperties, stats, + statementProperties, optionalParameters, stmtParams, stmtCategoryRestriction); translator.compileAndExecute(getHyracksClientConnection(), requestParameters); executionState.end(); translator.getWarnings(warnings, maxWarnings - warnings.size()); @@ -492,10 +492,19 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { responsePrinter.addResultPrinter(new ErrorsPrinter(Collections.singletonList(executionError))); } - protected QueryServiceRequestParameters newRequestParameters() { + protected QueryServiceRequestParameters newQueryRequestParameters() { return new QueryServiceRequestParameters(); } + protected IRequestParameters newRequestParameters(QueryServiceRequestParameters param, + IRequestReference requestReference, String statementsText, IResultSet resultSet, + ResultProperties resultProperties, Stats stats, IStatementExecutor.StatementProperties statementProperties, + Map<String, String> optionalParameters, Map<String, IAObject> stmtParams, int stmtCategoryRestriction) { + return new RequestParameters(requestReference, statementsText, resultSet, resultProperties, stats, + statementProperties, null, param.getClientContextID(), optionalParameters, stmtParams, + param.isMultiStatement(), stmtCategoryRestriction); + } + protected static boolean isPrintingProfile(IStatementExecutor.Stats stats) { return stats.getProfileType() == Stats.ProfileType.FULL && stats.getJobProfile() != null; } diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java index 2ba5c0e..c000d8b 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java @@ -857,7 +857,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen // #. add a new dataset with PendingNoOp after deleting the dataset with // PendingAddOp - MetadataManager.INSTANCE.dropDataset(metadataProvider.getMetadataTxnContext(), dataverseName, datasetName); + MetadataManager.INSTANCE.dropDataset(metadataProvider.getMetadataTxnContext(), dataverseName, datasetName, + requestParameters.isForceDropDataset()); dataset.setPendingOp(MetadataUtil.PENDING_NO_OP); MetadataManager.INSTANCE.addDataset(metadataProvider.getMetadataTxnContext(), dataset); MetadataManager.INSTANCE.commitTransaction(mdTxnCtx); @@ -894,7 +895,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen mdTxnCtx = MetadataManager.INSTANCE.beginTransaction(); metadataProvider.setMetadataTxnContext(mdTxnCtx); try { - MetadataManager.INSTANCE.dropDataset(mdTxnCtx, dataverseName, datasetName); + MetadataManager.INSTANCE.dropDataset(mdTxnCtx, dataverseName, datasetName, + requestParameters.isForceDropDataset()); if (itemTypeAdded) { MetadataManager.INSTANCE.dropDatatype(mdTxnCtx, itemTypeEntity.getDataverseName(), itemTypeEntity.getDatatypeName()); @@ -1692,7 +1694,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen validateDatasetState(metadataProvider, ds, sourceLoc); ds.drop(metadataProvider, mdTxnCtx, jobsToExecute, bActiveTxn, progress, hcc, dropCorrespondingNodeGroup, - sourceLoc, Collections.emptySet()); + sourceLoc, Collections.emptySet(), requestParameters.isForceDropDataset()); MetadataManager.INSTANCE.commitTransaction(mdTxnCtx.getValue()); return true; @@ -1709,7 +1711,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen if (ds != null) { jobsToExecute.clear(); ds.drop(metadataProvider, mdTxnCtx, jobsToExecute, bActiveTxn, progress, hcc, - dropCorrespondingNodeGroup, sourceLoc, EnumSet.of(DropOption.IF_EXISTS)); + dropCorrespondingNodeGroup, sourceLoc, EnumSet.of(DropOption.IF_EXISTS), + requestParameters.isForceDropDataset()); } for (JobSpecification jobSpec : jobsToExecute) { JobUtils.runJob(hcc, jobSpec, true); @@ -1724,7 +1727,7 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen metadataProvider.setMetadataTxnContext(mdTxnCtx.getValue()); try { MetadataManager.INSTANCE.dropDataset(metadataProvider.getMetadataTxnContext(), dataverseName, - datasetName); + datasetName, requestParameters.isForceDropDataset()); MetadataManager.INSTANCE.commitTransaction(mdTxnCtx.getValue()); } catch (Exception e2) { e.addSuppressed(e2); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java index 5ebc9ba..d5ea685 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java @@ -58,6 +58,7 @@ public class RequestParameters implements IRequestParameters { private final boolean multiStatement; private final int statementCategoryRestrictionMask; private final String statement; + private final boolean forceDropDataset; public RequestParameters(IRequestReference requestReference, String statement, IResultSet resultSet, ResultProperties resultProperties, Stats stats, StatementProperties statementProperties, @@ -72,6 +73,16 @@ public class RequestParameters implements IRequestParameters { IStatementExecutor.ResultMetadata outMetadata, String clientContextId, Map<String, String> optionalParameters, Map<String, IAObject> statementParameters, boolean multiStatement, int statementCategoryRestrictionMask) { + this(requestReference, statement, resultSet, resultProperties, stats, statementProperties, outMetadata, + clientContextId, optionalParameters, statementParameters, multiStatement, + statementCategoryRestrictionMask, false); + } + + public RequestParameters(IRequestReference requestReference, String statement, IResultSet resultSet, + ResultProperties resultProperties, Stats stats, StatementProperties statementProperties, + IStatementExecutor.ResultMetadata outMetadata, String clientContextId, + Map<String, String> optionalParameters, Map<String, IAObject> statementParameters, boolean multiStatement, + int statementCategoryRestrictionMask, boolean forceDropDataset) { this.requestReference = requestReference; this.statement = statement; this.resultSet = resultSet; @@ -84,6 +95,7 @@ public class RequestParameters implements IRequestParameters { this.statementParameters = statementParameters; this.multiStatement = multiStatement; this.statementCategoryRestrictionMask = statementCategoryRestrictionMask; + this.forceDropDataset = forceDropDataset; } @Override @@ -127,6 +139,11 @@ public class RequestParameters implements IRequestParameters { } @Override + public boolean isForceDropDataset() { + return forceDropDataset; + } + + @Override public int getStatementCategoryRestrictionMask() { return statementCategoryRestrictionMask; } 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 d32bfb2..7ad90ad 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 @@ -419,7 +419,7 @@ public class RebalanceUtil { // drop dataset entry from metadata runMetadataTransaction(metadataProvider, () -> MetadataManager.INSTANCE.dropDataset(metadataProvider.getMetadataTxnContext(), - dataset.getDataverseName(), dataset.getDatasetName())); + dataset.getDataverseName(), dataset.getDatasetName(), false)); MetadataManager.INSTANCE.commitTransaction(metadataProvider.getMetadataTxnContext()); // try to drop the dataset's node group runMetadataTransaction(metadataProvider, () -> tryDropDatasetNodegroup(dataset, metadataProvider)); diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java index 268a9c0..a481f99 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java @@ -260,10 +260,10 @@ public abstract class MetadataManager implements IMetadataManager { } @Override - public void dropDataset(MetadataTransactionContext ctx, DataverseName dataverseName, String datasetName) - throws AlgebricksException { + public void dropDataset(MetadataTransactionContext ctx, DataverseName dataverseName, String datasetName, + boolean force) throws AlgebricksException { try { - metadataNode.dropDataset(ctx.getTxnId(), dataverseName, datasetName); + metadataNode.dropDataset(ctx.getTxnId(), dataverseName, datasetName, force); } catch (RemoteException e) { throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e); } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java index 88098f8..c80f7ad 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java @@ -605,10 +605,6 @@ public class MetadataNode implements IMetadataNode { } @Override - public void dropDataset(TxnId txnId, DataverseName dataverseName, String datasetName) throws AlgebricksException { - dropDataset(txnId, dataverseName, datasetName, false); - } - public void dropDataset(TxnId txnId, DataverseName dataverseName, String datasetName, boolean force) throws AlgebricksException { if (!force) { diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java index 1646a93..139216e 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java @@ -212,10 +212,12 @@ public interface IMetadataManager extends IMetadataBootstrap { * Name of dataverse which holds the given dataset. * @param datasetName * Name of dataset to delete. + * @param force + * If true, forces drop the dataset. Setting it to true could make the metadata inconsistent. * @throws AlgebricksException * For example, if the dataset and/or dataverse does not exist. */ - void dropDataset(MetadataTransactionContext ctx, DataverseName dataverseName, String datasetName) + void dropDataset(MetadataTransactionContext ctx, DataverseName dataverseName, String datasetName, boolean force) throws AlgebricksException; /** diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java index bca4171..08ed0a3 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java @@ -217,11 +217,13 @@ public interface IMetadataNode extends Remote, Serializable { * Name of dataverse which holds the given dataset. * @param datasetName * Name of dataset to delete. + * @param force + * If true, forces drop the dataset. Setting it to true could make the metadata inconsistent. * @throws AlgebricksException * For example, if the dataset and/or dataverse does not exist. * @throws RemoteException */ - void dropDataset(TxnId txnId, DataverseName dataverseName, String datasetName) + void dropDataset(TxnId txnId, DataverseName dataverseName, String datasetName, boolean force) throws AlgebricksException, RemoteException; /** diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java index 2aca994..8cfd146 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java @@ -471,7 +471,7 @@ public class MetadataBootstrap { throws AlgebricksException { if (dataset.getPendingOp() != MetadataUtil.PENDING_NO_OP) { // drop pending dataset - MetadataManager.INSTANCE.dropDataset(mdTxnCtx, dataset.getDataverseName(), dataset.getDatasetName()); + MetadataManager.INSTANCE.dropDataset(mdTxnCtx, dataset.getDataverseName(), dataset.getDatasetName(), true); if (LOGGER.isInfoEnabled()) { LOGGER.info( "Dropped a pending dataset: " + dataset.getDataverseName() + "." + dataset.getDatasetName()); diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java index 4e556a2..dd3f67d 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java @@ -347,7 +347,7 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { public void drop(MetadataProvider metadataProvider, MutableObject<MetadataTransactionContext> mdTxnCtx, List<JobSpecification> jobsToExecute, MutableBoolean bActiveTxn, MutableObject<ProgressState> progress, IHyracksClientConnection hcc, boolean dropCorrespondingNodeGroup, SourceLocation sourceLoc, - Set<DropOption> options) throws Exception { + Set<DropOption> options, boolean force) throws Exception { Map<FeedConnectionId, Pair<JobSpecification, Boolean>> disconnectJobList = new HashMap<>(); if (getDatasetType() == DatasetType.INTERNAL) { // #. prepare jobs to drop the datatset and the indexes in NC @@ -361,7 +361,7 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { } jobsToExecute.add(DatasetUtil.dropDatasetJobSpec(this, metadataProvider, options)); // #. mark the existing dataset as PendingDropOp - MetadataManager.INSTANCE.dropDataset(mdTxnCtx.getValue(), dataverseName, datasetName); + MetadataManager.INSTANCE.dropDataset(mdTxnCtx.getValue(), dataverseName, datasetName, force); MetadataManager.INSTANCE.addDataset(mdTxnCtx.getValue(), new Dataset(dataverseName, datasetName, getItemTypeDataverseName(), getItemTypeName(), getMetaItemTypeDataverseName(), getMetaItemTypeName(), getNodeGroupName(), @@ -401,7 +401,7 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { } // #. mark the existing dataset as PendingDropOp - MetadataManager.INSTANCE.dropDataset(mdTxnCtx.getValue(), dataverseName, datasetName); + MetadataManager.INSTANCE.dropDataset(mdTxnCtx.getValue(), dataverseName, datasetName, force); MetadataManager.INSTANCE.addDataset(mdTxnCtx.getValue(), new Dataset(dataverseName, datasetName, getItemTypeDataverseName(), getItemTypeName(), getNodeGroupName(), getCompactionPolicy(), getCompactionPolicyProperties(), @@ -425,7 +425,7 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { } // #. finally, delete the dataset. - MetadataManager.INSTANCE.dropDataset(mdTxnCtx.getValue(), dataverseName, datasetName); + MetadataManager.INSTANCE.dropDataset(mdTxnCtx.getValue(), dataverseName, datasetName, force); // drop inline types if (TypeUtil.isDatasetInlineTypeName(this, recordTypeDataverseName, recordTypeName)) {