summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/hashserv/client.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/hashserv/client.py')
-rw-r--r--bitbake/lib/hashserv/client.py43
1 files changed, 35 insertions, 8 deletions
diff --git a/bitbake/lib/hashserv/client.py b/bitbake/lib/hashserv/client.py
index 46085d6418..a29af836d9 100644
--- a/bitbake/lib/hashserv/client.py
+++ b/bitbake/lib/hashserv/client.py
@@ -7,6 +7,7 @@ import json
7import logging 7import logging
8import socket 8import socket
9import os 9import os
10from . import chunkify, DEFAULT_MAX_CHUNK
10 11
11 12
12logger = logging.getLogger('hashserv.client') 13logger = logging.getLogger('hashserv.client')
@@ -25,6 +26,7 @@ class Client(object):
25 self.reader = None 26 self.reader = None
26 self.writer = None 27 self.writer = None
27 self.mode = self.MODE_NORMAL 28 self.mode = self.MODE_NORMAL
29 self.max_chunk = DEFAULT_MAX_CHUNK
28 30
29 def connect_tcp(self, address, port): 31 def connect_tcp(self, address, port):
30 def connect_sock(): 32 def connect_sock():
@@ -58,7 +60,7 @@ class Client(object):
58 self.reader = self._socket.makefile('r', encoding='utf-8') 60 self.reader = self._socket.makefile('r', encoding='utf-8')
59 self.writer = self._socket.makefile('w', encoding='utf-8') 61 self.writer = self._socket.makefile('w', encoding='utf-8')
60 62
61 self.writer.write('OEHASHEQUIV 1.0\n\n') 63 self.writer.write('OEHASHEQUIV 1.1\n\n')
62 self.writer.flush() 64 self.writer.flush()
63 65
64 # Restore mode if the socket is being re-created 66 # Restore mode if the socket is being re-created
@@ -91,18 +93,35 @@ class Client(object):
91 count += 1 93 count += 1
92 94
93 def send_message(self, msg): 95 def send_message(self, msg):
96 def get_line():
97 line = self.reader.readline()
98 if not line:
99 raise HashConnectionError('Connection closed')
100
101 if not line.endswith('\n'):
102 raise HashConnectionError('Bad message %r' % message)
103
104 return line
105
94 def proc(): 106 def proc():
95 self.writer.write('%s\n' % json.dumps(msg)) 107 for c in chunkify(json.dumps(msg), self.max_chunk):
108 self.writer.write(c)
96 self.writer.flush() 109 self.writer.flush()
97 110
98 l = self.reader.readline() 111 l = get_line()
99 if not l:
100 raise HashConnectionError('Connection closed')
101 112
102 if not l.endswith('\n'): 113 m = json.loads(l)
103 raise HashConnectionError('Bad message %r' % message) 114 if 'chunk-stream' in m:
115 lines = []
116 while True:
117 l = get_line().rstrip('\n')
118 if not l:
119 break
120 lines.append(l)
104 121
105 return json.loads(l) 122 m = json.loads(''.join(lines))
123
124 return m
106 125
107 return self._send_wrapper(proc) 126 return self._send_wrapper(proc)
108 127
@@ -155,6 +174,14 @@ class Client(object):
155 m['unihash'] = unihash 174 m['unihash'] = unihash
156 return self.send_message({'report-equiv': m}) 175 return self.send_message({'report-equiv': m})
157 176
177 def get_taskhash(self, method, taskhash, all_properties=False):
178 self._set_mode(self.MODE_NORMAL)
179 return self.send_message({'get': {
180 'taskhash': taskhash,
181 'method': method,
182 'all': all_properties
183 }})
184
158 def get_stats(self): 185 def get_stats(self):
159 self._set_mode(self.MODE_NORMAL) 186 self._set_mode(self.MODE_NORMAL)
160 return self.send_message({'get-stats': None}) 187 return self.send_message({'get-stats': None})