/***************************************************************************
* *
* CheckPredecessorTask.java *
* ------------------- *
* date : 16.08.2004 *
* copyright : (C) 2004-2008 Distributed and *
* Mobile Systems Group *
* Lehrstuhl fuer Praktische Informatik *
* Universitaet Bamberg *
* http://www.uni-bamberg.de/pi/ *
* email : sven.kaffille@uni-bamberg.de *
* karsten.loesing@uni-bamberg.de *
* *
* *
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
* A copy of the license can be found in the license.txt file supplied *
* with this software or at: http://www.gnu.org/copyleft/gpl.html *
* *
***************************************************************************/
package de.uniba.wiai.lspi.chord.service.impl;
import de.uniba.wiai.lspi.chord.com.CommunicationException;
import de.uniba.wiai.lspi.chord.com.Node;
import de.uniba.wiai.lspi.util.logging.Logger;
import static de.uniba.wiai.lspi.util.logging.Logger.LogLevel.*;
/**
* Checks if the predecessor of the local node is still alive.
*
* @author Karsten Loesing
* @version 1.0.5
*/
final class CheckPredecessorTask implements Runnable {
/**
* Object logger.
*/
private static final Logger logger = Logger
.getLogger(CheckPredecessorTask.class);
/**
* Reference on routing table.
*/
private References references;
/**
* Creates a new instance, but without starting a thread running it.
*
* @param references
* Reference on routing table.
* @throws NullPointerException
* If parameter value is <code>null</code>.
*/
CheckPredecessorTask(References references) {
if (references == null) {
throw new NullPointerException(
"Parameter references may not be null!");
}
this.references = references;
}
public void run() {
try {
boolean debug = CheckPredecessorTask.logger.isEnabledFor(DEBUG);
// start of method
if (debug) {
CheckPredecessorTask.logger
.debug("Check predecessor method has been invoked.");
}
// check if local node has a valid predecessor reference
Node predecessor = this.references.getPredecessor();
if (predecessor == null) {
// I have no predecessor
CheckPredecessorTask.logger
.info("Nothing to check, as predecessor is null");
return;
} else {
// try to reach predecessor
try {
predecessor.ping();
// My predecessor responded
if (debug) {
CheckPredecessorTask.logger
.debug("Predecessor reached!");
}
} catch (CommunicationException e) {
if (debug) {
CheckPredecessorTask.logger
.debug(
"Checking predecessor was NOT successful due "
+ "to a communication failure! Removing "
+ "predecessor reference.", e);
}
// My predecessor did not respond
this.references.removeReference(predecessor);
return;
}
CheckPredecessorTask.logger
.info("Invocation of check predecessor on node "
+ predecessor.getNodeID() + " was successful");
}
} catch (Exception e) {
CheckPredecessorTask.logger.warn(
"Unexpected Exception caught in CheckpredecessorTask!", e);
}
}
}