import repository from arizona
[raven.git] / demo / pingpong / ping.py
1 #! /usr/bin/python
2
3 import os
4 import pickle
5 import socket
6 import time
7
8 def load_members():
9     """ Read the membership information from kong to find the set of
10         participating nodes. The members directory contains one file for each
11         member, and the file name named after the hostname. The file may
12         contain NAME=VALUE pairs.
13     """
14     members = {}
15
16     for fn in os.listdir("/var/kong/members"):
17         if fn.startswith("."):
18             continue
19         pathname = os.path.join("/var/kong/members", fn)
20
21         member_dict = {}
22
23         f = open(pathname, "rt")
24         for line in f.readlines():
25             if not ("=" in line):
26                 continue
27             (var, val) = line.split("=", 1)
28             var = var.strip()
29             val = val.strip()
30
31             if var == "":
32                 continue
33
34             member_dict[var] = val
35
36         members[fn] = member_dict
37
38     return members
39
40
41 def main():
42     members = load_members()
43
44     send_count = 0
45     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
46
47     s.settimeout(30)
48
49     seqno = int(time.time())
50
51     # send the pings
52
53     for hostname in members.keys():
54         member_dict = members[hostname]
55         if not "mem_pong_port" in member_dict:
56             print "ping: membership info for", hostname, "does not have a mem_pong_port variable"
57             continue
58
59         payload = {"time": time.time(), "hostname": hostname, "seqno": seqno}
60         payload = pickle.dumps(payload)
61
62         addr = (hostname, int(member_dict["mem_pong_port"]))
63         print "ping: sending to", addr
64         s.sendto(payload, addr)
65
66     # wait for the pongs
67
68     print "ping: waiting for responses"
69
70     timed_out = False
71     while not timed_out:
72        try:
73            (payload, addr) = s.recvfrom(4096)
74            payload = pickle.loads(payload)
75            hostname = payload["hostname"]
76            elapsed = int((time.time() - payload.get("time", 0.0)) * 1000)
77            if (payload.get("seqno") == seqno) and (hostname in members):
78                member_dict = members[payload["hostname"]]
79                member_dict["elapsed"] = elapsed
80                print "ping: received from", payload["hostname"], "elapsed:", elapsed
81
82                file(os.path.join("/var/kong/results", hostname), "wt").write(str(elapsed))
83        except socket.timeout:
84            print "ping: timeout"
85            timed_out = True
86
87
88
89
90
91
92 if __name__ == "__main__":
93     main()