Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add bittorrent example in Lua
[simgrid.git] / examples / lua / bittorrent / tracker.lua
diff --git a/examples/lua/bittorrent/tracker.lua b/examples/lua/bittorrent/tracker.lua
new file mode 100644 (file)
index 0000000..e662990
--- /dev/null
@@ -0,0 +1,62 @@
+-- A SimGrid Lua implementation of the Bittorrent protocol.
+
+require("simgrid")
+
+common_tracker = {
+       MAXIMUM_PEERS = 50
+}
+
+
+
+function tracker(...)
+       tracker_data = {
+               peers_list = {},
+               deadline = 0,
+               comm_received = nil
+       }
+  -- Check the arguments
+  local args = {...}
+  if #args ~= 1 then
+       simgrid.info("Wrong number of arguments for the tracker")
+  end
+  -- Initialization of the random generator
+  math.randomseed(42)
+  -- Retrieve the end time
+  tracker_data.deadline = tonumber(args[1])
+  
+  simgrid.info("Tracker launched")
+  
+  local now = simgrid.get_clock()
+  
+  tracker_data.comm_received = simgrid.task.irecv("tracker")
+  while now < tracker_data.deadline do
+       task, err = tracker_data.comm_received:test()
+       if task then
+               simgrid.debug("Received a request from " .. task.mailbox)
+               tracker_data.comm_received = simgrid.task.irecv("tracker")
+               -- Sending peers to the peer
+               local peers = {}
+               local i = 0 
+               if #tracker_data.peers_list > 0 then
+                       i = math.random(1,#tracker_data.peers_list)
+               end
+               while #peers < #tracker_data.peers_list and #peers < common_tracker.MAXIMUM_PEERS do
+                       table.insert(peers,tracker_data.peers_list[i])  
+                       i = (i + 1) % #tracker_data.peers_list
+               end
+               task.type = "ANSWER"
+               task.peers = peers
+               -- Add the peer to our peer list
+               table.insert(tracker_data.peers_list,task.peer_id)
+               -- Setting the interval
+               task.interval = TRACKER_QUERY_INTERVAL
+               -- Sending the task back to the peer
+               task:dsend(task.mailbox)
+       else
+               simgrid.process.sleep(1)
+               now = simgrid.get_clock()
+       end
+  end
+  
+  simgrid.info("Tracker is leaving")
+end