synchronize docIdToDoc list

When we parallelized the initialization we forgot to
synchronize the docIdToDoc list.
Luckily there is a high probability, that queries return
results, that are obviously wrong.
This commit is contained in:
ahr
2017-12-23 10:06:45 +01:00
parent 888d25f7ea
commit 8037212145

View File

@@ -45,6 +45,7 @@ public class DataStore {
private static final Pattern EXTRACT_TAGS_PATTERN = Pattern.compile(REGEX_STORAGE_FILE);
// to be guarded by itself
private final List<Doc> docIdToDoc = new ArrayList<>();
private final Map<String, Map<String, IntList>> keyToValueToDocId = new ConcurrentHashMap<>();
@@ -70,13 +71,18 @@ public class DataStore {
});
trimIntLists();
synchronized (docIdToDoc) {
((ArrayList<Doc>)docIdToDoc).trimToSize();
}
}
private void cacheTagToFileMapping(final Tags tags, final Path path) {
final int docId = docIdToDoc.size();
final int docId;
synchronized (docIdToDoc) {
docId = docIdToDoc.size();
docIdToDoc.add(new Doc(tags, path));
}
for (final String key : tags.getKeys()) {
final Map<String, IntList> valueToDocIds = keyToValueToDocId.computeIfAbsent(key, k -> new ConcurrentHashMap<>());
@@ -231,24 +237,36 @@ public class DataStore {
private IntList executeQuery(final String query) {
final long start = System.nanoTime();
synchronized (docIdToDoc) {
final Expression expression = QueryLanguageParser.parse(query);
final ExpressionToDocIdVisitor visitor = new ExpressionToDocIdVisitor(keyToValueToDocId,
new AllDocIds(docIdToDoc));
final ExpressionToDocIdVisitor visitor = new ExpressionToDocIdVisitor(
keyToValueToDocId, new AllDocIds(docIdToDoc));
final IntList docIdsList = expression.visit(visitor);
EXECUTE_QUERY_LOGGER.debug("executeQuery({}) took {}ms returned {} results " , query, (System.nanoTime() - start) / 1_000_000.0, docIdsList.size());
EXECUTE_QUERY_LOGGER.debug(
"executeQuery({}) took {}ms returned {} results ", query,
(System.nanoTime() - start) / 1_000_000.0,
docIdsList.size());
return docIdsList;
}
}
private List<Doc> mapDocIdsToDocs(final IntList docIdsList) {
final List<Doc> result = new ArrayList<>(docIdsList.size());
synchronized (docIdToDoc) {
final int[] intDocIds = docIdsList.toArray();
for (int i = 0; i < intDocIds.length; i++) {
final int docId = intDocIds[i];
final Doc doc = docIdToDoc.get(docId);
if (!doc.getTags().getValue("pod").equals("vadtrans01")){
System.out.println();
}
result.add(doc);
}
}
return result;
}
}