NPE in ShardStats when routing entry is not set yet on IndexShard
closes #7356
This commit is contained in:
parent
abdbfe768b
commit
2f3a041070
|
@ -117,12 +117,11 @@ public class TransportClusterStatsAction extends TransportNodesOperationAction<C
|
||||||
List<ShardStats> shardsStats = new ArrayList<>();
|
List<ShardStats> shardsStats = new ArrayList<>();
|
||||||
for (IndexService indexService : indicesService.indices().values()) {
|
for (IndexService indexService : indicesService.indices().values()) {
|
||||||
for (IndexShard indexShard : indexService) {
|
for (IndexShard indexShard : indexService) {
|
||||||
if (indexShard.routingEntry().active()) {
|
if (indexShard.routingEntry() != null && indexShard.routingEntry().active()) {
|
||||||
// only report on fully started shards
|
// only report on fully started shards
|
||||||
shardsStats.add(new ShardStats(indexShard, SHARD_STATS_FLAGS));
|
shardsStats.add(new ShardStats(indexShard, indexShard.routingEntry(), SHARD_STATS_FLAGS));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ClusterHealthStatus clusterStatus = null;
|
ClusterHealthStatus clusterStatus = null;
|
||||||
|
|
|
@ -43,9 +43,9 @@ public class ShardStats extends BroadcastShardOperationResponse implements ToXCo
|
||||||
ShardStats() {
|
ShardStats() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ShardStats(IndexShard indexShard, CommonStatsFlags flags) {
|
public ShardStats(IndexShard indexShard, ShardRouting shardRouting, CommonStatsFlags flags) {
|
||||||
super(indexShard.routingEntry().shardId());
|
super(indexShard.shardId());
|
||||||
this.shardRouting = indexShard.routingEntry();
|
this.shardRouting = shardRouting;
|
||||||
this.stats = new CommonStats(indexShard, flags);
|
this.stats = new CommonStats(indexShard, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ import org.elasticsearch.common.inject.Inject;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.index.IndexShardMissingException;
|
||||||
import org.elasticsearch.index.service.InternalIndexService;
|
import org.elasticsearch.index.service.InternalIndexService;
|
||||||
import org.elasticsearch.index.shard.ShardId;
|
import org.elasticsearch.index.shard.ShardId;
|
||||||
import org.elasticsearch.index.shard.service.InternalIndexShard;
|
import org.elasticsearch.index.shard.service.InternalIndexShard;
|
||||||
|
@ -135,6 +136,10 @@ public class TransportIndicesStatsAction extends TransportBroadcastOperationActi
|
||||||
protected ShardStats shardOperation(IndexShardStatsRequest request) throws ElasticsearchException {
|
protected ShardStats shardOperation(IndexShardStatsRequest request) throws ElasticsearchException {
|
||||||
InternalIndexService indexService = (InternalIndexService) indicesService.indexServiceSafe(request.shardId().getIndex());
|
InternalIndexService indexService = (InternalIndexService) indicesService.indexServiceSafe(request.shardId().getIndex());
|
||||||
InternalIndexShard indexShard = (InternalIndexShard) indexService.shardSafe(request.shardId().id());
|
InternalIndexShard indexShard = (InternalIndexShard) indexService.shardSafe(request.shardId().id());
|
||||||
|
// if we don't have the routing entry yet, we need it stats wise, we treat it as if the shard is not ready yet
|
||||||
|
if (indexShard.routingEntry() == null) {
|
||||||
|
throw new IndexShardMissingException(indexShard.shardId());
|
||||||
|
}
|
||||||
|
|
||||||
CommonStatsFlags flags = new CommonStatsFlags().clear();
|
CommonStatsFlags flags = new CommonStatsFlags().clear();
|
||||||
|
|
||||||
|
@ -197,7 +202,7 @@ public class TransportIndicesStatsAction extends TransportBroadcastOperationActi
|
||||||
flags.set(CommonStatsFlags.Flag.QueryCache);
|
flags.set(CommonStatsFlags.Flag.QueryCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ShardStats(indexShard, flags);
|
return new ShardStats(indexShard, indexShard.routingEntry(), flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static class IndexShardStatsRequest extends BroadcastShardOperationRequest {
|
static class IndexShardStatsRequest extends BroadcastShardOperationRequest {
|
||||||
|
|
|
@ -82,6 +82,11 @@ public interface IndexShard extends IndexShardComponent {
|
||||||
|
|
||||||
ShardFieldData fieldData();
|
ShardFieldData fieldData();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the latest cluster routing entry received with this shard. Might be null if the
|
||||||
|
* shard was just created.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
ShardRouting routingEntry();
|
ShardRouting routingEntry();
|
||||||
|
|
||||||
DocsStats docStats();
|
DocsStats docStats();
|
||||||
|
|
|
@ -206,7 +206,10 @@ public class InternalIndicesService extends AbstractLifecycleComponent<IndicesSe
|
||||||
for (IndexService indexService : indices.values()) {
|
for (IndexService indexService : indices.values()) {
|
||||||
for (IndexShard indexShard : indexService) {
|
for (IndexShard indexShard : indexService) {
|
||||||
try {
|
try {
|
||||||
IndexShardStats indexShardStats = new IndexShardStats(indexShard.shardId(), new ShardStats[] { new ShardStats(indexShard, flags) });
|
if (indexShard.routingEntry() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
IndexShardStats indexShardStats = new IndexShardStats(indexShard.shardId(), new ShardStats[] { new ShardStats(indexShard, indexShard.routingEntry(), flags) });
|
||||||
if (!statsByShard.containsKey(indexService.index())) {
|
if (!statsByShard.containsKey(indexService.index())) {
|
||||||
statsByShard.put(indexService.index(), Lists.<IndexShardStats>newArrayList(indexShardStats));
|
statsByShard.put(indexService.index(), Lists.<IndexShardStats>newArrayList(indexShardStats));
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue