From: mehdi Date: Wed, 27 Apr 2011 16:02:51 +0000 (+0200) Subject: chord implementation in splay/lua X-Git-Tag: v3_6_rc3~82 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/6eac7a5107a6946d8d3141da743c5e5971a89347?ds=sidebyside chord implementation in splay/lua --- diff --git a/examples/lua/SimSplay/chord.lua b/examples/lua/SimSplay/chord.lua new file mode 100644 index 0000000000..7e2295428c --- /dev/null +++ b/examples/lua/SimSplay/chord.lua @@ -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()