portal 3.7.0__tar.gz → 3.7.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. {portal-3.7.0/portal.egg-info → portal-3.7.2}/PKG-INFO +1 -1
  2. {portal-3.7.0 → portal-3.7.2}/portal/__init__.py +1 -1
  3. {portal-3.7.0 → portal-3.7.2}/portal/batching.py +2 -1
  4. {portal-3.7.0 → portal-3.7.2}/portal/client_socket.py +1 -6
  5. {portal-3.7.0 → portal-3.7.2}/portal/server_socket.py +15 -11
  6. {portal-3.7.0 → portal-3.7.2/portal.egg-info}/PKG-INFO +1 -1
  7. {portal-3.7.0 → portal-3.7.2}/tests/test_client.py +5 -2
  8. {portal-3.7.0 → portal-3.7.2}/LICENSE +0 -0
  9. {portal-3.7.0 → portal-3.7.2}/MANIFEST.in +0 -0
  10. {portal-3.7.0 → portal-3.7.2}/README.md +0 -0
  11. {portal-3.7.0 → portal-3.7.2}/portal/buffers.py +0 -0
  12. {portal-3.7.0 → portal-3.7.2}/portal/client.py +0 -0
  13. {portal-3.7.0 → portal-3.7.2}/portal/contextlib.py +0 -0
  14. {portal-3.7.0 → portal-3.7.2}/portal/packlib.py +0 -0
  15. {portal-3.7.0 → portal-3.7.2}/portal/poollib.py +0 -0
  16. {portal-3.7.0 → portal-3.7.2}/portal/process.py +0 -0
  17. {portal-3.7.0 → portal-3.7.2}/portal/server.py +0 -0
  18. {portal-3.7.0 → portal-3.7.2}/portal/sharray.py +0 -0
  19. {portal-3.7.0 → portal-3.7.2}/portal/thread.py +0 -0
  20. {portal-3.7.0 → portal-3.7.2}/portal/utils.py +0 -0
  21. {portal-3.7.0 → portal-3.7.2}/portal.egg-info/SOURCES.txt +0 -0
  22. {portal-3.7.0 → portal-3.7.2}/portal.egg-info/dependency_links.txt +0 -0
  23. {portal-3.7.0 → portal-3.7.2}/portal.egg-info/requires.txt +0 -0
  24. {portal-3.7.0 → portal-3.7.2}/portal.egg-info/top_level.txt +0 -0
  25. {portal-3.7.0 → portal-3.7.2}/pyproject.toml +0 -0
  26. {portal-3.7.0 → portal-3.7.2}/requirements.txt +0 -0
  27. {portal-3.7.0 → portal-3.7.2}/setup.cfg +0 -0
  28. {portal-3.7.0 → portal-3.7.2}/setup.py +0 -0
  29. {portal-3.7.0 → portal-3.7.2}/tests/test_batching.py +0 -0
  30. {portal-3.7.0 → portal-3.7.2}/tests/test_errfile.py +0 -0
  31. {portal-3.7.0 → portal-3.7.2}/tests/test_pack.py +0 -0
  32. {portal-3.7.0 → portal-3.7.2}/tests/test_process.py +0 -0
  33. {portal-3.7.0 → portal-3.7.2}/tests/test_server.py +0 -0
  34. {portal-3.7.0 → portal-3.7.2}/tests/test_socket.py +0 -0
  35. {portal-3.7.0 → portal-3.7.2}/tests/test_thread.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: portal
3
- Version: 3.7.0
3
+ Version: 3.7.2
4
4
  Summary: Fast and reliable distributed systems in Python
5
5
  Home-page: http://github.com/danijar/portal
6
6
  Author: Danijar Hafner
@@ -1,4 +1,4 @@
1
- __version__ = '3.7.0'
1
+ __version__ = '3.7.2'
2
2
 
3
3
  import multiprocessing as mp
4
4
  try:
@@ -19,7 +19,8 @@ class BatchServer:
19
19
  self, port, name='Server', workers=1, errors=True,
20
20
  process=True, shmem=False, **kwargs):
21
21
  inner_port = utils.free_port()
22
- assert port != inner_port, (port, inner_port)
22
+ while inner_port == port:
23
+ inner_port = utils.free_port()
23
24
  self.name = name
24
25
  self.server = server.Server(inner_port, name, workers, errors, **kwargs)
25
26
  if process:
@@ -207,7 +207,7 @@ class ClientSocket:
207
207
  sock.settimeout(10)
208
208
  sock.connect(addr)
209
209
  self._log('Connection established')
210
- self._send_handshake(sock)
210
+ sock.sendall(self.options.handshake.encode('utf-8'))
211
211
  sock.settimeout(0)
212
212
  return sock
213
213
  except TimeoutError as e:
@@ -252,11 +252,6 @@ class ClientSocket:
252
252
 
253
253
  return sock
254
254
 
255
- def _send_handshake(self, sock):
256
- buf = buffers.SendBuffer(self.options.handshake.encode('utf-8'))
257
- while not buf.done():
258
- buf.send(sock)
259
-
260
255
  def _log(self, *args):
261
256
  if not self.options.logging:
262
257
  return
@@ -16,7 +16,7 @@ class Connection:
16
16
  self.sock = sock
17
17
  self.addr = addr
18
18
  self.recvbuf = None
19
- self.handshake = False
19
+ self.handshake = b''
20
20
  self.sendbufs = collections.deque()
21
21
 
22
22
  def fileno(self):
@@ -44,6 +44,7 @@ class ServerSocket:
44
44
  port = int(port.rsplit(':', 1)[-1])
45
45
  self.name = name
46
46
  self.options = Options(**{**contextlib.context.serverkw, **kwargs})
47
+ self.handshake = self.options.handshake.encode('utf-8')
47
48
  if self.options.ipv6:
48
49
  self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
49
50
  self.sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
@@ -152,7 +153,11 @@ class ServerSocket:
152
153
  if not conn.recvbuf:
153
154
  conn.recvbuf = buffers.RecvBuffer(maxsize=self.options.max_msg_size)
154
155
  try:
155
- conn.recvbuf.recv(conn.sock)
156
+ if len(conn.handshake) < len(self.handshake):
157
+ self._handshake(conn)
158
+ return
159
+ else:
160
+ conn.recvbuf.recv(conn.sock)
156
161
  except OSError as e:
157
162
  # For example:
158
163
  # - ConnectionResetError
@@ -163,16 +168,8 @@ class ServerSocket:
163
168
  return
164
169
  if self.recvq.qsize() > self.options.max_recv_queue:
165
170
  raise RuntimeError('Too many incoming messages enqueued')
166
- message = conn.recvbuf.result()
171
+ self.recvq.put((conn.addr, conn.recvbuf.result()))
167
172
  conn.recvbuf = None
168
- if not conn.handshake:
169
- if message != self.options.handshake.encode('utf-8'):
170
- e = ValueError(f"Handshake '{self.options.handshake}' expected")
171
- self._disconnect(conn, e)
172
- return
173
- conn.handshake = True
174
- else:
175
- self.recvq.put((conn.addr, message))
176
173
 
177
174
  def _disconnect(self, conn, e):
178
175
  detail = f'{type(e).__name__}'
@@ -189,6 +186,13 @@ class ServerSocket:
189
186
  def _numsending(self):
190
187
  return sum(len(x.sendbufs) for x in self.conns.values())
191
188
 
189
+ def _handshake(self, conn):
190
+ assert len(conn.handshake) < len(self.handshake)
191
+ conn.handshake += conn.sock.recv(len(self.handshake) - len(conn.handshake))
192
+ if conn.handshake != self.handshake[:len(conn.handshake)]:
193
+ msg = f"Expected handshake '{self.handshake}' got '{conn.handshake}'"
194
+ self._disconnect(conn, ValueError(msg))
195
+
192
196
  def _log(self, *args, **kwargs):
193
197
  if not self.options.logging:
194
198
  return
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: portal
3
- Version: 3.7.0
3
+ Version: 3.7.2
4
4
  Summary: Fast and reliable distributed systems in Python
5
5
  Home-page: http://github.com/danijar/portal
6
6
  Author: Danijar Hafner
@@ -286,6 +286,7 @@ class TestClient:
286
286
  port = portal.free_port()
287
287
  a = threading.Barrier(2)
288
288
  b = threading.Barrier(2)
289
+ c = threading.Barrier(2)
289
290
 
290
291
  def server():
291
292
  server = Server(port)
@@ -296,10 +297,11 @@ class TestClient:
296
297
  stats = server.stats()
297
298
  assert stats['numrecv'] == 1
298
299
  assert stats['numsend'] == stats['numrecv']
300
+ b.wait()
299
301
  server = Server(port)
300
302
  server.bind('fn', lambda x: x)
301
303
  server.start(block=False)
302
- b.wait()
304
+ c.wait()
303
305
  server.close()
304
306
 
305
307
  def client():
@@ -310,9 +312,10 @@ class TestClient:
310
312
  time.sleep(0.1)
311
313
  with pytest.raises(portal.Disconnected):
312
314
  client.fn(3).result()
315
+ b.wait()
313
316
  client.connect()
314
317
  assert client.fn(3).result() == 3
315
- b.wait()
318
+ c.wait()
316
319
  client.close()
317
320
 
318
321
  portal.run([
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes