@Override public CacheHelper getReaderCacheHelper() { return in.getReaderCacheHelper(); } }
@Override public CacheHelper getReaderCacheHelper() { return in.getReaderCacheHelper(); }
private SoftDeletesDirectoryReaderWrapper(DirectoryReader in, SoftDeletesSubReaderWrapper wrapper) throws IOException { super(in, wrapper); this.field = wrapper.field; readerCacheHelper = in.getReaderCacheHelper() == null ? null : new DelegatingCacheHelper(in.getReaderCacheHelper()); }
@Override public CacheHelper getReaderCacheHelper() { // safe to delegate since this reader does not alter the index return in.getReaderCacheHelper(); }
@Override public CacheHelper getReaderCacheHelper() { return in.getReaderCacheHelper(); }
/** * Invalidates the given the cache entry for the given key and it's context * @param cacheEntity the cache entity to invalidate for * @param reader the reader to invalidate the cache entry for * @param cacheKey the cache key to invalidate */ void invalidate(CacheEntity cacheEntity, DirectoryReader reader, BytesReference cacheKey) { assert reader.getReaderCacheHelper() != null; cache.invalidate(new Key(cacheEntity, reader.getReaderCacheHelper().getKey(), cacheKey)); }
BytesReference getOrCompute(CacheEntity cacheEntity, Supplier<BytesReference> loader, DirectoryReader reader, BytesReference cacheKey) throws Exception { assert reader.getReaderCacheHelper() != null; final Key key = new Key(cacheEntity, reader.getReaderCacheHelper().getKey(), cacheKey); Loader cacheLoader = new Loader(cacheEntity, loader); BytesReference value = cache.computeIfAbsent(key, cacheLoader); if (cacheLoader.isLoaded()) { key.entity.onMiss(); // see if its the first time we see this reader, and make sure to register a cleanup key CleanupKey cleanupKey = new CleanupKey(cacheEntity, reader.getReaderCacheHelper().getKey()); if (!registeredClosedListeners.containsKey(cleanupKey)) { Boolean previous = registeredClosedListeners.putIfAbsent(cleanupKey, Boolean.TRUE); if (previous == null) { ElasticsearchDirectoryReader.addReaderCloseListener(reader, cleanupKey); } } } else { key.entity.onHit(); } return value; }
/** * Adds the given listener to the provided directory reader. The reader * must contain an {@link ElasticsearchDirectoryReader} in it's hierarchy * otherwise we can't safely install the listener. * * @throws IllegalArgumentException if the reader doesn't contain an * {@link ElasticsearchDirectoryReader} in it's hierarchy */ @SuppressForbidden(reason = "This is the only sane way to add a ReaderClosedListener") public static void addReaderCloseListener(DirectoryReader reader, IndexReader.ClosedListener listener) { ElasticsearchDirectoryReader elasticsearchDirectoryReader = getElasticsearchDirectoryReader(reader); if (elasticsearchDirectoryReader == null) { throw new IllegalArgumentException( "Can't install close listener reader is not an ElasticsearchDirectoryReader/ElasticsearchLeafReader"); } IndexReader.CacheHelper cacheHelper = elasticsearchDirectoryReader.getReaderCacheHelper(); if (cacheHelper == null) { throw new IllegalArgumentException("Reader " + elasticsearchDirectoryReader + " does not support caching"); } assert cacheHelper.getKey() == reader.getReaderCacheHelper().getKey(); cacheHelper.addClosedListener(listener); }
@Override public <FD extends AtomicFieldData, IFD extends IndexFieldData.Global<FD>> IFD load(final DirectoryReader indexReader, final IFD indexFieldData) throws Exception { final ShardId shardId = ShardUtils.extractShardId(indexReader); final IndexReader.CacheHelper cacheHelper = indexReader.getReaderCacheHelper(); if (cacheHelper == null) { throw new IllegalArgumentException("Reader " + indexReader + " does not support caching"); } final Key key = new Key(this, cacheHelper.getKey(), shardId); //noinspection unchecked final Accountable accountable = cache.computeIfAbsent(key, k -> { ElasticsearchDirectoryReader.addReaderCloseListener(indexReader, IndexFieldCache.this); Collections.addAll(k.listeners, this.listeners); final Accountable ifd = (Accountable) indexFieldData.localGlobalDirect(indexReader); for (Listener listener : k.listeners) { try { listener.onCache(shardId, fieldName, ifd); } catch (Exception e) { // load anyway since listeners should not throw exceptions logger.error("Failed to call listener on global ordinals loading", e); } } return ifd; }); return (IFD) accountable; }
@Override public CacheHelper getReaderCacheHelper() { // safe to delegate since this reader does not alter the index return in.getReaderCacheHelper(); }
@Override public CacheHelper getReaderCacheHelper() { return in.getReaderCacheHelper(); } }
@Override public CacheHelper getReaderCacheHelper() { // safe to delegate since this reader does not alter the index return in.getReaderCacheHelper(); }
@Override public CacheHelper getReaderCacheHelper() { return in.getReaderCacheHelper(); } }
@Override public CacheHelper getReaderCacheHelper() { return in.getReaderCacheHelper(); }
@Override public CacheHelper getReaderCacheHelper() { return in.getReaderCacheHelper(); }
@Override public CacheHelper getReaderCacheHelper() { return in.getReaderCacheHelper(); }
DirectoryReader reader = wrap(nonClosingReaderWrapper); if (reader != nonClosingReaderWrapper) { if (reader.getReaderCacheHelper() != elasticsearchDirectoryReader.getReaderCacheHelper()) { throw new IllegalStateException("wrapped directory reader doesn't delegate IndexReader#getCoreCacheKey," + " wrappers must override this method and delegate to the original readers core cache key. Wrapped readers can't be " +
private SoftDeletesDirectoryReaderWrapper(DirectoryReader in, SoftDeletesSubReaderWrapper wrapper) throws IOException { super(in, wrapper); this.field = wrapper.field; readerCacheHelper = in.getReaderCacheHelper() == null ? null : new DelegatingCacheHelper(in.getReaderCacheHelper()); }
/** * Invalidates the given the cache entry for the given key and it's context * @param cacheEntity the cache entity to invalidate for * @param reader the reader to invalidate the cache entry for * @param cacheKey the cache key to invalidate */ void invalidate(CacheEntity cacheEntity, DirectoryReader reader, BytesReference cacheKey) { assert reader.getReaderCacheHelper() != null; cache.invalidate(new Key(cacheEntity, reader.getReaderCacheHelper().getKey(), cacheKey)); }
BytesReference getOrCompute(CacheEntity cacheEntity, Supplier<BytesReference> loader, DirectoryReader reader, BytesReference cacheKey) throws Exception { assert reader.getReaderCacheHelper() != null; final Key key = new Key(cacheEntity, reader.getReaderCacheHelper().getKey(), cacheKey); Loader cacheLoader = new Loader(cacheEntity, loader); BytesReference value = cache.computeIfAbsent(key, cacheLoader); if (cacheLoader.isLoaded()) { key.entity.onMiss(); // see if its the first time we see this reader, and make sure to register a cleanup key CleanupKey cleanupKey = new CleanupKey(cacheEntity, reader.getReaderCacheHelper().getKey()); if (!registeredClosedListeners.containsKey(cleanupKey)) { Boolean previous = registeredClosedListeners.putIfAbsent(cleanupKey, Boolean.TRUE); if (previous == null) { ElasticsearchDirectoryReader.addReaderCloseListener(reader, cleanupKey); } } } else { key.entity.onHit(); } return value; }