public DatabusRequest process(DatabusRequest request) throws IOException, RequestProcessingException {
String command = request.getParams().getProperty(DatabusRequest.PATH_PARAM_NAME);
if (null == command)
{
throw new InvalidRequestParamValueException(COMMAND_NAME, "command", "null");
}
String reply = "Command " + command + " completed ";
LOG.info("got relayCommand = " + command);
if(command.equals(SAVE_META_STATE_PARAM)) {
_relay.saveBufferMetaInfo(true);
} else if (command.equals(SHUTDOWN_RELAY_PARAM)) {
String msg = "received shutdown curl request from: " + request.getRemoteAddress() + ". Shutting down\n";
LOG.warn(msg);
request.getResponseContent().write(ByteBuffer.wrap(msg.getBytes("UTF-8")));
request.getResponseContent().close();
_relay.shutdown();
} else if (command.equals(VALIDATE_RELAY_BUFFER_PARAM)) {
_relay.validateRelayBuffers();
} else if (command.equals(DISCONNECT_CLIENTS)) {
Channel rspChannel = request.getResponseContent().getRawChannel();
_relay.disconnectDBusClients(rspChannel);
} else if (command.equals(RUN_GC_PARAM)) {
Runtime rt = Runtime.getRuntime();
long mem = rt.freeMemory();
LOG.info("mem before gc = " + rt.freeMemory() + " out of " + rt.totalMemory());
long time = System.currentTimeMillis();
System.gc();
time = System.currentTimeMillis() - time;
mem = rt.freeMemory() - mem;
reply = new String("GC run. Took " + time + " millsecs. Freed " + mem + " bytes out of " + rt.totalMemory());
} else if(command.startsWith(RESET_RELAY_BUFFER_PARAM)) {
// We expect the request to be of the format:
// resetRelayBuffer/<dbName>/<partitionId>?prevScn=<long>&binlogOffset=<long>
String [] resetCommands = command.split("/");
if(resetCommands.length != 3) {
throw new InvalidRequestParamValueException(COMMAND_NAME, "command", command);
}
String dbName = resetCommands[1];
String dbPart = resetCommands[2];
long prevScn = request.getRequiredLongParam(PREV_SCN_PARAM);
long binlogOffset = request.getOptionalLongParam(BINLOG_OFFSET_PARAM, 0L);
LOG.info("reset command = " + dbName + " part =" + dbPart);
try
{
_relay.resetBuffer(new PhysicalPartition(Integer.parseInt(dbPart), dbName), prevScn, binlogOffset);
}
catch(BufferNotFoundException e)
{
reply = new String("command " + command + ":" + e.getMessage());
}
} else if(command.startsWith(GET_BINLOG_OFFSET_PARAM)) {
String[] getOfsArgs = command.split("/");
if (getOfsArgs.length != 2) {
throw new InvalidRequestParamValueException(GET_BINLOG_OFFSET_PARAM, "Server ID", "");
}
int serverId;
try
{
serverId = Integer.parseInt(getOfsArgs[1]);
int [] offset = _relay.getBinlogOffset(serverId);
if (offset.length != 2) {
reply = "Error getting binlog offset";
} else {
reply = new String("RelayLastEvent(" + offset[0] + "," + offset[1] + ")");
}
}
catch(NumberFormatException e)
{
throw new InvalidRequestParamValueException(GET_BINLOG_OFFSET_PARAM, "Server ID", getOfsArgs[1]);
}
catch(DatabusException e)
{
reply = new String("command " + command + "failed with:" + e.getMessage());
}