@Override protected UpgradeResponse newResponse( UpgradeRequest request, int totalShards, int successfulShards, int failedShards, List<ShardUpgradeResult> shardUpgradeResults, List<ShardOperationFailedException> shardFailures, ClusterState clusterState) { Map<String, Integer> successfulPrimaryShards = newHashMap(); Map<String, Tuple<Version, org.apache.lucene.util.Version>> versions = newHashMap(); for (ShardUpgradeResult result : shardUpgradeResults) { successfulShards++; String index = result.getShardId().getIndex(); if (result.primary()) { Integer count = successfulPrimaryShards.get(index); successfulPrimaryShards.put(index, count == null ? 1 : count + 1); } Tuple<Version, org.apache.lucene.util.Version> versionTuple = versions.get(index); if (versionTuple == null) { versions.put(index, new Tuple<>(result.upgradeVersion(), result.oldestLuceneSegment())); } else { // We already have versions for this index - let's see if we need to update them based on // the current shard Version version = versionTuple.v1(); org.apache.lucene.util.Version luceneVersion = versionTuple.v2(); // For the metadata we are interested in the _latest_ Elasticsearch version that was // processing the metadata // Since we rewrite the mapping during upgrade the metadata is always rewritten by the // latest version if (result.upgradeVersion().after(versionTuple.v1())) { version = result.upgradeVersion(); } // For the lucene version we are interested in the _oldest_ lucene version since it // determines the // oldest version that we need to support if (result.oldestLuceneSegment().onOrAfter(versionTuple.v2()) == false) { luceneVersion = result.oldestLuceneSegment(); } versions.put(index, new Tuple<>(version, luceneVersion)); } } Map<String, Tuple<org.elasticsearch.Version, String>> updatedVersions = newHashMap(); MetaData metaData = clusterState.metaData(); for (Map.Entry<String, Tuple<Version, org.apache.lucene.util.Version>> versionEntry : versions.entrySet()) { String index = versionEntry.getKey(); Integer primaryCount = successfulPrimaryShards.get(index); int expectedPrimaryCount = metaData.index(index).getNumberOfShards(); if (primaryCount == metaData.index(index).getNumberOfShards()) { updatedVersions.put( index, new Tuple<>(versionEntry.getValue().v1(), versionEntry.getValue().v2().toString())); } else { logger.warn( "Not updating settings for the index [{}] because upgraded of some primary shards failed - expected[{}], received[{}]", index, expectedPrimaryCount, primaryCount == null ? 0 : primaryCount); } } return new UpgradeResponse( updatedVersions, totalShards, successfulShards, failedShards, shardFailures); }
@Override protected ShardUpgradeResult readShardResult(StreamInput in) throws IOException { ShardUpgradeResult result = new ShardUpgradeResult(); result.readFrom(in); return result; }