-- A SimGrid Lua implementation of the Chord DHT
+-- Copyright (c) 2011-2012, 2014. The SimGrid Team.
+-- All rights reserved.
+
+-- This program is free software; you can redistribute it and/or modify it
+-- under the terms of the license (GNU LGPL) which comes with this package.
+
require("simgrid")
-nb_bits = 24
-nb_keys = 2^nb_bits
-comp_size = 0
-comm_size = 10
-timeout = 50
-max_simulation_time = 1000
-stabilize_delay = 20
-fix_fingers_delay = 120
+nb_bits = 24
+nb_keys = 2^nb_bits
+comp_size = 0
+comm_size = 10
+timeout = 50
+max_simulation_time = 1000
+stabilize_delay = 20
+fix_fingers_delay = 120
check_predecessor_delay = 120
-lookup_delay = 10
+lookup_delay = 10
-- current node (don't worry, globals are duplicated in each simulated process)
my_node = {
while now < max_simulation_time do
- task, err = simgrid.comm.test(my_node.comm_recv)
+ task, err = my_node.comm_recv:test()
if task then
-- I received a task: answer it
task.answer_to .. ": the successor of " .. task.request_id ..
" is " .. my_node.fingers[1])
- local ans_task = simgrid.task.new("", comp_size, comm_size)
- ans_task.type = "find successor answer"
- ans_task.request_id = task.request_id
- ans_task.answer = my_node.fingers[1]
- ans_task:dsend(task.answer_to)
+ task.type = "find successor answer"
+ task.answer = my_node.fingers[1]
+ task:dsend(task.answer_to)
else
-- forward the request to the closest preceding finger in my table
simgrid.info("Forwarding the 'find successor' request to my closest preceding finger")
-
- local next_task = simgrid.task.new("", comp_size, comm_size)
- next_task.type = "find successor"
- next_task.request_id = task.request_id
- next_task.answer_to = task.answer_to
- next_task:dsend(closest_preceding_node(next_task.request_id))
+ task:dsend(closest_preceding_node(task.request_id))
end
elseif type == "get predecessor" then
- local ans_task = simgrid.task.new("", comp_size, comm_size)
- ans_task.type = "get predecessor answer"
- ans_task.answer = my_node.predecessor
- ans_task:dsend(task.answer_to)
+ task.type = "get predecessor answer"
+ task.answer = my_node.predecessor
+ task:dsend(task.answer_to)
elseif type == "notify" then
-- someone is telling me that he may be my new predecessor
" for id " .. id .. ", waiting for the answer")
while true do
- task = simgrid.comm.wait(my_node.comm_recv, timeout)
+ task = my_node.comm_recv:wait(timeout)
my_node.comm_recv = simgrid.task.irecv(my_node.id)
if not task then
if task:send(ask_to, timeout) then
-- request successfully sent: wait for an answer
while true do
- task = simgrid.comm.wait(my_node.comm_recv, timeout)
+ task = my_node.comm_recv:wait(timeout)
my_node.comm_recv = simgrid.task.irecv(my_node.id)
if not task then