Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Bugfix in kademlia example
[simgrid.git] / examples / bittorrent / Tracker.java
1 package bittorrent;
2 import java.util.ArrayList;
3 import java.util.Iterator;
4
5 import org.simgrid.msg.Comm;
6 import org.simgrid.msg.Host;
7 import org.simgrid.msg.Process;
8 import org.simgrid.msg.Msg;
9 import org.simgrid.msg.MsgException;
10 import org.simgrid.msg.Task;
11
12 import org.simgrid.msg.RngStream;
13 /**
14  * Tracker, handle requests from peers.
15  */
16 public class Tracker extends Process {
17         protected RngStream stream;
18         /**
19          * Peers list
20          */
21         protected ArrayList<Integer> peersList;
22         /**
23          * End time for the simulation
24          */
25         protected double deadline;
26         /**
27          * Current comm received
28          */
29         protected Comm commReceived = null;
30         
31         public Tracker(Host host, String name, String[]args) {
32                 super(host,name,args);
33         }
34         
35         @Override
36         public void main(String[] args) throws MsgException {
37                 if (args.length != 1) {
38                         Msg.info("Wrong number of arguments for the tracker.");
39                         return;
40                 }
41                 //Build the RngStream object for randomness
42                 stream = new RngStream("tracker");
43                 //Retrieve the end time
44                 deadline = Double.valueOf(args[0]);
45                 //Building peers array
46                 peersList = new ArrayList<Integer>();
47                 
48                 Msg.info("Tracker launched.");          
49                 while (Msg.getClock() < deadline) {
50                         if (commReceived == null) {
51                                 commReceived = Task.irecv(Common.TRACKER_MAILBOX);
52                         }
53                         try {
54                                 if (commReceived.test()) {
55                                         Task task = commReceived.getTask();
56                                         if (task instanceof TrackerTask) {
57                                                 TrackerTask tTask = (TrackerTask)task;
58                                                 //Sending peers to the peer
59                                                 int nbPeers = 0;
60                                                 while (nbPeers < Common.MAXIMUM_PEERS && nbPeers < peersList.size()) {
61                                                         int nextPeer;
62                                                         do {
63                                                                 nextPeer = stream.randInt(0, peersList.size() - 1);
64                                                         } while (tTask.peers.contains(nextPeer));
65                                                         tTask.peers.add(peersList.get(nextPeer));
66                                                         nbPeers++;
67                                                 }
68                                                 //Adding the peer to our list
69                                                 peersList.add(tTask.peerId);
70                                                 tTask.type = TrackerTask.Type.ANSWER;
71                                                 //Setting the interval
72                                                 tTask.interval = Common.TRACKER_QUERY_INTERVAL;
73                                                 //Sending the task back to the peer
74                                                 tTask.dsend(tTask.mailbox);
75                                         }
76                                         commReceived = null;
77                                 }
78                                 else {
79                                         waitFor(1);
80                                 }
81                         }
82                         catch (MsgException e) {
83                                 commReceived = null;                            
84                         }
85                 }
86                 Msg.info("Tracker is leaving");
87         }
88
89 }