Allow FieldStatsRequest to disable cache
This commit is contained in:
parent
2fc328e10a
commit
8cc848f31c
|
@ -141,7 +141,7 @@ public class SnapshotIndexShardStatus extends BroadcastShardResponse implements
|
|||
|
||||
@Override
|
||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||
builder.startObject(Integer.toString(getShardId()));
|
||||
builder.startObject(Integer.toString(getShardId().getId()));
|
||||
builder.field(Fields.STAGE, getStage());
|
||||
stats.toXContent(builder, params);
|
||||
if (getNodeId() != null) {
|
||||
|
|
|
@ -49,7 +49,7 @@ public class SnapshotIndexStatus implements Iterable<SnapshotIndexShardStatus>,
|
|||
Map<Integer, SnapshotIndexShardStatus> indexShards = new HashMap<>();
|
||||
stats = new SnapshotStats();
|
||||
for (SnapshotIndexShardStatus shard : shards) {
|
||||
indexShards.put(shard.getShardId(), shard);
|
||||
indexShards.put(shard.getShardId().getId(), shard);
|
||||
stats.add(shard.getStats());
|
||||
}
|
||||
shardsStats = new SnapshotShardsStats(shards);
|
||||
|
|
|
@ -44,6 +44,7 @@ public class FieldStatsRequest extends BroadcastRequest<FieldStatsRequest> {
|
|||
private String[] fields = Strings.EMPTY_ARRAY;
|
||||
private String level = DEFAULT_LEVEL;
|
||||
private IndexConstraint[] indexConstraints = new IndexConstraint[0];
|
||||
private boolean useCache = true;
|
||||
|
||||
public String[] getFields() {
|
||||
return fields;
|
||||
|
@ -56,6 +57,14 @@ public class FieldStatsRequest extends BroadcastRequest<FieldStatsRequest> {
|
|||
this.fields = fields;
|
||||
}
|
||||
|
||||
public void setUseCache(boolean useCache) {
|
||||
this.useCache = useCache;
|
||||
}
|
||||
|
||||
public boolean shouldUseCache() {
|
||||
return useCache;
|
||||
}
|
||||
|
||||
public IndexConstraint[] getIndexConstraints() {
|
||||
return indexConstraints;
|
||||
}
|
||||
|
@ -184,6 +193,7 @@ public class FieldStatsRequest extends BroadcastRequest<FieldStatsRequest> {
|
|||
indexConstraints[i] = new IndexConstraint(in);
|
||||
}
|
||||
level = in.readString();
|
||||
useCache = in.readBoolean();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -201,6 +211,7 @@ public class FieldStatsRequest extends BroadcastRequest<FieldStatsRequest> {
|
|||
}
|
||||
}
|
||||
out.writeString(level);
|
||||
out.writeBoolean(useCache);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -45,4 +45,9 @@ public class FieldStatsRequestBuilder extends
|
|||
request().level(level);
|
||||
return this;
|
||||
}
|
||||
|
||||
public FieldStatsRequestBuilder setUseCache(boolean useCache) {
|
||||
request().setUseCache(useCache);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ import java.util.Set;
|
|||
public class FieldStatsShardRequest extends BroadcastShardRequest {
|
||||
|
||||
private String[] fields;
|
||||
private boolean useCache;
|
||||
|
||||
public FieldStatsShardRequest() {
|
||||
}
|
||||
|
@ -46,22 +47,29 @@ public class FieldStatsShardRequest extends BroadcastShardRequest {
|
|||
fields.add(indexConstraint.getField());
|
||||
}
|
||||
this.fields = fields.toArray(new String[fields.size()]);
|
||||
useCache = request.shouldUseCache();
|
||||
}
|
||||
|
||||
public String[] getFields() {
|
||||
return fields;
|
||||
}
|
||||
|
||||
public boolean shouldUseCache() {
|
||||
return useCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFrom(StreamInput in) throws IOException {
|
||||
super.readFrom(in);
|
||||
fields = in.readStringArray();
|
||||
useCache = in.readBoolean();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeTo(StreamOutput out) throws IOException {
|
||||
super.writeTo(out);
|
||||
out.writeStringArrayNullable(fields);
|
||||
out.writeBoolean(useCache);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -46,7 +46,6 @@ public class FieldStatsShardResponse extends BroadcastShardResponse {
|
|||
return fieldStats;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void readFrom(StreamInput in) throws IOException {
|
||||
super.readFrom(in);
|
||||
|
|
|
@ -187,16 +187,15 @@ public class TransportFieldStatsAction extends
|
|||
ShardId shardId = request.shardId();
|
||||
Map<String, FieldStats<?>> fieldStats = new HashMap<>();
|
||||
IndexService indexServices = indicesService.indexServiceSafe(shardId.getIndex());
|
||||
MapperService mapperService = indexServices.mapperService();
|
||||
IndexShard shard = indexServices.getShard(shardId.id());
|
||||
try (Engine.Searcher searcher = shard.acquireSearcher("fieldstats")) {
|
||||
// Resolve patterns and deduplicate
|
||||
Set<String> fieldNames = new HashSet<>();
|
||||
for (String field : request.getFields()) {
|
||||
fieldNames.addAll(mapperService.simpleMatchToIndexNames(field));
|
||||
fieldNames.addAll(shard.mapperService().simpleMatchToIndexNames(field));
|
||||
}
|
||||
for (String field : fieldNames) {
|
||||
FieldStats<?> stats = indicesService.getFieldStats(shard, searcher, field);
|
||||
FieldStats<?> stats = indicesService.getFieldStats(shard, searcher, field, request.shouldUseCache());
|
||||
if (stats != null) {
|
||||
fieldStats.put(field, stats);
|
||||
}
|
||||
|
|
|
@ -45,8 +45,8 @@ public abstract class BroadcastShardResponse extends TransportResponse {
|
|||
return this.shardId.getIndexName();
|
||||
}
|
||||
|
||||
public int getShardId() {
|
||||
return this.shardId.id();
|
||||
public ShardId getShardId() {
|
||||
return this.shardId;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1121,12 +1121,16 @@ public class IndicesService extends AbstractLifecycleComponent<IndicesService>
|
|||
* @param shard the shard to use with the cache key
|
||||
* @param searcher searcher to use to lookup the field stats
|
||||
* @param field the actual field
|
||||
* @param useCache should this request use the cache?
|
||||
*/
|
||||
public FieldStats<?> getFieldStats(IndexShard shard, Engine.Searcher searcher, String field) throws Exception {
|
||||
public FieldStats<?> getFieldStats(IndexShard shard, Engine.Searcher searcher, String field, boolean useCache) throws Exception {
|
||||
MappedFieldType fieldType = shard.mapperService().fullName(field);
|
||||
if (fieldType == null) {
|
||||
return null;
|
||||
}
|
||||
if (useCache == false) {
|
||||
return fieldType.stats(searcher.reader());
|
||||
}
|
||||
BytesReference cacheKey = new BytesArray("fieldstats:" + field);
|
||||
BytesReference statsRef = cacheShardLevelResult(shard, searcher.getDirectoryReader(), cacheKey, out -> {
|
||||
out.writeOptionalWriteable(fieldType.stats(searcher.reader()));
|
||||
|
|
|
@ -487,6 +487,11 @@ public class FieldStatsIntegrationIT extends ESIntegTestCase {
|
|||
assertEquals(200, fieldStats.getAllFieldStats().get("value").getDocCount());
|
||||
// Because we refreshed the index we don't have any more hits in the cache. This is read from the index.
|
||||
assertEquals(oldHitCount, indexStats.getHitCount());
|
||||
|
||||
// We can also turn off the cache entirely
|
||||
fieldStats = client().prepareFieldStats().setFields("value").get();
|
||||
assertEquals(200, fieldStats.getAllFieldStats().get("value").getDocCount());
|
||||
assertEquals(oldHitCount, indexStats.getHitCount());
|
||||
}
|
||||
|
||||
private void indexRange(String index, long from, long to) throws Exception {
|
||||
|
|
Loading…
Reference in New Issue