import repository from arizona
[raven.git] / owl / client / seattle / benchexperiment.repy
1 include owl.repy
2 include sha.repy
3 include geoip_client.repy
4
5 # DBS = database names to update. You should define your own unique database
6 #       name here.
7 DBS = ["seattle_benchexperiment"]
8
9 # OWL_URL = the URL to contact the Owl server.
10 OWL_URL = "http://owl.cs.arizona.edu/owl/"
11
12 # OWL_UPDATE_PERIOD = The interval in seconds at which to update the Owl database.
13 #       A repy timer will be created to launch a thread at this time.
14 OWL_UPDATE_PERIOD = 60
15
16 # some data to hash, taken from the raven webpage
17 #
18 # note: using a much shorter string than the Planetlab version, since the
19 #   python-based sha that seattle uses seems to be much slower, and was
20 #   rounding off to 0 ops/sec.
21
22 datablock = "Raven is a research project"
23
24 def cpubench():
25     SECONDS = 1.0
26
27     count = 0
28     tStart = getruntime()
29     tStop = tStart
30     m = sha_new()
31     while (tStop-tStart) < SECONDS:
32         count = count + 1
33         m.update(datablock)
34         if (count % 10) == 0:
35             # getruntime appears to be what is slowing us down, so lets only
36             # do it once every 10 iterations
37             tStop = getruntime()
38
39     return int(count / (tStop-tStart) / SECONDS)
40
41
42 def _decode_pong_packet(ip, port, mess, ch):
43     mycontext['pong_time'] = getruntime()
44     mycontext['pong_received'] = True
45     stopcomm(ch)
46
47 def pingbench():
48     HOSTADDR = ("quake.cs.arizona.edu", 4321)
49     TIMEOUT = 5
50
51     ip = getmyip()
52     localport = mycontext['port']
53
54     listenhandle = recvmess(ip, localport, _decode_pong_packet)
55     mycontext['pong_received'] = False
56     mycontext['pong_time'] = -1
57
58     try:
59         tStart = getruntime()
60         sendmess(HOSTADDR[0], HOSTADDR[1], "PING", ip, localport)
61
62         # wait 5 seconds
63         for junkiterations in range(TIMEOUT * 2):
64             sleep(0.5)
65             if mycontext['pong_received']:
66                 return int((mycontext['pong_time'] - tStart) * 1000)
67
68         return -1
69     finally:
70         stopcomm(listenhandle)
71
72
73 def owl_seattle_register():
74     """ register with the OWL server
75
76         In this function, we define the modules and fields that we will be
77         reporting to Owl. Modules serve as logical containers for fields, and
78         each module has a version number. If you modify a module (or the
79         field definitions contained within), then make sure to increment the
80         version number.
81
82         The module "basic" and the field "basic.id" are required. All other
83         fields are optional.
84     """
85     owl = Owl(OWL_URL, 10, 600, 600)
86
87     # basic.id is required and identifies the sliver that is running
88     fBasicID = Field("id", "basic", "string", "ID")
89     owl.register(DBS, "basic", "1.3", [fBasicID], "Basic")
90
91     # seattle.runtime is the runtime in seconds
92     fSeattleRuntime = Field("runtime", "seattle", "integer", "Runtime")
93     owl.register(DBS, "seattle", "1.5", [fSeattleRuntime], "Seattle")
94
95     fCpuBenchOpsPerSecond = Field("opspersec", "ravencpubench", "integer", "SHA1/second")
96     owl.register(DBS, "ravencpubench", "1.1", [fCpuBenchOpsPerSecond], "CPU Bench")
97
98     fPingBenchElapsed = Field("elapsed", "ravenpingbench", "integer", "Round Trip Time")
99     owl.register(DBS, "ravenpingbench", "1.0", [fPingBenchElapsed], "Ping Bench")
100
101     fLatitude = Field("latitude", "mapviewer", "string", "Latitude")
102     fLongitude = Field("longitude", "mapviewer", "string", "Longitude")
103     fColor = Field("color", "mapviewer", "string", "Color")
104     owl.register(DBS, "mapviewer", "0.10", [fColor, fLatitude, fLongitude])
105
106 def owl_seattle_update():
107     """ send an update to the OWL server
108
109         In this function, we send an update request to Owl. The update is
110         contained in a dictionary where each key is in "modulename.fieldname"
111         format (for example, "basic.id").
112     """
113     owl = Owl(OWL_URL, 10, 600, 600)
114
115     update = {}
116
117     update["basic.id"] = getmyip()
118     update["seattle.runtime"] = str(int(getruntime()))
119
120     # benchmarks
121     update["ravencpubench.opspersec"] = str(cpubench())
122     update["ravenpingbench.elapsed"] = str(pingbench())
123
124     # mapviewer
125     if ("latitude" in mycontext):
126         update["mapviewer.latitude"] = mycontext["latitude"]
127         update["mapviewer.longitude"] = mycontext["longitude"]
128         update["mapviewer.color"] = "1"
129
130     # for debugging; comment out if unneeded
131     print "calling update"
132
133     print update
134
135     owl.update(DBS, update)
136
137     settimer(OWL_UPDATE_PERIOD, owl_seattle_update, [])
138
139 def owl_seattle_init():
140     # register with owl to tell what our fields are
141     owl_seattle_register()
142
143     # schedule an owl update. the first update will happen immediately.
144     settimer(0, owl_seattle_update, [])
145
146 if callfunc == "initialize":
147     if len(callargs) != 1:
148         raise Exception, "Must specify the port to use"\r
149 \r
150     mycontext['port'] = int(callargs[0])
151
152     print "initializing geoip client for map resolution"
153     try:
154         geoip_init_client()
155         geo_rec = geoip_record_by_addr(getmyip())
156         if geo_rec and ("latitude" in geo_rec) and ("longitude" in geo_rec):
157             mycontext["latitude"] = str(geo_rec["latitude"])
158             mycontext["longitude"] = str(geo_rec["longitude"])
159     except:
160         print "exception while doing geoip"
161
162     print "benchmark experiment start"
163
164     # register with Owl, and fork off the Owl updater process
165     owl_seattle_init()
166
167     # simulate some work by looping around for 10 minutes
168     i=0;
169     while (i<600):
170        # I'm doing lots of work here!
171        sleep(1)
172        i = i + 1
173
174     print "benchmark experiment complete"
175
176     exitall()