Skip to content

Commit 61bbbca

Browse files
committed
Rename and rework get_indexer function
1 parent ad06a02 commit 61bbbca

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

src/moin/storage/middleware/indexing.py

Lines changed: 19 additions & 15 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,27 +105,31 @@
105105
INDEXER_TIMEOUT = 20.0
106106

107107

108-
def get_indexer(fn, **kw):
108+
def get_doc(fn, revid, retry=False, **kwargs):
109109
"""
110-
Return a valid indexer or raise a KeyError.
110+
Return a valid document or raise a KeyError.
111111
112112
Under heavy loads, the Whoosh AsyncWriter writer may be delayed in writing
113113
indexes to storage. Try several times before failing.
114114
115-
FIXME: runs into timeout for a non-existing revid
116-
117115
:param fn: the indexer function
118-
:param **kw: "revid" is required, index name optional
116+
:param revid: revision to search
117+
:param retry: retry backend search if document not found, required when server load is high
118+
:param kwargs: idx_name, name of index used for searching (optional)
119119
"""
120120
until = time.time() + INDEXER_TIMEOUT
121121
while True:
122-
indexer = fn(**kw)
123-
if indexer is not None:
122+
doc = fn(revid=revid, **kwargs)
123+
if doc is not None:
124124
break
125-
time.sleep(2)
125+
if not retry:
126+
msg = f"revid: {revid} not found. Please check meta data and indexes"
127+
raise KeyError(msg)
126128
if time.time() > until:
127-
raise KeyError(kw.get("revid", "") + " - server overload or corrupt index")
128-
return indexer
129+
msg = f"revid: {revid} - Server overload may have corrupted the index; rebuild it."
130+
raise KeyError(msg)
131+
time.sleep(2)
132+
return doc
129133

130134

131135
def parent_names(names):
@@ -1357,9 +1361,9 @@ def store_revision(
13571361
self.indexer.index_revision(meta, content, backend_name, force_latest=not overwrite)
13581362
gc.collect() # triggers close of index files from is_latest search
13591363
if not overwrite:
1360-
self._current = get_indexer(self.indexer._document, revid=revid)
1364+
self._current = get_doc(self.indexer._document, revid=revid, retry=True)
13611365
if return_rev:
1362-
return Revision(self, revid)
1366+
return Revision(self, revid, retry=True)
13631367

13641368
def store_all_revisions(self, meta, data):
13651369
"""
@@ -1404,13 +1408,13 @@ class Revision(PropertiesMixin):
14041408
An existing revision (exists in the backend).
14051409
"""
14061410

1407-
def __init__(self, item: Item, revid: str, doc=None, name=None):
1411+
def __init__(self, item: Item, revid: str, doc=None, name=None, retry=False):
14081412
is_current = revid == CURRENT
14091413
if doc is None:
14101414
if is_current:
14111415
doc = item._current
14121416
else:
1413-
doc = get_indexer(item.indexer._document, idx_name=ALL_REVS, revid=revid)
1417+
doc = get_doc(item.indexer._document, idx_name=ALL_REVS, revid=revid, retry=retry)
14141418

14151419
if is_current:
14161420
revid = doc.get(REVID)

0 commit comments

Comments
 (0)