diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index 72a25b4f78..610bae21f0 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -976,8 +976,8 @@ class DB: def queue_fts_job(self, book_id, fmt, path, fmt_size, fmt_hash): return self.fts.queue_job(book_id, fmt, path, fmt_size, fmt_hash) - def commit_fts_result(self, book_id, fmt, fmt_size, fmt_hash, text): - return self.fts.commit_result(book_id, fmt, fmt_size, fmt_hash, text) + def commit_fts_result(self, book_id, fmt, fmt_size, fmt_hash, text, err_msg): + return self.fts.commit_result(book_id, fmt, fmt_size, fmt_hash, text, err_msg) def shutdown_fts(self): if self.fts_enabled: diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 96cbc9b736..821f4734c1 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -469,8 +469,8 @@ class Cache: break @write_api - def commit_fts_result(self, book_id, fmt, fmt_size, fmt_hash, text): - return self.backend.commit_fts_result(book_id, fmt, fmt_size, fmt_hash, text) + def commit_fts_result(self, book_id, fmt, fmt_size, fmt_hash, text, err_msg): + return self.backend.commit_fts_result(book_id, fmt, fmt_size, fmt_hash, text, err_msg) @api def set_fts_num_of_workers(self, num=None): diff --git a/src/calibre/db/fts/connect.py b/src/calibre/db/fts/connect.py index d56e2c0f8d..15d7c14990 100644 --- a/src/calibre/db/fts/connect.py +++ b/src/calibre/db/fts/connect.py @@ -86,7 +86,7 @@ class FTS: return book_id, fmt return None, None - def commit_result(self, book_id, fmt, fmt_size, fmt_hash, text): + def commit_result(self, book_id, fmt, fmt_size, fmt_hash, text, err_msg=''): conn = self.get_connection() text_hash = '' if text: diff --git a/src/calibre/db/fts/pool.py b/src/calibre/db/fts/pool.py index 305e75dbdf..7cf8458e9a 100644 --- a/src/calibre/db/fts/pool.py +++ b/src/calibre/db/fts/pool.py @@ -52,6 +52,7 @@ class Worker(Thread): code_to_exec = 'from calibre.db.fts.text import main; main({!r})' max_duration = 30 # minutes + poll_interval = 0.1 # seconds def __init__(self, jobs_queue, supervise_queue): super().__init__(name='FTSWorker', daemon=True) @@ -91,14 +92,14 @@ class Worker(Thread): ) while self.keep_going and monotonic() <= time_limit: with suppress(subprocess.TimeoutExpired): - p.wait(0.1) + p.wait(self.poll_interval) break if p.returncode is None: p.kill() - if monotonic() > time_limit: - return Result(job, _('Extracting text from the {0} file of size {1} took too long').format( - job.fmt, human_readable(job.fmt_size))) - return + if not self.keep_going: + return + return Result(job, _('Extracting text from the {0} file of size {1} took too long').format( + job.fmt, human_readable(job.fmt_size))) if os.path.exists(txtpath): return Result(job) with open(errpath, 'rb') as f: @@ -183,13 +184,15 @@ class Pool: def commit_result(self, result): text = result.text + err_msg = '' if not result.ok: print(f'Failed to get text from book_id: {result.book_id} format: {result.fmt}', file=sys.stderr) print(text, file=sys.stderr) + err_msg = text text = '' db = self.dbref() if db is not None: - db.commit_fts_result(result.book_id, result.fmt, result.fmt_size, result.fmt_hash, text) + db.commit_fts_result(result.book_id, result.fmt, result.fmt_size, result.fmt_hash, text, err_msg) def shutdown(self): if self.initialized: