Onionr/src/gossip/client/storeblocks.py

40 lines
1.1 KiB
Python

from typing import TYPE_CHECKING, List
from threading import Thread
from queue import Queue
import blockdb
if TYPE_CHECKING:
from onionrblocks import Block
from ..dandelion.phase import DandelionPhase
def store_blocks(
block_queues: List[Queue['Block']],
dandelion_phase: 'DandelionPhase'):
new_queue: Queue['Block'] = Queue()
def _watch_queue(block_queue: Queue['Block']):
# Copy all incoming blocks into 1 queue which gets processed to db
while not dandelion_phase.is_stem_phase() \
and dandelion_phase.remaining_time() > 1:
try:
new_queue.put(
block_queue.get(timeout=dandelion_phase.remaining_time()))
except TimeoutError:
pass
for block_queue in block_queues:
Thread(target=_watch_queue, args=block_queue, daemon=True).start()
while not dandelion_phase.is_stem_phase() \
and dandelion_phase.remaining_time() > 1:
try:
blockdb.store_vdf_block(
new_queue.get(timeout=dandelion_phase.remaining_time())
)
except TimeoutError:
pass