Hashtable tilføjelse af noder
HejsaJeg har et problem med et projekt der efterhånden er ved at drive mig til vanvid.
Hvis man forestiller sig en cirkel fra {0 -> n} hvor jeg gerne vil indsætte nogle objekter af en typen Node. En node indsættes på den plads i cirklen der svarer til dens værdi for feltet SHA.
Node har fire felter.
private String ip;
private int SHA;
private Node successor;
private Node predecessor;
public Node(String ip, int SHA) {
this.ip = ip;
this.SHA = SHA;
}
En nodes Successor er den node på cirklen der har den nærmeste større SHA-værdi. Dog med den undtagelse at Noden med den højeste SHA-værdi har Noden med den laveste SHA-værdi som successor. På den måde bliver det jo en cirkel.
Jeg tilføjer noderne løbende i en Hashtable hvor jeg gerne vil instantiere en nodes Successor når den indsættes. Indsættelse vil jo også få indflydelse på en anden node der nu skal have ny successor. Metoden findSuccessor bruges til at løbende Hashtablen igennem indtil der findes en successor.
BootStrapPeer er en startpeer der bruges hver gang som udgangspunkt.
Jeg har følgende klasse Network der skal simulere indsættelse af noder:
public class Network {
private static Node bootStrapPeer = null;
private static Hashtable<Integer, Node> peers = new Hashtable<Integer, Node>();
private static int counter = 0; // bruges til indsættelse i Hashtable
public static Hashtable<Integer, Node> getHashtable() {
return peers;
}
public static void addBootStrapPeer(Node n) {
bootStrapPeer = n;
addPeer(n);
}
public static Node getBootStrapPeer() {
return bootStrapPeer;
}
public static void addPeer(Node n) {
peers.put((Integer)counter, n);
counter ++;
}
public static void findSuccessor(Node contextNode, Node currentNode) {
Node context = contextNode;
Node current = currentNode;
Node currentSuccessor = current.getSuccessor();
// Bruges til at binde nettet sammen når bootStrapPeer og den første node joines
if(bootStrapPeer.getSuccessor() == null) {
context.setSuccessor(bootStrapPeer);
bootStrapPeer.setSuccessor(context);
}
// hvis currentNode er mindre end context og context er mindre currents successor.
else if((current.getSHA() < context.getSHA()) && (context.getSHA() < currentSuccessor.getSHA())) {
context.setSuccessor(currentSuccessor);
current.setSuccessor(context);
}
// hvis current node er noden med højeste SHA
else if(current.getSHA() > currentSuccessor.getSHA()) {
if(context.getSHA() > currentSuccessor.getSHA() && current.getSuccessor().getSuccessor().getSHA() > context.getSHA()) {
context.setSuccessor(currentSuccessor.getSuccessor());
currentSuccessor.setSuccessor(context);
}
// fanger også muligheden hvor context er større end current node
else{
context.setSuccessor(currentSuccessor);
current.setSuccessor(context);
}
}
else{
//System.out.println("Loop");
Network.findSuccessor(context, currentSuccessor);
}
}
}
Men når jeg indsætter noderne går der et eller andet galt. Successorne bliver ved et specielt tilfælde corrupted og dermed alt andet end korrekte. Jeg har prøvet at debugge, men jeg har ikke et program hvor man kan læse variablerne løbende og jeg vil nødigt til at skifte software alene af den årsag.
Min main-metode ser således ud:
import java.util.*;
public class NodeTest {
public static void main(String[] args){
IpConstructor ipc = new IpConstructor(); // laver nyt Ip-Constructor objekt
IpHash iph = new IpHash(); // laver nyt Ip-Hash objekt
String ip = ipc.generateIP();
int sha = iph.hashIP(ip);
Node bootStrapPeer = new Node("Boot", iph.hashIP(ip)); // laver bootstrap Node
bootStrapPeer.create(); // danner Chord-ring succcessor = this
Network.addBootStrapPeer(bootStrapPeer);
NodeTest test = new NodeTest();
test.buildNet(20);
test.printNet();
} // main
private void buildNet(int numberOfNodes) {
IpConstructor ipc = new IpConstructor(); // laver nyt Ip-Constructor objekt
IpHash iph = new IpHash(); // laver nyt Ip-Hash objekt
String ip = ipc.generateIP();
int sha = iph.hashIP(ip);
for (int k = 0 ; k < numberOfNodes ; k++) {
String name = "Node" + k;
Node current = new Node(name, iph.hashIP(ip));
Network.addPeer(current);
current.join(Network.getBootStrapPeer());
}
}
private void printNet() {
for (int k = 0 ; k < Network.getHashtable().size() ; k++) {
if(k == 0) {
System.out.println("BootStrapPeer " + Network.getHashtable().get((Integer)k).getSHA() + " Successor " +
Network.getHashtable().get((Integer)k).getSuccessor().getSHA());
}
else {
System.out.println("Node" + k + " " + Network.getHashtable().get((Integer)k).getSHA() + " Successor " +
Network.getHashtable().get((Integer)k).getSuccessor().getSHA());
}
}
}
}
Node-klassen er her:
public class Node {
private String ip;
private int SHA;
private Node successor;
private Node predecessor;
public Node(String ip, int SHA) {
this.ip = ip;
this.SHA = SHA;
}
public int getSHA() {
return SHA;
}
public void setSHA(int SHA) {
this.SHA = SHA;
}
public String getIP() {
return ip;
}
public Node getSuccessor(){
return successor;
}
public void setSuccessor(Node successor){
this.successor = successor;
}
public void create(){
predecessor = null;
successor = null;
}
public void join(Node bootstrap){
this.predecessor = null;
Network.findSuccessor(this, bootstrap);
}
public static void fixFingers() {}
}
Jeg håber virkelig meget der er en der kan hjælpe da det forhindrer mig i at komme videre med mit projekt og jeg er allerede super presset tidsmæssigt.
På forhånd mange tak
Rasmus
