package com.alibaba.doris.dataserver.migrator.action;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.doris.common.data.util.ByteUtils;
import com.alibaba.doris.dataserver.action.data.ActionData;
import com.alibaba.doris.dataserver.action.parser.BaseActionParser;
import com.alibaba.doris.dataserver.migrator.MigrateActionType;
import com.alibaba.doris.dataserver.migrator.MigrationManager;
import com.alibaba.doris.dataserver.net.ByteBufferWrapper;
import com.alibaba.doris.dataserver.net.InvalidCommandException;
import com.alibaba.doris.dataserver.net.protocol.text.ProtocolConstant;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class MigrateActionParser extends BaseActionParser {
private static final String NO_MESSAGE = "OK NO_MESSAGE";
private static final Logger logger = LoggerFactory.getLogger(MigrationManager.class);
/**
* 返回结果
*
* @param buffer
* @param data
*/
public void writeHead(ByteBufferWrapper buffer, ActionData data) {
// write result into buffer.
MigrationActionData actionData = (MigrationActionData) data;
String message = actionData.getReturnMessage();
if (message == null) {
if(logger.isDebugEnabled())
logger.debug("MigrateActionParser: return null message, action type: " + actionData.getActionType());
message = NO_MESSAGE;
}
if (logger.isDebugEnabled())
logger.debug("Write migrate packet: " + message);
byte[] writeBytes = ByteUtils.stringToByte(message);
buffer.writeBytes(writeBytes);
buffer.writeBytes(ProtocolConstant.CRLF);
}
/**
* 解析指令body
*/
public void readBody(byte[] body, ActionData data) {
// read command string.
String bodyString = ByteUtils.byteToString(body);
MigrationActionData actionData = (MigrationActionData) data;
actionData.setMigrationRouteString(bodyString);
}
/**
* 解析指令头
*/
public ActionData readHead(byte[] header, int startPos) {
String commandString;
String commmandName = MigrateActionType.MIGRATE.getName();
commandString = ByteUtils.byteToString(header);
if (commandString.charAt(commandString.length() - 2) == ProtocolConstant.CRLF[0]
&& commandString.charAt(commandString.length() - 1) == ProtocolConstant.CRLF[1]) {
commandString = commandString.substring(0, commandString.length() - 2);
}
if (logger.isDebugEnabled()) logger.debug("Receive migrate command:" + commandString);
try {
MigrationActionData actionData = new MigrationActionData();
String[] commandArgs = commandString.split(" ");
if (commandArgs.length < 5) {
throw new IllegalArgumentException("Argument insufficient of command:'" + commmandName
+ "'. Require 5,but got " + commandArgs.length);
}
Short flag = Short.valueOf(commandArgs[2]);
Long timestamp = Long.valueOf(commandArgs[3]);
Integer bodyLen = Integer.valueOf(commandArgs[4]);
actionData.setSubcommand(commandArgs[1]);
actionData.setFlag(flag);
actionData.setTimestamp(timestamp);
actionData.setBodyBytes(bodyLen);
if (bodyLen > 0) actionData.setNeedReadBody(true);
return actionData;
} catch (Exception e) {
String msg = "Invalid 'migrate' command \"" + commandString + "\". Cause " + e.getMessage();
logger.error(msg, e);
throw new InvalidCommandException(msg);
}
}
}