feat: allow unrestricted independent job concurrency
This commit is contained in:
@@ -22,6 +22,47 @@ from archive_control.v1 import (
|
||||
|
||||
|
||||
class DaemonTransportTests(unittest.IsolatedAsyncioTestCase):
|
||||
async def test_unrelated_job_commands_execute_concurrently(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
token = root / "token"
|
||||
token.write_text("shared-secret", encoding="utf-8")
|
||||
os.chmod(token, 0o600)
|
||||
service = ServiceConfig("http://local", PurePosixPath("/api"), root)
|
||||
config = ClientConfig(
|
||||
"cache-1", "Cache 1", "cache", "ws://control", token,
|
||||
root / "state.db", root / "backups", service, service,
|
||||
)
|
||||
probe = FilesystemProbe(root, True, True, True, True, True)
|
||||
daemon = ArchiveClientDaemon(config, [probe, probe], [])
|
||||
started: set[str] = set()
|
||||
release = asyncio.Event()
|
||||
|
||||
async def execute(command, correlation_id, outbound):
|
||||
started.add(command.assign_job.job.job_id)
|
||||
await release.wait()
|
||||
|
||||
daemon._execute_job_command_locked = execute
|
||||
commands = []
|
||||
for _ in range(2):
|
||||
command = control_pb2.Command(command_id=str(uuid4()))
|
||||
command.assign_job.job.job_id = str(uuid4())
|
||||
commands.append(command)
|
||||
outbound = asyncio.Queue()
|
||||
tasks = [
|
||||
asyncio.create_task(
|
||||
daemon._execute_job_command(command, "", outbound)
|
||||
)
|
||||
for command in commands
|
||||
]
|
||||
for _ in range(100):
|
||||
if len(started) == 2:
|
||||
break
|
||||
await asyncio.sleep(0.01)
|
||||
self.assertEqual(len(started), 2)
|
||||
release.set()
|
||||
await asyncio.gather(*tasks)
|
||||
|
||||
async def test_silent_control_connection_ends_for_reconnect(self):
|
||||
"""A lost server heartbeat must not leave durable commands stranded."""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user