Skip to content

Commit 4fb5537

Browse files
committed
Merge pull request #272 from Cal-CS-61A-Staff/no-multithreading
No multithreading
2 parents 4860093 + 189e23e commit 4fb5537

File tree

2 files changed

+55
-59
lines changed

2 files changed

+55
-59
lines changed

client/cli/ok.py

+22-49
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
from urllib import error
4545
import argparse
4646
import client
47-
import multiprocessing
47+
import os
4848
import pickle
4949
import sys
5050
import logging
@@ -122,10 +122,6 @@ def main():
122122
server_thread, timer_thread = None, None
123123
try:
124124
print("You are running version {0} of ok.py".format(client.__version__))
125-
if not args.local:
126-
timer_thread = multiprocessing.Process(target=network.server_timer,
127-
args=())
128-
timer_thread.start()
129125

130126
cases = {case.type: case for case in core.get_testcases(config.cases)}
131127
assignment = None
@@ -143,43 +139,22 @@ def main():
143139
for p in protocol.get_protocols(config.protocols)]
144140

145141
messages = dict()
146-
msg_queue = multiprocessing.Queue()
147-
file_contents = []
142+
msg_list= []
148143

149144
try:
150145
with open(BACKUP_FILE, 'rb') as fp:
151-
file_contents = pickle.load(fp)
146+
msg_list = pickle.load(fp)
152147
log.info('Loaded %d backed up messages from %s',
153-
len(file_contents), BACKUP_FILE)
148+
len(msg_list), BACKUP_FILE)
154149
except (IOError, EOFError) as e:
155150
log.info('Error reading from ' + BACKUP_FILE \
156151
+ ', assume nothing backed up')
157152

158-
for message in file_contents:
159-
msg_queue.put(message)
160-
161153
for proto in protocols:
162154
log.info('Execute %s.on_start()', proto.name)
163155
messages[proto.name] = proto.on_start()
164156
messages['timestamp'] = str(datetime.now())
165157

166-
if not args.local:
167-
try:
168-
access_token = auth.authenticate(args.authenticate)
169-
log.info('Authenticated with access token %s', access_token)
170-
171-
msg_queue.put(messages)
172-
staging_queue = multiprocessing.Queue()
173-
interceptor = output.LogInterceptor()
174-
server_thread = multiprocessing.Process(
175-
target=network.dump_to_server,
176-
args=(access_token, msg_queue, assignment['name'],
177-
args.server, args.insecure, staging_queue,
178-
client.__version__, interceptor))
179-
server_thread.start()
180-
except error.URLError as ex:
181-
log.warning('on_start messages not sent to server: %s', str(e))
182-
183158
interact_msg = {}
184159

185160
for proto in protocols:
@@ -191,36 +166,34 @@ def main():
191166
# TODO(denero) Print server responses.
192167

193168
if not args.local:
194-
msg_queue.put(interact_msg)
169+
msg_list.append(interact_msg)
195170

196-
while timer_thread.is_alive():
197-
pass
171+
try:
172+
access_token = auth.authenticate(args.authenticate)
173+
log.info('Authenticated with access token %s', access_token)
198174

199-
if not args.submit:
200-
server_thread.terminate()
201-
else:
202-
server_thread.join()
175+
msg_list.append(messages)
176+
print("Attempting to send files to server...")
177+
network.dump_to_server(access_token, msg_list,
178+
assignment['name'], args.server, args.insecure,
179+
client.__version__, log, send_all=args.submit)
203180

204-
interceptor.dump_to_logger(log)
181+
except error.URLError as ex:
182+
log.warning('on_start messages not sent to server: %s', str(e))
205183

206-
dump_list = []
207-
while not msg_queue.empty():
208-
dump_list.append(msg_queue.get_nowait())
209-
while not staging_queue.empty():
210-
dump_list.append(staging_queue.get_nowait())
211184
with open(BACKUP_FILE, 'wb') as fp:
212-
log.info('Save %d unsent messages to %s', len(dump_list),
185+
log.info('Save %d unsent messages to %s', len(msg_list),
213186
BACKUP_FILE)
214-
pickle.dump(dump_list, fp)
215187

216-
if len(dump_list) == 0:
188+
pickle.dump(msg_list, fp)
189+
os.fsync(fp)
190+
191+
if len(msg_list) == 0:
217192
print("Server submission successful")
218193

219194
except KeyboardInterrupt:
220-
if timer_thread:
221-
timer_thread.terminate()
222-
if server_thread:
223-
server_thread.terminate()
195+
print("Quitting ok.")
196+
224197
finally:
225198
if assignment:
226199
log.info('Dump tests for %s to %s', assignment['name'], args.tests)

client/utils/network.py

+33-10
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
from urllib import request, error
44
import json
55
import time
6+
import datetime
7+
import socket
8+
9+
TIMEOUT = 500
610

711
def send_to_server(access_token, messages, name, server, version, log,
812
insecure=False):
@@ -23,7 +27,7 @@ def send_to_server(access_token, messages, name, server, version, log,
2327
log.info('Sending data to %s', address)
2428
req = request.Request(address)
2529
req.add_header("Content-Type", "application/json")
26-
response = request.urlopen(req, serialized)
30+
response = request.urlopen(req, serialized, TIMEOUT)
2731
return json.loads(response.read().decode('utf-8'))
2832
except error.HTTPError as ex:
2933
log.warning('Error while sending to server: %s', str(ex))
@@ -38,22 +42,41 @@ def send_to_server(access_token, messages, name, server, version, log,
3842
except Exception as e:
3943
log.warning('Could not connect to %s', server)
4044

41-
def dump_to_server(access_token, msg_queue, name, server, insecure, staging_queue,
42-
version, log):
43-
while not msg_queue.empty():
44-
message = msg_queue.get()
45-
staging_queue.put(message)
45+
def dump_to_server(access_token, msg_list, name, server, insecure, version, log, send_all=False):
46+
#TODO(soumya) Change after we get data on ok_messages
47+
# This request is temporary- it'll be removed in the next day or two.
48+
send_all = False
49+
try:
50+
prefix = "http" if insecure else "https"
51+
address = prefix + "://" + server + "/api/v1/nothing"
52+
address += "?access_token={0}&ok_messages={1}".format(access_token,
53+
len(msg_list))
54+
req = request.Request(address)
55+
response = request.urlopen(req, b"", 0.4)
56+
except Exception as e:
57+
pass
58+
59+
stop_time = datetime.datetime.now() + datetime.timedelta(milliseconds=TIMEOUT)
60+
initial_length = len(msg_list)
61+
while msg_list:
62+
if not send_all and datetime.datetime.now() > stop_time:
63+
break
64+
message = msg_list[-1]
4665
try:
47-
if not send_to_server(access_token, message, name, server, version, log, insecure):
48-
staging_queue.get() #throw away successful message
49-
else:
50-
msg_queue.put(staging_queue.get())
66+
response = send_to_server(access_token, message, name, server, version, log, insecure)
67+
if response:
68+
msg_list.pop()
69+
if send_all:
70+
print("Submitting project... {0}% complete".format(len(msg_list)*100/initial_length))
5171
except SoftwareUpdated:
72+
print("ok was updated. We will now terminate this run of ok.")
5273
log.info('ok was updated. Abort now; messages will be sent '
5374
'to server on next invocation')
5475
return
5576
except error.URLError as ex:
5677
log.warning('URLError: %s', str(ex))
78+
except socket.timeout as ex:
79+
log.warning("socket.timeout: %s", str(ex))
5780
return
5881

5982
def server_timer():

0 commit comments

Comments
 (0)