Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
chord implementation in splay/lua
authormehdi <mido.peace@gmail.com>
Wed, 27 Apr 2011 16:02:51 +0000 (18:02 +0200)
committermehdi <mido.peace@gmail.com>
Wed, 27 Apr 2011 16:02:51 +0000 (18:02 +0200)
examples/lua/SimSplay/chord.lua [new file with mode: 0644]

diff --git a/examples/lua/SimSplay/chord.lua b/examples/lua/SimSplay/chord.lua
new file mode 100644 (file)
index 0000000..7e22954
--- /dev/null
@@ -0,0 +1,73 @@
+dofile "sim_splay.lua"
+between, call, thread, ping = misc.between_c, rpc.call, events.thread, rpc.ping
+n, predecessor, finger, timeout, m = {}, nil, {}, 5, 24
+function join(n0) -- n0: some node in the ring
+       simgrid.info("Euh...")
+       predecessor = nil
+       finger[1] = call(n0, {'find_successor', n.id})
+       simgrid.info("8Here..")
+       call(finger[1], {'notify', n})
+end
+
+function closest_preceding_node(id)
+       for i = m, 1, -1 do
+               if finger[i] and between(finger[i].id, n.id, id) then 
+                       return finger[i]
+               end
+       end
+       return n
+end
+
+function find_successor(id)
+       if finger[1].id == n.id or between(id, n.id, (finger[1].id + 1) % 2^m) then
+               return finger[1]
+       else
+               local n0 = closest_preceding_node(id)
+               return call(n0, {'find_successor', id})
+       end
+end
+function stabilize()
+       local x = call(finger[1], 'predecessor')
+       if x and between(x.id, n.id, finger[1].id) then
+               finger[1] = x -- new successor
+               call(finger[1], {'notify', n})
+       end
+end
+function notify(n0)
+       if n0.id ~= n.id and
+                       (not predecessor or between(n0.id, predecessor.id, n.id)) then
+               predecessor = n0
+       end
+end
+function fix_fingers()
+       refresh = (refresh and (refresh % m) + 1) or 1 -- 1 <= next <= m
+       finger[refresh] = find_successor((n.id + 2^(refresh - 1)) % 2^m)
+end
+function check_predecessor()
+       if predecessor and not rpc.ping(predecessor) then
+               predecessor = nil
+       end
+end
+
+n.id = math.random(1, 2^m)
+finger[1] = n
+if job then
+       n.ip, n.port = job.me.ip, job.me.port
+       join({ip = "192.42.43.42", port = 20000})
+else
+       simgrid.info("bizzaaaaaar...")
+       n.ip, n.port = "127.0.0.1", 20000
+       if arg[1] then n.ip = arg[1] end
+       if arg[2] then n.port = tonumber(arg[2]) end
+       if not arg[3] then
+               print("RDV")
+       else
+               print("JOIN")
+               thread(function() join({ip = arg[3], port = tonumber(arg[4])}) end)
+       end
+end
+rpc.server(n.port)
+events.periodic(stabilize, timeout)
+events.periodic(check_predecessor, timeout)
+events.periodic(fix_fingers, timeout)
+events.loop()