package org.corfudb.infrastructure; import io.netty.channel.ChannelHandlerContext; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.corfudb.protocols.wireprotocol.*; import org.corfudb.util.Utils; import java.lang.invoke.MethodHandles; import java.util.HashMap; import java.util.Map; /** * Created by mwei on 12/8/15. */ @Slf4j public class BaseServer extends AbstractServer { /** Options map, if available */ @Getter @Setter public Map<String, Object> optionsMap = new HashMap<>(); /** Handler for the base server */ @Getter private final CorfuMsgHandler handler = new CorfuMsgHandler() .generateHandlers(MethodHandles.lookup(), this); private static final String metricsPrefix = "corfu.server.base."; /** Respond to a ping message. * * @param msg The incoming message * @param ctx The channel context * @param r The server router. */ @ServerHandler(type=CorfuMsgType.PING, opTimer=metricsPrefix + "ping") private static void ping(CorfuMsg msg, ChannelHandlerContext ctx, IServerRouter r, boolean isMetricsEnabled) { r.sendResponse(ctx, msg, CorfuMsgType.PONG.msg()); } /** Respond to a version request message. * * @param msg The incoming message * @param ctx The channel context * @param r The server router. */ @ServerHandler(type=CorfuMsgType.VERSION_REQUEST, opTimer=metricsPrefix + "version-request") private void getVersion(CorfuMsg msg, ChannelHandlerContext ctx, IServerRouter r, boolean isMetricsEnabled) { VersionInfo vi = new VersionInfo(optionsMap); r.sendResponse(ctx, msg, new JSONPayloadMsg<>(vi, CorfuMsgType.VERSION_RESPONSE)); } /** Reset the JVM. This mechanism leverages that corfu_server runs in a bash script * which monitors the exit code of Corfu. If the exit code is 100, then it restarts * the server. * * @param msg The incoming message * @param ctx The channel context * @param r The server router. */ @ServerHandler(type=CorfuMsgType.RESET) private static void doReset(CorfuMsg msg, ChannelHandlerContext ctx, IServerRouter r, boolean isMetricsEnabled) { log.warn("Remote reset requested from client " + msg.getClientID()); r.sendResponse(ctx, msg, CorfuMsgType.ACK.msg()); Utils.sleepUninterruptibly(500); // Sleep, to make sure that all channels are flushed... System.exit(100); } }