perf: optimize renamer with batch database queries and reduced blocking

- Add batch offset lookup to reduce N database connections to 1-3 per cycle
- Add search_by_qb_hashes() and search_ids() for batch queries
- Throttle pending rename cache cleanup to once per minute max
- Use exponential backoff for rename verification (0.1s->0.2s->0.4s)
- Skip verification for subtitle renames to reduce latency

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
EstrellaXD
2026-01-28 13:55:20 +01:00
parent 789c02f7f4
commit 99c8764484
5 changed files with 178 additions and 42 deletions

View File

@@ -36,9 +36,7 @@ class TorrentDatabase:
logger.debug(f"Update {data.name} in database.")
def search(self, _id: int) -> Torrent | None:
result = self.session.execute(
select(Torrent).where(Torrent.id == _id)
)
result = self.session.execute(select(Torrent).where(Torrent.id == _id))
return result.scalar_one_or_none()
def search_all(self) -> list[Torrent]:
@@ -46,9 +44,7 @@ class TorrentDatabase:
return list(result.scalars().all())
def search_rss(self, rss_id: int) -> list[Torrent]:
result = self.session.execute(
select(Torrent).where(Torrent.rss_id == rss_id)
)
result = self.session.execute(select(Torrent).where(Torrent.rss_id == rss_id))
return list(result.scalars().all())
def check_new(self, torrents_list: list[Torrent]) -> list[Torrent]:
@@ -62,16 +58,21 @@ class TorrentDatabase:
def search_by_qb_hash(self, qb_hash: str) -> Torrent | None:
"""Find torrent by qBittorrent hash."""
result = self.session.execute(
select(Torrent).where(Torrent.qb_hash == qb_hash)
)
result = self.session.execute(select(Torrent).where(Torrent.qb_hash == qb_hash))
return result.scalar_one_or_none()
def search_by_qb_hashes(self, qb_hashes: list[str]) -> list[Torrent]:
"""Find torrents by multiple qBittorrent hashes (batch query)."""
if not qb_hashes:
return []
result = self.session.execute(
select(Torrent).where(Torrent.qb_hash.in_(qb_hashes))
)
return list(result.scalars().all())
def search_by_url(self, url: str) -> Torrent | None:
"""Find torrent by URL."""
result = self.session.execute(
select(Torrent).where(Torrent.url == url)
)
result = self.session.execute(select(Torrent).where(Torrent.url == url))
return result.scalar_one_or_none()
def update_qb_hash(self, torrent_id: int, qb_hash: str) -> bool: