/** * Copyright (C) 2010-2013 Eugen Feller, INRIA <eugen.feller@inria.fr> * * This file is part of Snooze, a scalable, autonomic, and * energy-aware virtual machine (VM) management framework. * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see <http://www.gnu.org/licenses>. */ package org.inria.myriads.snoozenode.heartbeat.handler; import org.inria.myriads.snoozecommon.communication.NetworkAddress; import org.inria.myriads.snoozecommon.guard.Guard; import org.inria.myriads.snoozenode.heartbeat.HeartbeatFactory; import org.inria.myriads.snoozenode.heartbeat.listener.GroupManagerHeartbeatFailureListener; import org.inria.myriads.snoozenode.heartbeat.listener.HeartbeatListener; import org.inria.myriads.snoozenode.heartbeat.message.HeartbeatMessage; import org.inria.myriads.snoozenode.heartbeat.receiver.HeartbeatMulticastReceiver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Group manager heartbeat handler. * * @author Eugen Feller */ public final class GroupManagerHeartbeatHandler implements HeartbeatListener { /** Define the logger. */ private static final Logger log_ = LoggerFactory.getLogger(GroupManagerHeartbeatHandler.class); /** Heartbeat listener thread. */ private HeartbeatMulticastReceiver hearbeatListener_; /** Heartbeat failure callback. */ private GroupManagerHeartbeatFailureListener heartbeatFailure_; /** GroupManagerId. */ private String groupManagerId_; /** * Group manager heartbeat handler constructor. * * @param heartbeatAddress The multicast address * @param groupManagerId The group manager id * @param timeout The timeout * @param heartbeatFailure The heartbeat failure callback * @throws Exception Exception */ public GroupManagerHeartbeatHandler(NetworkAddress heartbeatAddress, String groupManagerId, int timeout, GroupManagerHeartbeatFailureListener heartbeatFailure) throws Exception { Guard.check(heartbeatAddress, timeout, heartbeatFailure); log_.debug("Initializing the group manager heartbeat listener"); heartbeatFailure_ = heartbeatFailure; hearbeatListener_ = HeartbeatFactory.newHeartbeatMulticastListener(heartbeatAddress, timeout, this); groupManagerId_ = groupManagerId; new Thread(hearbeatListener_, "GroupManagerHeartBeatHandler").start(); } /** * Processes the heartbeat arrival event. * * @param heartbeatMessage The heartbeat message */ public void onHeartbeatArrival(HeartbeatMessage heartbeatMessage) { Guard.check(heartbeatMessage); String groupManagerId = heartbeatMessage.getId(); if (groupManagerId.equals(groupManagerId_)) { log_.debug(String.format("Received group manager hearbeat message from %s, control data port: %s, " + "monitoring data port: %s", heartbeatMessage.getListenSettings().getControlDataAddress().getAddress(), heartbeatMessage.getListenSettings().getControlDataAddress().getPort(), heartbeatMessage.getListenSettings().getMonitoringDataAddress().getPort())); } else { log_.debug("Received wrong group manager heartbeat message ... trigger a rejoin"); onHeartbeatFailure(); } } /** * Processes the heartbeat failure event. */ public void onHeartbeatFailure() { log_.debug("Failed to receive group manager heartbeat message! Starting the recovery procedure!"); hearbeatListener_.terminate(); try { heartbeatFailure_.onGroupManagerHeartbeatFailure(); } catch (Exception exception) { log_.error("Exception", exception); } } }