Skip to content

Commit 718db73

Browse files
authored
Merge pull request #1995 from UlrichB22/fix_1017
Rename and rework get_indexer function
2 parents 9a823d9 + a391485 commit 718db73

File tree

1 file changed

+30
-28
lines changed

1 file changed

+30
-28
lines changed

src/moin/storage/middleware/indexing.py

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Copyright: 2011 MoinMoin:RonnyPfannschmidt
22
# Copyright: 2011 MoinMoin:ThomasWaldmann
33
# Copyright: 2011 MoinMoin:MichaelMayorov
4-
# Copyright: 2024 MoinMoin:UlrichB
4+
# Copyright: 2024-2025 MoinMoin:UlrichB
55
# License: GNU GPL v2 (or any later version), see LICENSE.txt for details.
66

77
"""
@@ -105,29 +105,6 @@
105105
INDEXER_TIMEOUT = 20.0
106106

107107

108-
def get_indexer(fn, **kw):
109-
"""
110-
Return a valid indexer or raise a KeyError.
111-
112-
Under heavy loads, the Whoosh AsyncWriter writer may be delayed in writing
113-
indexes to storage. Try several times before failing.
114-
115-
FIXME: runs into timeout for a non-existing revid
116-
117-
:param fn: the indexer function
118-
:param **kw: "revid" is required, index name optional
119-
"""
120-
until = time.time() + INDEXER_TIMEOUT
121-
while True:
122-
indexer = fn(**kw)
123-
if indexer is not None:
124-
break
125-
time.sleep(2)
126-
if time.time() > until:
127-
raise KeyError(kw.get("revid", "") + " - server overload or corrupt index")
128-
return indexer
129-
130-
131108
def parent_names(names):
132109
"""
133110
Compute list of parent names (same order as in names, but no dupes)
@@ -1045,6 +1022,31 @@ def existing_item(self, **query):
10451022
"""
10461023
return Item.existing(self, **query)
10471024

1025+
def get_document(self, revid: str, retry: bool = False, **kwargs):
1026+
"""
1027+
Return a valid indexer document or raise a KeyError.
1028+
1029+
Under heavy loads, the Whoosh AsyncWriter writer may be delayed in writing
1030+
indexes to storage. Try several times before failing.
1031+
1032+
:param revid: revision to search
1033+
:param retry: retry backend search if document not found, required when server load is high
1034+
:param kwargs: idx_name, name of index used for searching (optional)
1035+
"""
1036+
until = time.monotonic() + INDEXER_TIMEOUT
1037+
while True:
1038+
doc = self._document(revid=revid, **kwargs)
1039+
if doc is not None:
1040+
break
1041+
if not retry:
1042+
msg = f"revid: {revid} not found. Please check meta data and indexes"
1043+
raise KeyError(msg)
1044+
if time.monotonic() > until:
1045+
msg = f"revid: {revid} - Server overload may have corrupted the index; rebuild it."
1046+
raise KeyError(msg)
1047+
time.sleep(2)
1048+
return doc
1049+
10481050

10491051
class PropertiesMixin:
10501052
"""
@@ -1357,9 +1359,9 @@ def store_revision(
13571359
self.indexer.index_revision(meta, content, backend_name, force_latest=not overwrite)
13581360
gc.collect() # triggers close of index files from is_latest search
13591361
if not overwrite:
1360-
self._current = get_indexer(self.indexer._document, revid=revid)
1362+
self._current = self.indexer.get_document(revid=revid, retry=True)
13611363
if return_rev:
1362-
return Revision(self, revid)
1364+
return Revision(self, revid, retry=True)
13631365

13641366
def store_all_revisions(self, meta, data):
13651367
"""
@@ -1404,13 +1406,13 @@ class Revision(PropertiesMixin):
14041406
An existing revision (exists in the backend).
14051407
"""
14061408

1407-
def __init__(self, item: Item, revid: str, doc=None, name=None):
1409+
def __init__(self, item: Item, revid: str, doc=None, name=None, retry=False):
14081410
is_current = revid == CURRENT
14091411
if doc is None:
14101412
if is_current:
14111413
doc = item._current
14121414
else:
1413-
doc = get_indexer(item.indexer._document, idx_name=ALL_REVS, revid=revid)
1415+
doc = item.indexer.get_document(idx_name=ALL_REVS, revid=revid, retry=retry)
14141416

14151417
if is_current:
14161418
revid = doc.get(REVID)

0 commit comments

Comments
 (0)