Skip to content

Commit b4ac518

Browse files
authored
treat Semaphore._waiters as length zero when it is None (#13638)
We access the `._waiters` private attribute of the Python asyncio `Semaphore` class. This was changed in Python 3.10.8 (and other versions) to be initialized to `None` instead of an empty deque. Our existing unconditional length checks failed on the new `None` default. This seems to block syncing. python/cpython#97020 https://github.com/python/cpython/compare/v3.10.7..v3.10.8#diff-0fee1befb15023abc0dad2623effa93a304946796929f6cb445d11a57821e737 Reported traceback: ```python-traceback 2022-10-12T20:03:59.367 full_node full_node_server : INFO Connected with full_node {'host': '65.34.144.6', 'port': 8444} 2022-10-12T20:03:59.370 full_node full_node_server : ERROR Exception: object of type 'NoneType' has no len(), {'host': '65.34.144.6', 'port': 8444}. Traceback (most recent call last): File "/home/summa/chia-blockchain/chia/server/server.py", line 598, in wrapped_coroutine result = await coroutine File "/home/summa/chia-blockchain/chia/full_node/full_node_api.py", line 114, in new_peak waiter_count = len(self.full_node.new_peak_sem._waiters) TypeError: object of type 'NoneType' has no len() 2022-10-12T20:03:59.371 full_node full_node_server : ERROR Exception: object of type 'NoneType' has no len() <class 'TypeError'>, closing connection {'host': '65.34.144.6', 'port': 8444}. Traceback (most recent call last): File "/home/summa/chia-blockchain/chia/server/server.py", line 608, in api_call response: Optional[Message] = await asyncio.wait_for(wrapped_coroutine(), timeout=timeout) File "/usr/lib/python3.10/asyncio/tasks.py", line 408, in wait_for return await fut File "/home/summa/chia-blockchain/chia/server/server.py", line 605, in wrapped_coroutine raise e File "/home/summa/chia-blockchain/chia/server/server.py", line 598, in wrapped_coroutine result = await coroutine File "/home/summa/chia-blockchain/chia/full_node/full_node_api.py", line 114, in new_peak waiter_count = len(self.full_node.new_peak_sem._waiters) TypeError: object of type 'NoneType' has no len() 2022-10-12T20:03:59.487 full_node full_node_server : INFO Connection closed: 65.34.144.6, node id: 506fe4c05ce6b72bb707471842e552307c7a547aa9ba981175db5c08fa3e47e6 ```
1 parent 5ee4c39 commit b4ac518

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

chia/full_node/full_node_api.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,16 @@ async def new_peak(self, request: full_node_protocol.NewPeak, peer: ws.WSChiaCon
122122
"""
123123
# this semaphore limits the number of tasks that can call new_peak() at
124124
# the same time, since it can be expensive
125-
waiter_count = len(self.full_node.new_peak_sem._waiters)
125+
new_peak_sem = self.full_node.new_peak_sem
126+
waiter_count = 0 if new_peak_sem._waiters is None else len(new_peak_sem._waiters)
126127

127128
if waiter_count > 0:
128129
self.full_node.log.debug(f"new_peak Waiters: {waiter_count}")
129130

130131
if waiter_count > 20:
131132
return None
132133

133-
async with self.full_node.new_peak_sem:
134+
async with new_peak_sem:
134135
await self.full_node.new_peak(request, peer)
135136
return None
136137

@@ -1436,7 +1437,9 @@ async def new_compact_vdf(
14361437
if self.full_node.sync_store.get_sync_mode():
14371438
return None
14381439

1439-
if len(self.full_node.compact_vdf_sem._waiters) > 20:
1440+
compact_vdf_sem = self.full_node.compact_vdf_sem
1441+
waiter_count = 0 if compact_vdf_sem._waiters is None else len(compact_vdf_sem._waiters)
1442+
if waiter_count > 20:
14401443
self.log.debug(f"Ignoring NewCompactVDF: {request}, _waiters")
14411444
return None
14421445

0 commit comments

Comments
 (0)