diff --git a/src/main/java/org/elasticsearch/index/fielddata/FieldDataStats.java b/src/main/java/org/elasticsearch/index/fielddata/FieldDataStats.java new file mode 100644 index 00000000000..2ef0b3ce7b0 --- /dev/null +++ b/src/main/java/org/elasticsearch/index/fielddata/FieldDataStats.java @@ -0,0 +1,82 @@ +/* + * Licensed to ElasticSearch and Shay Banon under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. ElasticSearch licenses this + * file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.index.fielddata; + +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.io.stream.Streamable; +import org.elasticsearch.common.unit.ByteSizeValue; +import org.elasticsearch.common.xcontent.ToXContent; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentBuilderString; + +import java.io.IOException; + +/** + */ +public class FieldDataStats implements Streamable, ToXContent { + + long memorySize; + + public FieldDataStats() { + + } + + public FieldDataStats(long memorySize) { + this.memorySize = memorySize; + } + + public void add(FieldDataStats stats) { + this.memorySize += stats.memorySize; + } + + public long getMemorySizeInBytes() { + return this.memorySize; + } + + public ByteSizeValue getMemorySize() { + return new ByteSizeValue(memorySize); + } + + @Override + public void readFrom(StreamInput in) throws IOException { + memorySize = in.readVLong(); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + out.writeVLong(memorySize); + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(Fields.FIELD_DATA); + builder.field(Fields.MEMORY_SIZE, memorySize); + builder.field(Fields.MEMORY_SIZE_IN_BYTES, getMemorySize().toString()); + builder.endObject(); + return builder; + } + + static final class Fields { + static final XContentBuilderString FIELD_DATA = new XContentBuilderString("field_data"); + static final XContentBuilderString MEMORY_SIZE = new XContentBuilderString("memory_size"); + static final XContentBuilderString MEMORY_SIZE_IN_BYTES = new XContentBuilderString("memory_size_in_bytes"); + } +} diff --git a/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataCache.java b/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataCache.java index 3feb5a19f87..57d7643170d 100644 --- a/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataCache.java +++ b/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataCache.java @@ -59,6 +59,9 @@ public interface IndexFieldDataCache { return (FD) cache.get(context.reader().getCoreCacheKey(), new Callable() { @Override public AtomicFieldData call() throws Exception { + if (context.reader() instanceof SegmentReader) { + ((SegmentReader) context.reader()).addCoreClosedListener(FieldBased.this); + } return indexFieldData.loadDirect(context); } }); diff --git a/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java b/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java index b97a0f3ca02..a60db479ec3 100644 --- a/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java +++ b/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java @@ -96,6 +96,11 @@ public class IndexFieldDataService extends AbstractIndexComponent { } } + public FieldDataStats stats() { + // TODO: compute the memory size here... + return new FieldDataStats(); + } + public IFD getForField(FieldMapper mapper) { return getForField(mapper.names(), mapper.fieldDataType2()); }