blob: 0ddd87a9b057f669784cd9e57587e5cc4b29b8e8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.internal.commandline.query;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.logging.Logger;
import org.apache.ignite.internal.client.GridClient;
import org.apache.ignite.internal.client.GridClientConfiguration;
import org.apache.ignite.internal.commandline.AbstractCommand;
import org.apache.ignite.internal.commandline.Command;
import org.apache.ignite.internal.commandline.CommandArgIterator;
import org.apache.ignite.internal.commandline.CommandLogger;
import org.apache.ignite.internal.util.typedef.T2;
import org.apache.ignite.internal.visor.compute.VisorComputeCancelSessionTask;
import org.apache.ignite.internal.visor.compute.VisorComputeCancelSessionTaskArg;
import org.apache.ignite.internal.visor.consistency.VisorConsistencyCancelTask;
import org.apache.ignite.internal.visor.query.VisorContinuousQueryCancelTask;
import org.apache.ignite.internal.visor.query.VisorContinuousQueryCancelTaskArg;
import org.apache.ignite.internal.visor.query.VisorQueryCancelOnInitiatorTask;
import org.apache.ignite.internal.visor.query.VisorQueryCancelOnInitiatorTaskArg;
import org.apache.ignite.internal.visor.query.VisorScanQueryCancelTask;
import org.apache.ignite.internal.visor.query.VisorScanQueryCancelTaskArg;
import org.apache.ignite.internal.visor.service.VisorCancelServiceTask;
import org.apache.ignite.internal.visor.service.VisorCancelServiceTaskArg;
import org.apache.ignite.internal.visor.snapshot.VisorSnapshotCancelTask;
import org.apache.ignite.internal.visor.snapshot.VisorSnapshotCancelTaskArg;
import org.apache.ignite.internal.visor.tx.VisorTxOperation;
import org.apache.ignite.internal.visor.tx.VisorTxTask;
import org.apache.ignite.internal.visor.tx.VisorTxTaskArg;
import org.apache.ignite.lang.IgniteUuid;
import org.apache.ignite.mxbean.ComputeMXBean;
import org.apache.ignite.mxbean.QueryMXBean;
import org.apache.ignite.mxbean.ServiceMXBean;
import org.apache.ignite.mxbean.TransactionsMXBean;
import static java.util.Collections.singletonMap;
import static org.apache.ignite.internal.QueryMXBeanImpl.EXPECTED_GLOBAL_QRY_ID_FORMAT;
import static org.apache.ignite.internal.commandline.CommandList.KILL;
import static org.apache.ignite.internal.commandline.TaskExecutor.BROADCAST_UUID;
import static org.apache.ignite.internal.commandline.TaskExecutor.executeTaskByNameOnNode;
import static org.apache.ignite.internal.commandline.query.KillSubcommand.COMPUTE;
import static org.apache.ignite.internal.commandline.query.KillSubcommand.CONTINUOUS;
import static org.apache.ignite.internal.commandline.query.KillSubcommand.SCAN;
import static org.apache.ignite.internal.commandline.query.KillSubcommand.SERVICE;
import static org.apache.ignite.internal.commandline.query.KillSubcommand.SNAPSHOT;
import static org.apache.ignite.internal.commandline.query.KillSubcommand.SQL;
import static org.apache.ignite.internal.commandline.query.KillSubcommand.TRANSACTION;
import static org.apache.ignite.internal.sql.command.SqlKillQueryCommand.parseGlobalQueryId;
/**
* control.sh kill command.
*
* @see KillSubcommand
* @see QueryMXBean
* @see ServiceMXBean
* @see ComputeMXBean
* @see TransactionsMXBean
*/
public class KillCommand extends AbstractCommand<Object> {
/** Command argument. */
private Object taskArgs;
/** Task name. */
private String taskName;
/** Node id. */
private UUID nodeId;
/** {@inheritDoc} */
@Override public Object execute(GridClientConfiguration clientCfg, Logger log) throws Exception {
try (GridClient client = Command.startClient(clientCfg)) {
return executeTaskByNameOnNode(
client,
taskName,
taskArgs,
nodeId,
clientCfg
);
}
catch (Throwable e) {
log.severe("Failed to perform operation.");
log.severe(CommandLogger.errorMessage(e));
throw e;
}
}
/** {@inheritDoc} */
@Override public Object arg() {
return taskArgs;
}
/** {@inheritDoc} */
@Override public void parseArguments(CommandArgIterator argIter) {
KillSubcommand cmd;
try {
cmd = KillSubcommand.valueOf(argIter.nextArg("Expected type of resource to kill.").toUpperCase());
}
catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Expected type of resource to kill.");
}
switch (cmd) {
case COMPUTE:
taskArgs = new VisorComputeCancelSessionTaskArg(
IgniteUuid.fromString(argIter.nextArg("Expected compute task id.")));
taskName = VisorComputeCancelSessionTask.class.getName();
nodeId = null;
break;
case SERVICE:
taskArgs = new VisorCancelServiceTaskArg(argIter.nextArg("Expected service name."));
taskName = VisorCancelServiceTask.class.getName();
nodeId = null;
break;
case TRANSACTION:
String xid = argIter.nextArg("Expected transaction id.");
taskArgs = new VisorTxTaskArg(VisorTxOperation.KILL, null, null, null, null, null, null, xid, null,
null, null);
taskName = VisorTxTask.class.getName();
nodeId = null;
break;
case SQL:
T2<UUID, Long> ids = parseGlobalQueryId(argIter.nextArg("Expected SQL query id."));
if (ids == null)
throw new IllegalArgumentException("Expected global query id. " + EXPECTED_GLOBAL_QRY_ID_FORMAT);
taskArgs = new VisorQueryCancelOnInitiatorTaskArg(ids.get1(), ids.get2());
taskName = VisorQueryCancelOnInitiatorTask.class.getName();
nodeId = null;
break;
case SCAN:
String originNodeIsStr = argIter.nextArg("Expected query originating node id.");
UUID originNodeId = UUID.fromString(originNodeIsStr);
String cacheName = argIter.nextArg("Expected cache name.");
long qryId = Long.parseLong(argIter.nextArg("Expected query identifier."));
taskArgs = new VisorScanQueryCancelTaskArg(originNodeId, cacheName, qryId);
taskName = VisorScanQueryCancelTask.class.getName();
nodeId = null;
break;
case CONTINUOUS:
taskArgs = new VisorContinuousQueryCancelTaskArg(
UUID.fromString(argIter.nextArg("Expected query originating node id.")),
UUID.fromString(argIter.nextArg("Expected continuous query id.")));
taskName = VisorContinuousQueryCancelTask.class.getName();
nodeId = null;
break;
case SNAPSHOT:
String arg = argIter.nextArg("Expected snapshot operation request ID.");
taskArgs = new VisorSnapshotCancelTaskArg(UUID.fromString(arg), null);
taskName = VisorSnapshotCancelTask.class.getName();
nodeId = null;
break;
case CONSISTENCY:
taskName = VisorConsistencyCancelTask.class.getName();
taskArgs = null;
nodeId = BROADCAST_UUID;
break;
default:
throw new IllegalArgumentException("Unknown kill subcommand: " + cmd);
}
}
/** {@inheritDoc} */
@Override public void printUsage(Logger log) {
usage(log, "Kill compute task by session id:", KILL, singletonMap("session_id", "Session identifier."),
COMPUTE.toString(), "session_id");
usage(log, "Kill service by name:", KILL, singletonMap("name", "Service name."),
SERVICE.toString(), "name");
usage(log, "Kill transaction by xid:", KILL, singletonMap("xid", "Transaction identifier."),
TRANSACTION.toString(), "xid");
usage(log, "Kill sql query by query id:", KILL, singletonMap("query_id", "Query identifier."),
SQL.toString(), "query_id");
Map<String, String> params = new HashMap<>();
params.put("origin_node_id", "Originating node id.");
params.put("cache_name", "Cache name.");
params.put("query_id", "Query identifier.");
usage(log, "Kill scan query by node id, cache name and query id:", KILL,
params, SCAN.toString(), "origin_node_id", "cache_name", "query_id");
params.clear();
params.put("origin_node_id", "Originating node id.");
params.put("routine_id", "Routine identifier.");
usage(log, "Kill continuous query by routine id:", KILL, params, CONTINUOUS.toString(),
"origin_node_id", "routine_id");
usage(log, "Kill running snapshot by snapshot name:", KILL, singletonMap("snapshot_name", "Snapshot name."),
SNAPSHOT.toString(), "snapshot_name");
}
/** {@inheritDoc} */
@Override public String name() {
return KILL.toCommandName();
}
}