mirror of
https://github.com/ChronosX88/KademliaDHT.git
synced 2024-11-22 10:12:19 +00:00
Fixed the bug in NodeConnection operation where the messages were still being re-sent even after an acknowledgement was received.
Fixed by canceling the TimerTask
This commit is contained in:
parent
b3e1403872
commit
ed1ac876f3
@ -34,6 +34,7 @@ public class KadServer
|
|||||||
private boolean isRunning;
|
private boolean isRunning;
|
||||||
private final HashMap<Integer, Receiver> receivers;
|
private final HashMap<Integer, Receiver> receivers;
|
||||||
private final Timer timer; // Schedule future tasks
|
private final Timer timer; // Schedule future tasks
|
||||||
|
private final HashMap<Integer, TimerTask> tasks; // Keep track of scheduled tasks
|
||||||
|
|
||||||
/* Factories */
|
/* Factories */
|
||||||
private final MessageFactory messageFactory;
|
private final MessageFactory messageFactory;
|
||||||
@ -41,14 +42,15 @@ public class KadServer
|
|||||||
|
|
||||||
{
|
{
|
||||||
isRunning = true;
|
isRunning = true;
|
||||||
|
this.tasks = new HashMap<>();
|
||||||
|
this.receivers = new HashMap<>();
|
||||||
|
this.timer = new Timer(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public KadServer(int udpPort, MessageFactory mFactory) throws SocketException
|
public KadServer(int udpPort, MessageFactory mFactory) throws SocketException
|
||||||
{
|
{
|
||||||
this.udpPort = udpPort;
|
this.udpPort = udpPort;
|
||||||
this.socket = new DatagramSocket(udpPort);
|
this.socket = new DatagramSocket(udpPort);
|
||||||
this.receivers = new HashMap<>();
|
|
||||||
this.timer = new Timer(true);
|
|
||||||
|
|
||||||
this.messageFactory = mFactory;
|
this.messageFactory = mFactory;
|
||||||
|
|
||||||
@ -92,7 +94,9 @@ public class KadServer
|
|||||||
|
|
||||||
/* Setup the receiver to handle message response */
|
/* Setup the receiver to handle message response */
|
||||||
receivers.put(comm, recv);
|
receivers.put(comm, recv);
|
||||||
timer.schedule(new TimeoutTask(comm, recv), Configuration.RESPONSE_TIMEOUT);
|
TimerTask task = new TimeoutTask(comm, recv);
|
||||||
|
timer.schedule(task, Configuration.RESPONSE_TIMEOUT);
|
||||||
|
tasks.put(comm, task);
|
||||||
|
|
||||||
/* Send the message */
|
/* Send the message */
|
||||||
sendMessage(to, msg, comm);
|
sendMessage(to, msg, comm);
|
||||||
@ -167,7 +171,12 @@ public class KadServer
|
|||||||
if (this.receivers.containsKey(comm))
|
if (this.receivers.containsKey(comm))
|
||||||
{
|
{
|
||||||
/* If there is a reciever in the receivers to handle this */
|
/* If there is a reciever in the receivers to handle this */
|
||||||
receiver = this.receivers.remove(comm);
|
synchronized (this)
|
||||||
|
{
|
||||||
|
receiver = this.receivers.remove(comm);
|
||||||
|
TimerTask task = (TimerTask) tasks.remove(comm);
|
||||||
|
task.cancel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -207,6 +216,7 @@ public class KadServer
|
|||||||
{
|
{
|
||||||
Integer key = new Integer(comm);
|
Integer key = new Integer(comm);
|
||||||
receivers.remove(key);
|
receivers.remove(key);
|
||||||
|
this.tasks.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,6 +32,7 @@ public class ConnectReceiver implements Receiver
|
|||||||
@Override
|
@Override
|
||||||
public void receive(Message incoming, int comm) throws IOException
|
public void receive(Message incoming, int comm) throws IOException
|
||||||
{
|
{
|
||||||
|
System.out.println("Received incoming connect message, sending acknowledgement message.");
|
||||||
ConnectMessage mess = (ConnectMessage) incoming;
|
ConnectMessage mess = (ConnectMessage) incoming;
|
||||||
|
|
||||||
/* Update the local space by inserting the origin node. */
|
/* Update the local space by inserting the origin node. */
|
||||||
|
@ -46,6 +46,7 @@ public class ConnectOperation implements Operation, Receiver
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
System.out.println("Connect Operation executing.");
|
||||||
/* Contact the bootstrap node */
|
/* Contact the bootstrap node */
|
||||||
this.error = true;
|
this.error = true;
|
||||||
this.attempts = 0;
|
this.attempts = 0;
|
||||||
@ -109,6 +110,7 @@ public class ConnectOperation implements Operation, Receiver
|
|||||||
@Override
|
@Override
|
||||||
public synchronized void timeout(int comm) throws IOException
|
public synchronized void timeout(int comm) throws IOException
|
||||||
{
|
{
|
||||||
|
System.out.println("Timeout function called");
|
||||||
if (++this.attempts < MAX_CONNECT_ATTEMPTS)
|
if (++this.attempts < MAX_CONNECT_ATTEMPTS)
|
||||||
{
|
{
|
||||||
this.server.sendMessage(this.bootstrapNode, new ConnectMessage(this.localNode), this);
|
this.server.sendMessage(this.bootstrapNode, new ConnectMessage(this.localNode), this);
|
||||||
|
@ -27,6 +27,7 @@ public class NodeConnectionTest
|
|||||||
|
|
||||||
/* Connecting 2 to 1 */
|
/* Connecting 2 to 1 */
|
||||||
kad1.connect(kad2.getNode());
|
kad1.connect(kad2.getNode());
|
||||||
|
|
||||||
System.out.println("Kad 1 After: ");
|
System.out.println("Kad 1 After: ");
|
||||||
System.out.println(kad1.getNode().getRoutingTable());
|
System.out.println(kad1.getNode().getRoutingTable());
|
||||||
System.out.println("Kad 2 After: ");
|
System.out.println("Kad 2 After: ");
|
||||||
|
Loading…
Reference in New Issue
Block a user