From 9ff044833589e4c69869d4747918d0cb59a7187b Mon Sep 17 00:00:00 2001 From: Xiaohu Li Date: Fri, 10 Nov 2017 15:19:13 -0800 Subject: [PATCH] try to fix synchronized block --- .../fielddata/IndexFieldDataService.java | 30 +++++++++---------- .../plain/DocValuesIndexFieldData.java | 2 -- .../SortedSetDVOrdinalsIndexFieldData.java | 3 ++ 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java b/core/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java index 8194b888615e7..b183efb4afac6 100644 --- a/core/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java +++ b/core/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java @@ -19,6 +19,7 @@ package org.elasticsearch.index.fielddata; +import java.util.concurrent.ConcurrentHashMap; import org.apache.lucene.util.Accountable; import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.common.settings.Setting; @@ -55,8 +56,7 @@ public class IndexFieldDataService extends AbstractIndexComponent implements Clo private final CircuitBreakerService circuitBreakerService; private final IndicesFieldDataCache indicesFieldDataCache; - // the below map needs to be modified under a lock - private final Map fieldDataCaches = new HashMap<>(); + private final Map fieldDataCaches = new ConcurrentHashMap<>(); private final MapperService mapperService; private static final IndexFieldDataCache.Listener DEFAULT_NOOP_LISTENER = new IndexFieldDataCache.Listener() { @Override @@ -78,7 +78,7 @@ public IndexFieldDataService(IndexSettings indexSettings, IndicesFieldDataCache this.mapperService = mapperService; } - public synchronized void clear() { + public void clear() { List exceptions = new ArrayList<>(0); final Collection fieldDataCacheValues = fieldDataCaches.values(); for (IndexFieldDataCache cache : fieldDataCacheValues) { @@ -92,7 +92,7 @@ public synchronized void clear() { ExceptionsHelper.maybeThrowRuntimeAndSuppress(exceptions); } - public synchronized void clearField(final String fieldName) { + public void clearField(final String fieldName) { List exceptions = new ArrayList<>(0); final IndexFieldDataCache cache = fieldDataCaches.remove(fieldName); if (cache != null) { @@ -115,19 +115,17 @@ public > IFD getForField(MappedFieldType fieldType IndexFieldData.Builder builder = fieldType.fielddataBuilder(fullyQualifiedIndexName); IndexFieldDataCache cache; - synchronized (this) { - cache = fieldDataCaches.get(fieldName); - if (cache == null) { - String cacheType = indexSettings.getValue(INDEX_FIELDDATA_CACHE_KEY); - if (FIELDDATA_CACHE_VALUE_NODE.equals(cacheType)) { - cache = indicesFieldDataCache.buildIndexFieldDataCache(listener, index(), fieldName); - } else if ("none".equals(cacheType)){ - cache = new IndexFieldDataCache.None(); - } else { - throw new IllegalArgumentException("cache type not supported [" + cacheType + "] for field [" + fieldName + "]"); - } - fieldDataCaches.put(fieldName, cache); + cache = fieldDataCaches.get(fieldName); + if (cache == null) { + String cacheType = indexSettings.getValue(INDEX_FIELDDATA_CACHE_KEY); + if (FIELDDATA_CACHE_VALUE_NODE.equals(cacheType)) { + cache = indicesFieldDataCache.buildIndexFieldDataCache(listener, index(), fieldName); + } else if ("none".equals(cacheType)){ + cache = new IndexFieldDataCache.None(); + } else { + throw new IllegalArgumentException("cache type not supported [" + cacheType + "] for field [" + fieldName + "]"); } + fieldDataCaches.put(fieldName, cache); } return (IFD) builder.build(indexSettings, fieldType, cache, circuitBreakerService, mapperService); diff --git a/core/src/main/java/org/elasticsearch/index/fielddata/plain/DocValuesIndexFieldData.java b/core/src/main/java/org/elasticsearch/index/fielddata/plain/DocValuesIndexFieldData.java index 4a066328bc2a9..698b289d758be 100644 --- a/core/src/main/java/org/elasticsearch/index/fielddata/plain/DocValuesIndexFieldData.java +++ b/core/src/main/java/org/elasticsearch/index/fielddata/plain/DocValuesIndexFieldData.java @@ -46,13 +46,11 @@ public abstract class DocValuesIndexFieldData { protected final Index index; protected final String fieldName; - protected final Logger logger; public DocValuesIndexFieldData(Index index, String fieldName) { super(); this.index = index; this.fieldName = fieldName; - this.logger = Loggers.getLogger(getClass()); } public final String getFieldName() { diff --git a/core/src/main/java/org/elasticsearch/index/fielddata/plain/SortedSetDVOrdinalsIndexFieldData.java b/core/src/main/java/org/elasticsearch/index/fielddata/plain/SortedSetDVOrdinalsIndexFieldData.java index 0834d2479f072..4b3643dda059a 100644 --- a/core/src/main/java/org/elasticsearch/index/fielddata/plain/SortedSetDVOrdinalsIndexFieldData.java +++ b/core/src/main/java/org/elasticsearch/index/fielddata/plain/SortedSetDVOrdinalsIndexFieldData.java @@ -19,6 +19,7 @@ package org.elasticsearch.index.fielddata.plain; +import org.apache.logging.log4j.Logger; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.OrdinalMap; @@ -28,6 +29,7 @@ import org.apache.lucene.search.SortedSetSortField; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.common.Nullable; +import org.elasticsearch.common.logging.Loggers; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.fielddata.AtomicOrdinalsFieldData; import org.elasticsearch.index.fielddata.IndexFieldData.XFieldComparatorSource.Nested; @@ -48,6 +50,7 @@ public class SortedSetDVOrdinalsIndexFieldData extends DocValuesIndexFieldData i private final IndexFieldDataCache cache; private final CircuitBreakerService breakerService; private final Function> scriptFunction; + private static final Logger logger = Loggers.getLogger(SortedSetDVOrdinalsIndexFieldData.class); public SortedSetDVOrdinalsIndexFieldData(IndexSettings indexSettings, IndexFieldDataCache cache, String fieldName, CircuitBreakerService breakerService, Function> scriptFunction) {