Rice Pastry API

rice.pastry.standard
Class PartitionHandler

java.lang.Object
  extended by rice.selector.TimerTask
      extended by rice.pastry.standard.PartitionHandler
All Implemented Interfaces:
java.lang.Comparable<TimerTask>, Cancellable, CancellableTask, NodeSetListener

public class PartitionHandler
extends TimerTask
implements NodeSetListener

The PartitionHandler does two things: it collects a list of candidate nodes that may be in another partition, and it periodically tries to reach these nodes to heal a partition. I can refactor the code to expose a method that heals a partition tomorrow for you, but I'll paste the code below for the moment. The basic theory of healing a partition is to send a join request via a node that may not be in your partition. Join requests get routed to your own key. If the request comes back to you, then that node is in your partition and nothing needs to be done. If the request ends up at another node, it will discover your existence and begin integrating the two rings, just as if you were creating your local node for the first time. The way we look for candidate nodes is we choose a mix of the original bootstraps (as a last resort fallback) and nodes that we once believed were alive but are no longer in contact with. The idea is we may have declared those nodes dead due to losing connectivity to them but at some later point we again may be able to contact them. The reason that we make the PartitionHandler a periodic process is that in general you can't tell that a partition has happened.

Author:
jstewart

Field Summary
protected  double bootstrapRate
           
protected  java.net.InetSocketAddress[] bootstraps
           
protected  Environment env
           
protected  SocketPastryNodeFactory factory
           
protected  java.util.Map<Id,rice.pastry.standard.PartitionHandler.GoneSetEntry> gone
           
protected  Logger logger
           
protected  int maxGoneAge
           
protected  int maxGoneSize
           
protected  PastryNode pastryNode
           
 
Fields inherited from class rice.selector.TimerTask
cancelled, fixedRate, period, selector, seq
 
Constructor Summary
PartitionHandler(PastryNode pn, SocketPastryNodeFactory factory, java.net.InetSocketAddress[] bootstraps)
          Constructs a PartitionHandler.
 
Method Summary
 NodeHandle getCandidateNode()
          This method randomly returns a node that was once in the LeafSet or in the routing table but has since been removed.
 void nodeSetUpdate(NodeSetEventSource nodeSetEventSource, NodeHandle handle, boolean added)
           
 void rejoin(NodeHandle target)
          Manually kicks off a probe to a given target node.
 void run()
           
 void start(Timer timer)
          This method starts the PartitionHandler's probing of candidate nodes.
 
Methods inherited from class rice.selector.TimerTask
cancel, compareTo, execute, isCancelled, scheduledExecutionTime, setNextExecutionTime, setSelectorManager
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

pastryNode

protected PastryNode pastryNode

bootstraps

protected java.net.InetSocketAddress[] bootstraps

factory

protected SocketPastryNodeFactory factory

logger

protected Logger logger

bootstrapRate

protected double bootstrapRate

maxGoneSize

protected int maxGoneSize

maxGoneAge

protected int maxGoneAge

gone

protected java.util.Map<Id,rice.pastry.standard.PartitionHandler.GoneSetEntry> gone

env

protected Environment env
Constructor Detail

PartitionHandler

public PartitionHandler(PastryNode pn,
                        SocketPastryNodeFactory factory,
                        java.net.InetSocketAddress[] bootstraps)
Constructs a PartitionHandler. This will register the handler with the pastry node to begin collecting candidates nodes that may be in a partition, but it will not initiate probing. You must call the start() method to do that.

Parameters:
pn - the local pastry node
factory - the SocketPastryNodeFactory
bootstraps -
Method Detail

getCandidateNode

public NodeHandle getCandidateNode()
This method randomly returns a node that was once in the LeafSet or in the routing table but has since been removed. The idea is that the node may have been removed because it suffered a network outage that left it in a partition of the ring. This method may also return a node from the current routing table if it doesn't know of sufficient nodes that have left to pick a good one.

Returns:
a NodeHandle that may be in another partition, or null if no nodes have left the routing table or LeafSet, and the routing table is empty.

run

public void run()
Specified by:
run in interface CancellableTask
Specified by:
run in class TimerTask

nodeSetUpdate

public void nodeSetUpdate(NodeSetEventSource nodeSetEventSource,
                          NodeHandle handle,
                          boolean added)
Specified by:
nodeSetUpdate in interface NodeSetListener

start

public void start(Timer timer)
This method starts the PartitionHandler's probing of candidate nodes. It should be called after the handler is constructed.

Parameters:
timer - the timer used to schedule partition checks (normally from the environment)

rejoin

public void rejoin(NodeHandle target)
Manually kicks off a probe to a given target node. This can be used to manually heal a partition if you know via some external mechanism that one occurred.

Parameters:
target - the node to rejoin through

Rice Pastry API

Copyright © 2001-2005 - Rice Pastry.


Imprint-Dataprotection