(index) Prevent index from attempting to answer queries when no index data is loaded
This improves query times, and gets rid of exceptions in the logs when one of the index nodes doesn't have any data loaded, yet is configured to answer queries.
This commit is contained in:
parent
321fa94b8f
commit
aa2df327db
@ -11,7 +11,6 @@ import org.slf4j.LoggerFactory;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
|
|
||||||
import static nu.marginalia.index.forward.ForwardIndexParameters.*;
|
import static nu.marginalia.index.forward.ForwardIndexParameters.*;
|
||||||
|
|
||||||
@ -114,4 +113,8 @@ public class ForwardIndexReader {
|
|||||||
if (data != null)
|
if (data != null)
|
||||||
data.close();
|
data.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isLoaded() {
|
||||||
|
return data != null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@ import com.google.inject.Singleton;
|
|||||||
import nu.marginalia.index.IndexServicesFactory;
|
import nu.marginalia.index.IndexServicesFactory;
|
||||||
import nu.marginalia.index.query.*;
|
import nu.marginalia.index.query.*;
|
||||||
import nu.marginalia.index.query.filter.QueryFilterStepFromPredicate;
|
import nu.marginalia.index.query.filter.QueryFilterStepFromPredicate;
|
||||||
import nu.marginalia.index.svc.IndexSearchSetsService;
|
|
||||||
import nu.marginalia.service.control.ServiceEventLog;
|
import nu.marginalia.service.control.ServiceEventLog;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -96,14 +95,20 @@ public class SearchIndex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Returns true if the service has initialized */
|
||||||
public boolean isAvailable() {
|
public boolean isAvailable() {
|
||||||
return indexReader != null;
|
return indexReader != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Stronger version of isAvailable() that also checks that the index is loaded */
|
||||||
|
public boolean isLoaded() {
|
||||||
|
return indexReader != null && indexReader.isLoaded();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<IndexQuery> createQueries(SearchIndexSearchTerms terms, IndexQueryParams params, LongPredicate includePred) {
|
public List<IndexQuery> createQueries(SearchIndexSearchTerms terms, IndexQueryParams params, LongPredicate includePred) {
|
||||||
|
|
||||||
if (!isAvailable()) {
|
if (!isLoaded()) {
|
||||||
logger.warn("Index reader not ready");
|
logger.warn("Index reader not ready");
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
@ -188,10 +193,10 @@ public class SearchIndex {
|
|||||||
public long[] getTermMetadata(long termId, long[] docs) {
|
public long[] getTermMetadata(long termId, long[] docs) {
|
||||||
return indexReader.getMetadata(termId, docs);
|
return indexReader.getMetadata(termId, docs);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getDocumentMetadata(long docId) {
|
public long getDocumentMetadata(long docId) {
|
||||||
return indexReader.getDocumentMetadata(docId);
|
return indexReader.getDocumentMetadata(docId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getHtmlFeatures(long docId) {
|
public int getHtmlFeatures(long docId) {
|
||||||
return indexReader.getHtmlFeatures(docId);
|
return indexReader.getHtmlFeatures(docId);
|
||||||
}
|
}
|
||||||
@ -199,10 +204,10 @@ public class SearchIndex {
|
|||||||
public int getTotalDocCount() {
|
public int getTotalDocCount() {
|
||||||
return indexReader.totalDocCount();
|
return indexReader.totalDocCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getTermFrequency(long id) {
|
public int getTermFrequency(long id) {
|
||||||
return (int) indexReader.numHits(id);
|
return (int) indexReader.numHits(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getTermFrequencyPrio(long id) {
|
public int getTermFrequencyPrio(long id) {
|
||||||
return (int) indexReader.numHitsPrio(id);
|
return (int) indexReader.numHitsPrio(id);
|
||||||
}
|
}
|
||||||
|
@ -93,4 +93,10 @@ public class SearchIndexReader {
|
|||||||
}
|
}
|
||||||
logger.error("Failed to close index");
|
logger.error("Failed to close index");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns true if index data is available */
|
||||||
|
public boolean isLoaded() {
|
||||||
|
// We only need to check one of the readers, as they are either all loaded or none are
|
||||||
|
return forwardIndexReader.isLoaded();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -265,6 +265,11 @@ public class IndexQueryService extends IndexApiImplBase {
|
|||||||
}
|
}
|
||||||
private SearchResultSet executeSearch(SearchParameters params) throws SQLException {
|
private SearchResultSet executeSearch(SearchParameters params) throws SQLException {
|
||||||
|
|
||||||
|
if (!index.isLoaded()) {
|
||||||
|
// Short-circuit if the index is not loaded, as we trivially know that there can be no results
|
||||||
|
return new SearchResultSet(List.of());
|
||||||
|
}
|
||||||
|
|
||||||
var rankingContext = createRankingContext(params.rankingParams, params.subqueries);
|
var rankingContext = createRankingContext(params.rankingParams, params.subqueries);
|
||||||
|
|
||||||
logger.info(queryMarker, "{}", params.queryParams);
|
logger.info(queryMarker, "{}", params.queryParams);
|
||||||
|
Loading…
Reference in New Issue
Block a user