From d621b160e9b940add546a6234bc2d17381334f33 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Wed, 3 Jun 2015 15:45:07 +0200 Subject: [PATCH] Use the smallest version rather than the default version The minimum version comparison was always using the default version sicne the comparison was flipped. Closes #11474 --- .../elasticsearch/index/shard/IndexShard.java | 11 +++-------- .../index/shard/IndexShardTests.java | 16 ++++++++++++++++ .../upgrade/UpgradeReallyOldIndexTest.java | 17 +++++++++++++++++ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/src/main/java/org/elasticsearch/index/shard/IndexShard.java index dbf1af95ade04..75b322f45a60a 100644 --- a/src/main/java/org/elasticsearch/index/shard/IndexShard.java +++ b/src/main/java/org/elasticsearch/index/shard/IndexShard.java @@ -23,8 +23,6 @@ import com.google.common.base.Preconditions; import org.apache.lucene.codecs.PostingsFormat; import org.apache.lucene.index.CheckIndex; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.join.BitDocIdSetFilter; import org.apache.lucene.store.AlreadyClosedException; import org.apache.lucene.util.IOUtils; import org.apache.lucene.util.ThreadInterruptedException; @@ -41,14 +39,11 @@ import org.elasticsearch.cluster.routing.ShardRoutingState; import org.elasticsearch.common.Booleans; import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.lucene.Lucene; -import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.common.metrics.MeanMetric; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.ByteSizeValue; @@ -720,13 +715,13 @@ public org.apache.lucene.util.Version upgrade(UpgradeRequest upgrade) { } public org.apache.lucene.util.Version minimumCompatibleVersion() { - org.apache.lucene.util.Version luceneVersion = Version.LUCENE_3_EMULATION_VERSION; + org.apache.lucene.util.Version luceneVersion = null; for(Segment segment : engine().segments(false)) { - if (luceneVersion.onOrAfter(segment.getVersion())) { + if (luceneVersion == null || luceneVersion.onOrAfter(segment.getVersion())) { luceneVersion = segment.getVersion(); } } - return luceneVersion; + return luceneVersion == null ? Version.indexCreated(indexSettings).luceneVersion : luceneVersion; } public SnapshotIndexCommit snapshotIndex(boolean flushFirst) throws EngineException { diff --git a/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java b/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java index da7f17ce48d85..3e7fcc79d553b 100644 --- a/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java +++ b/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java @@ -50,6 +50,7 @@ import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS; import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS; import static org.elasticsearch.common.settings.Settings.settingsBuilder; +import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_VERSION_CREATED; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailures; import static org.hamcrest.Matchers.equalTo; @@ -362,4 +363,19 @@ public void testDeleteByQueryBWC() { assertEquals(numDocs, searcher.reader().numDocs()); } } + + public void testMinimumCompatVersion() { + Version versionCreated = VersionUtils.randomVersion(random()); + assertAcked(client().admin().indices().prepareCreate("test") + .setSettings(SETTING_NUMBER_OF_SHARDS, 1, SETTING_NUMBER_OF_REPLICAS, 0, SETTING_VERSION_CREATED, versionCreated.id)); + client().prepareIndex("test", "test").setSource("{}").get(); + ensureGreen("test"); + IndicesService indicesService = getInstanceFromNode(IndicesService.class); + IndexShard test = indicesService.indexService("test").shard(0); + assertEquals(versionCreated.luceneVersion, test.minimumCompatibleVersion()); + client().prepareIndex("test", "test").setSource("{}").get(); + assertEquals(versionCreated.luceneVersion, test.minimumCompatibleVersion()); + test.engine().flush(); + assertEquals(Version.CURRENT.luceneVersion, test.minimumCompatibleVersion()); + } } diff --git a/src/test/java/org/elasticsearch/rest/action/admin/indices/upgrade/UpgradeReallyOldIndexTest.java b/src/test/java/org/elasticsearch/rest/action/admin/indices/upgrade/UpgradeReallyOldIndexTest.java index ce2d54bb30f50..3fd6bf4c5fb64 100644 --- a/src/test/java/org/elasticsearch/rest/action/admin/indices/upgrade/UpgradeReallyOldIndexTest.java +++ b/src/test/java/org/elasticsearch/rest/action/admin/indices/upgrade/UpgradeReallyOldIndexTest.java @@ -19,7 +19,11 @@ package org.elasticsearch.rest.action.admin.indices.upgrade; +import org.elasticsearch.Version; import org.elasticsearch.bwcompat.StaticIndexBackwardCompatibilityTest; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.index.IndexService; +import org.elasticsearch.indices.IndicesService; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailures; @@ -29,6 +33,7 @@ public void testUpgrade_0_90_6() throws Exception { String indexName = "index-0.90.6"; loadIndex(indexName); + assertMinVersion(indexName, org.apache.lucene.util.Version.parse("4.5.1")); UpgradeTest.assertNotUpgraded(client(), indexName); assertTrue(UpgradeTest.hasAncientSegments(client(), indexName)); assertNoFailures(client().admin().indices().prepareUpgrade(indexName).setUpgradeOnlyAncientSegments(true).get()); @@ -36,6 +41,18 @@ public void testUpgrade_0_90_6() throws Exception { assertFalse(UpgradeTest.hasAncientSegments(client(), "index-0.90.6")); // This index has only ancient segments, so it should now be fully upgraded: UpgradeTest.assertUpgraded(client(), indexName); + assertEquals(Version.CURRENT.luceneVersion.toString(), client().admin().indices().prepareGetSettings(indexName).get().getSetting(indexName, IndexMetaData.SETTING_VERSION_MINIMUM_COMPATIBLE)); + assertMinVersion(indexName, Version.CURRENT.luceneVersion); + } + + private void assertMinVersion(String index, org.apache.lucene.util.Version version) { + for (IndicesService services : internalCluster().getInstances(IndicesService.class)) { + IndexService indexService = services.indexService(index); + if (indexService != null) { + assertEquals(version, indexService.shard(0).minimumCompatibleVersion()); + } + } + } }