public static void handle(String stmt, ManagerConnection c, int offset) { switch (ManagerParseStop.parse(stmt, offset)) { case ManagerParseStop.HEARTBEAT: StopHeartbeat.execute(stmt, c); break; default: c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); } }
public static int parse(String stmt, int offset) { int i = offset; for (; i < stmt.length(); i++) { switch (stmt.charAt(i)) { case ' ': continue; case '/': case '#': i = ParseUtil.comment(stmt, i); continue; case '@': return stop2Check(stmt, i); default: return OTHER; } } return OTHER; }
public static void execute(String stmt, ManagerConnection c) { int count = 0; Pair<String[], Integer> keys = ManagerParseStop.getPair(stmt); if (keys.getKey() != null && keys.getValue() != null) { long time = keys.getValue() * 1000L; Map<String, PhysicalDBPool> dns = DbleServer.getInstance().getConfig().getDataHosts(); for (String key : keys.getKey()) { PhysicalDBPool dn = dns.get(key); if (dn != null) { dn.getSource().setHeartbeatRecoveryTime(TimeUtil.currentTimeMillis() + time); ++count; StringBuilder s = new StringBuilder(); s.append(dn.getHostName()).append(" stop heartbeat '"); LOGGER.info(s.append(FormatUtil.formatTime(time, 3)).append("' by manager.").toString()); } } } OkPacket packet = new OkPacket(); packet.setPacketId(1); packet.setAffectedRows(count); packet.setServerStatus(2); packet.write(c); }
@Test public void testStopHeartBeat() { Assert.assertEquals(ManagerParseStop.HEARTBEAT, ManagerParseStop.parse("stop @@heartbeat ds:1000", 4)); Assert.assertEquals(ManagerParseStop.HEARTBEAT, ManagerParseStop.parse(" STOP @@HEARTBEAT ds:1000", 5)); Assert.assertEquals(ManagerParseStop.HEARTBEAT, ManagerParseStop.parse(" STOP @@heartbeat ds:1000", 5)); }