]> AND Public Git Repository - simgrid.git/blob - examples/bittorrent/Tracker.java
Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add bittorrent 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                                                 //TODO: Send RANDOM pairs using RngStreams.
60                                                 int nbPeers = 0;
61                                                 while (nbPeers < Common.MAXIMUM_PAIRS && nbPeers < peersList.size()) {
62                                                         int nextPeer;
63                                                         do {
64                                                                 nextPeer = stream.randInt(0, peersList.size() - 1);
65                                                         } while (tTask.peers.contains(nextPeer));
66                                                         tTask.peers.add(peersList.get(nextPeer));
67                                                         nbPeers++;
68                                                 }
69                                                 //Adding the peer to our list
70                                                 peersList.add(tTask.peerId);
71                                                 tTask.type = TrackerTask.Type.ANSWER;
72                                                 //Setting the interval
73                                                 tTask.interval = Common.TRACKER_QUERY_INTERVAL;
74                                                 //Sending the task back to the peer
75                                                 tTask.dsend(tTask.mailbox);
76                                         }
77                                         commReceived = null;
78                                 }
79                                 else {
80                                         waitFor(1);
81                                 }
82                         }
83                         catch (MsgException e) {
84                                 commReceived = null;                            
85                         }
86                 }
87                 Msg.info("Tracker is leaving");
88         }
89
90 }