Merge branch 'stable-2.16' into stable-3.0

* stable-2.16:
  Error Prone: Fix DefaultCharset in ListProjectsIT
  Bazel: Enable Error-Prone by default
  Parallelize account migration in schema 146 migration
  Fix _nextStepHandle not being assigned a value when scrolling
  Elasticsearch: Remove redundant handling of 'ignore_unmapped' property
  Elasticsearch: Fix support for V6 versions earlier than 6.7.*
  Clarify introduction to external IDs
  ExternalIdNotes: Improve grammar in checkState messages
  Update git submodules
  Add example of external ID key in external ID documentation
  Minor grammatical fixes in external ID documentation
  ElasticVersionTest: Add missing assertions on V6_7

Also update the replication plugin revision to include the fix:

  HttpResponse: Specify charset in constructor of InputStreamReader

which is needed due to enabling error prone checks on core plugins.

Change-Id: I90394f5c0d6aaf88b1169c26ceb65b699fddfe77
diff --git a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
index 41cec1e..e215759 100644
--- a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
+++ b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
@@ -305,7 +305,6 @@
   protected JsonArray getSortArray(String idFieldName) {
     JsonObject properties = new JsonObject();
     properties.addProperty(ORDER, "asc");
-    client.adapter().setIgnoreUnmapped(properties);
 
     JsonArray sortArray = new JsonArray();
     addNamedElement(idFieldName, properties, sortArray);
diff --git a/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java b/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
index 0a64abd..c5fb77c 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
@@ -164,7 +164,6 @@
   private JsonArray getSortArray() {
     JsonObject properties = new JsonObject();
     properties.addProperty(ORDER, "desc");
-    client.adapter().setIgnoreUnmapped(properties);
 
     JsonArray sortArray = new JsonArray();
     addNamedElement(ChangeField.UPDATED.getName(), properties, sortArray);
diff --git a/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java b/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
index e34644e..b015678 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.elasticsearch;
 
+import static com.google.gerrit.elasticsearch.ElasticVersion.V6_7;
+
 import com.google.gson.JsonObject;
 
 public class ElasticQueryAdapter {
@@ -22,7 +24,6 @@
   private static final String INCLUDE_TYPE = "include_type_name=true";
   private static final String INDICES = "?allow_no_indices=false";
 
-  private final boolean ignoreUnmapped;
   private final boolean useV5Type;
   private final boolean useV6Type;
   private final boolean omitType;
@@ -37,24 +38,18 @@
   private final String includeTypeNameParam;
 
   ElasticQueryAdapter(ElasticVersion version) {
-    this.ignoreUnmapped = false;
     this.useV5Type = !version.isV6OrLater();
     this.useV6Type = version.isV6();
     this.omitType = version.isV7OrLater();
     this.versionDiscoveryUrl = version.isV6OrLater() ? "/%s*" : "/%s*/_aliases";
     this.searchFilteringName = "_source";
-    this.indicesExistParams = version.isV6() ? INDICES + "&" + INCLUDE_TYPE : INDICES;
+    this.indicesExistParams =
+        version.isAtLeastMinorVersion(V6_7) ? INDICES + "&" + INCLUDE_TYPE : INDICES;
     this.exactFieldType = "keyword";
     this.stringFieldType = "text";
     this.indexProperty = "true";
     this.rawFieldsKey = "_source";
-    this.includeTypeNameParam = version.isV6() ? "?" + INCLUDE_TYPE : "";
-  }
-
-  void setIgnoreUnmapped(JsonObject properties) {
-    if (ignoreUnmapped) {
-      properties.addProperty("ignore_unmapped", true);
-    }
+    this.includeTypeNameParam = version.isAtLeastMinorVersion(V6_7) ? "?" + INCLUDE_TYPE : "";
   }
 
   public void setType(JsonObject properties, String type) {
diff --git a/java/com/google/gerrit/elasticsearch/ElasticVersion.java b/java/com/google/gerrit/elasticsearch/ElasticVersion.java
index 98e1f7d..6be41c8 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticVersion.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticVersion.java
@@ -71,14 +71,22 @@
     return isAtLeastVersion(7);
   }
 
-  private boolean isAtLeastVersion(int v) {
-    return getMajor() >= v;
+  private boolean isAtLeastVersion(int major) {
+    return getMajor() >= major;
+  }
+
+  public boolean isAtLeastMinorVersion(ElasticVersion version) {
+    return getMajor().equals(version.getMajor()) && getMinor() >= version.getMinor();
   }
 
   private Integer getMajor() {
     return Integer.valueOf(version.split("\\.")[0]);
   }
 
+  private Integer getMinor() {
+    return Integer.valueOf(version.split("\\.")[1]);
+  }
+
   @Override
   public String toString() {
     return version;
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticVersionTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticVersionTest.java
index 61ad068..c06941c 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticVersionTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticVersionTest.java
@@ -63,10 +63,23 @@
     assertThat(ElasticVersion.V6_4.isV6OrLater()).isTrue();
     assertThat(ElasticVersion.V6_5.isV6OrLater()).isTrue();
     assertThat(ElasticVersion.V6_6.isV6OrLater()).isTrue();
+    assertThat(ElasticVersion.V6_7.isV6OrLater()).isTrue();
     assertThat(ElasticVersion.V7_0.isV6OrLater()).isTrue();
   }
 
   @Test
+  public void atLeastMinorVersion() throws Exception {
+    assertThat(ElasticVersion.V5_6.isAtLeastMinorVersion(ElasticVersion.V6_7)).isFalse();
+    assertThat(ElasticVersion.V6_2.isAtLeastMinorVersion(ElasticVersion.V6_7)).isFalse();
+    assertThat(ElasticVersion.V6_3.isAtLeastMinorVersion(ElasticVersion.V6_7)).isFalse();
+    assertThat(ElasticVersion.V6_4.isAtLeastMinorVersion(ElasticVersion.V6_7)).isFalse();
+    assertThat(ElasticVersion.V6_5.isAtLeastMinorVersion(ElasticVersion.V6_7)).isFalse();
+    assertThat(ElasticVersion.V6_6.isAtLeastMinorVersion(ElasticVersion.V6_7)).isFalse();
+    assertThat(ElasticVersion.V6_7.isAtLeastMinorVersion(ElasticVersion.V6_7)).isTrue();
+    assertThat(ElasticVersion.V7_0.isAtLeastMinorVersion(ElasticVersion.V6_7)).isFalse();
+  }
+
+  @Test
   public void version7() throws Exception {
     assertThat(ElasticVersion.V5_6.isV7OrLater()).isFalse();
     assertThat(ElasticVersion.V6_2.isV7OrLater()).isFalse();
@@ -74,6 +87,7 @@
     assertThat(ElasticVersion.V6_4.isV7OrLater()).isFalse();
     assertThat(ElasticVersion.V6_5.isV7OrLater()).isFalse();
     assertThat(ElasticVersion.V6_6.isV7OrLater()).isFalse();
+    assertThat(ElasticVersion.V6_7.isV7OrLater()).isFalse();
     assertThat(ElasticVersion.V7_0.isV7OrLater()).isTrue();
   }
 }