|
105 | 105 | INDEXER_TIMEOUT = 20.0
|
106 | 106 |
|
107 | 107 |
|
108 |
| -def get_document(indexer: IndexingMiddleware, revid: str, retry: bool = False, **kwargs): |
109 |
| - """ |
110 |
| - Return a valid indexer document 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 |
| - :param indexer: instance of IndexingMiddleware |
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) |
119 |
| - """ |
120 |
| - until = time.monotonic() + INDEXER_TIMEOUT |
121 |
| - while True: |
122 |
| - doc = indexer._document(revid=revid, **kwargs) |
123 |
| - if doc is not None: |
124 |
| - break |
125 |
| - if not retry: |
126 |
| - msg = f"revid: {revid} not found. Please check meta data and indexes" |
127 |
| - raise KeyError(msg) |
128 |
| - if time.monotonic() > until: |
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 |
133 |
| - |
134 |
| - |
135 | 108 | def parent_names(names):
|
136 | 109 | """
|
137 | 110 | Compute list of parent names (same order as in names, but no dupes)
|
@@ -1049,6 +1022,31 @@ def existing_item(self, **query):
|
1049 | 1022 | """
|
1050 | 1023 | return Item.existing(self, **query)
|
1051 | 1024 |
|
| 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 | + |
1052 | 1050 |
|
1053 | 1051 | class PropertiesMixin:
|
1054 | 1052 | """
|
@@ -1361,7 +1359,7 @@ def store_revision(
|
1361 | 1359 | self.indexer.index_revision(meta, content, backend_name, force_latest=not overwrite)
|
1362 | 1360 | gc.collect() # triggers close of index files from is_latest search
|
1363 | 1361 | if not overwrite:
|
1364 |
| - self._current = get_document(self.indexer, revid=revid, retry=True) |
| 1362 | + self._current = self.indexer.get_document(revid=revid, retry=True) |
1365 | 1363 | if return_rev:
|
1366 | 1364 | return Revision(self, revid, retry=True)
|
1367 | 1365 |
|
@@ -1414,7 +1412,7 @@ def __init__(self, item: Item, revid: str, doc=None, name=None, retry=False):
|
1414 | 1412 | if is_current:
|
1415 | 1413 | doc = item._current
|
1416 | 1414 | else:
|
1417 |
| - doc = get_document(item.indexer, idx_name=ALL_REVS, revid=revid, retry=retry) |
| 1415 | + doc = item.indexer.get_document(idx_name=ALL_REVS, revid=revid, retry=retry) |
1418 | 1416 |
|
1419 | 1417 | if is_current:
|
1420 | 1418 | revid = doc.get(REVID)
|
|
0 commit comments