From eb8b38d027cb8e70a45d504056e61372f438194d Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Tue, 26 Mar 2013 08:52:00 +0100 Subject: [PATCH] Upgrade to Lucene 4.2.1 --- pom.xml | 2 +- .../lucene/store/StoreRateLimiting.java | 5 +- .../lucene/store/XSimpleRateLimiter.java | 98 ------------------- .../elasticsearch/common/lucene/Lucene.java | 22 +---- .../indices/recovery/RecoverySettings.java | 8 +- .../lucene/store/XSimpleRateLimiterTest.java | 62 ------------ 6 files changed, 9 insertions(+), 188 deletions(-) delete mode 100644 src/main/java/org/apache/lucene/store/XSimpleRateLimiter.java delete mode 100644 src/test/java/org/apache/lucene/store/XSimpleRateLimiterTest.java diff --git a/pom.xml b/pom.xml index c6b08b93bfe..61573ea0596 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ - 4.2.0 + 4.2.1 diff --git a/src/main/java/org/apache/lucene/store/StoreRateLimiting.java b/src/main/java/org/apache/lucene/store/StoreRateLimiting.java index 96840a94f07..458a9f74c3a 100644 --- a/src/main/java/org/apache/lucene/store/StoreRateLimiting.java +++ b/src/main/java/org/apache/lucene/store/StoreRateLimiting.java @@ -18,6 +18,7 @@ */ package org.apache.lucene.store; +import org.apache.lucene.store.RateLimiter.SimpleRateLimiter; import org.elasticsearch.ElasticSearchIllegalArgumentException; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.unit.ByteSizeValue; @@ -53,8 +54,8 @@ public class StoreRateLimiting { } } - private final XSimpleRateLimiter rateLimiter = new XSimpleRateLimiter(0); - private volatile XSimpleRateLimiter actualRateLimiter; + private final SimpleRateLimiter rateLimiter = new SimpleRateLimiter(0); + private volatile SimpleRateLimiter actualRateLimiter; private volatile Type type; diff --git a/src/main/java/org/apache/lucene/store/XSimpleRateLimiter.java b/src/main/java/org/apache/lucene/store/XSimpleRateLimiter.java deleted file mode 100644 index 20a375fe17c..00000000000 --- a/src/main/java/org/apache/lucene/store/XSimpleRateLimiter.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to ElasticSearch and Shay Banon under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. ElasticSearch licenses this - * file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.lucene.store; - -import org.apache.lucene.util.ThreadInterruptedException; - -// LUCENE UPGRADE - this is a copy of a RateLimiter.SimpleRateLimiter fixing bug #2785 Lucene 4.3 should fix that -public final class XSimpleRateLimiter extends RateLimiter { - private volatile double mbPerSec; - private volatile double nsPerByte; - private volatile long lastNS; - - // TODO: we could also allow eg a sub class to dynamically - // determine the allowed rate, eg if an app wants to - // change the allowed rate over time or something - - /** mbPerSec is the MB/sec max IO rate */ - public XSimpleRateLimiter(double mbPerSec) { - setMbPerSec(mbPerSec); - } - - /** - * Sets an updated mb per second rate limit. - */ - @Override - public void setMbPerSec(double mbPerSec) { - this.mbPerSec = mbPerSec; - nsPerByte = 1000000000. / (1024*1024*mbPerSec); - - } - - /** - * The current mb per second rate limit. - */ - @Override - public double getMbPerSec() { - return this.mbPerSec; - } - - /** Pauses, if necessary, to keep the instantaneous IO - * rate at or below the target. NOTE: multiple threads - * may safely use this, however the implementation is - * not perfectly thread safe but likely in practice this - * is harmless (just means in some rare cases the rate - * might exceed the target). It's best to call this - * with a biggish count, not one byte at a time. - * @return the pause time in nano seconds - * */ - @Override - public long pause(long bytes) { - if (bytes == 1) { - return 0; - } - - // TODO: this is purely instantaneous rate; maybe we - // should also offer decayed recent history one? - final long targetNS = lastNS = lastNS + ((long) (bytes * nsPerByte)); - final long startNs; - long curNS = startNs = System.nanoTime(); - if (lastNS < curNS) { - lastNS = curNS; - } - - // While loop because Thread.sleep doesn't always sleep - // enough: - while(true) { - final long pauseNS = targetNS - curNS; - if (pauseNS > 0) { - try { - Thread.sleep((int) (pauseNS/1000000), (int) (pauseNS % 1000000)); - } catch (InterruptedException ie) { - throw new ThreadInterruptedException(ie); - } - curNS = System.nanoTime(); - continue; - } - break; - } - - return curNS - startNs; - } - } \ No newline at end of file diff --git a/src/main/java/org/elasticsearch/common/lucene/Lucene.java b/src/main/java/org/elasticsearch/common/lucene/Lucene.java index 1fef87a58e9..7968aa18f43 100644 --- a/src/main/java/org/elasticsearch/common/lucene/Lucene.java +++ b/src/main/java/org/elasticsearch/common/lucene/Lucene.java @@ -378,27 +378,7 @@ public class Lucene { } - // LUCENE UPGRADE this is a workaround for LUCENE-4870 public static final boolean indexExists(final Directory directory) { - try { - new FindSegmentsFile(directory) { - @Override - protected Object doBody(String segmentFileName) throws IOException { - try { - new SegmentInfos().read(directory, segmentFileName); - } catch (FileNotFoundException ex) { - if (!directory.fileExists(segmentFileName)) { - throw ex; - } - // this is ok - we might have run into a access - // exception here or even worse a too many open files exception. - } - return null; - } - }.run(); - return true; - } catch (IOException ioe) { - return false; - } + return DirectoryReader.indexExists(directory); } } diff --git a/src/main/java/org/elasticsearch/indices/recovery/RecoverySettings.java b/src/main/java/org/elasticsearch/indices/recovery/RecoverySettings.java index 5ff49d0e072..10606ea0154 100644 --- a/src/main/java/org/elasticsearch/indices/recovery/RecoverySettings.java +++ b/src/main/java/org/elasticsearch/indices/recovery/RecoverySettings.java @@ -21,7 +21,7 @@ package org.elasticsearch.indices.recovery; import com.google.common.base.Objects; import org.apache.lucene.store.RateLimiter; -import org.apache.lucene.store.XSimpleRateLimiter; +import org.apache.lucene.store.RateLimiter.SimpleRateLimiter; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; @@ -54,7 +54,7 @@ public class RecoverySettings extends AbstractComponent { private final ThreadPoolExecutor concurrentStreamPool; private volatile ByteSizeValue maxSizePerSec; - private volatile XSimpleRateLimiter rateLimiter; + private volatile SimpleRateLimiter rateLimiter; @Inject public RecoverySettings(Settings settings, NodeSettingsService nodeSettingsService) { @@ -72,7 +72,7 @@ public class RecoverySettings extends AbstractComponent { if (maxSizePerSec.bytes() <= 0) { rateLimiter = null; } else { - rateLimiter = new XSimpleRateLimiter(maxSizePerSec.mbFrac()); + rateLimiter = new SimpleRateLimiter(maxSizePerSec.mbFrac()); } logger.debug("using max_size_per_sec[{}], concurrent_streams [{}], file_chunk_size [{}], translog_size [{}], translog_ops [{}], and compress [{}]", @@ -131,7 +131,7 @@ public class RecoverySettings extends AbstractComponent { } else if (rateLimiter != null) { rateLimiter.setMbPerSec(maxSizePerSec.mbFrac()); } else { - rateLimiter = new XSimpleRateLimiter(maxSizePerSec.mbFrac()); + rateLimiter = new SimpleRateLimiter(maxSizePerSec.mbFrac()); } } diff --git a/src/test/java/org/apache/lucene/store/XSimpleRateLimiterTest.java b/src/test/java/org/apache/lucene/store/XSimpleRateLimiterTest.java deleted file mode 100644 index e53ed73398d..00000000000 --- a/src/test/java/org/apache/lucene/store/XSimpleRateLimiterTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to ElasticSearch and Shay Banon under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. ElasticSearch licenses this - * file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.lucene.store; - -import java.util.concurrent.TimeUnit; - -import org.testng.annotations.Test; -import org.apache.lucene.store.RateLimiter.SimpleRateLimiter; -import org.apache.lucene.util.Version; -import org.elasticsearch.common.lucene.Lucene; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.lessThan; -import static org.hamcrest.Matchers.greaterThan; - -public class XSimpleRateLimiterTest { - - @Test - public void testPause() { - XSimpleRateLimiter limiter = new XSimpleRateLimiter(10); // 10 MB / Sec - limiter.pause(2);//init - long pause = 0; - for (int i = 0; i < 3; i++) { - pause += limiter.pause(4 * 1024 * 1024); // fire up 3 * 4 MB - } - final long convert = TimeUnit.MILLISECONDS.convert(pause, TimeUnit.NANOSECONDS); - assertThat(convert, lessThan(2000l)); // more than 2 seconds should be an error here! - assertThat(convert, greaterThan(1000l)); // we should sleep at lease 1 sec - } - - @Test - public void testPauseLucene() { - if (Version.LUCENE_42 != Lucene.VERSION) { // once we upgrade test the lucene impl again - SimpleRateLimiter limiter = new SimpleRateLimiter(10); // 10 MB / Sec - limiter.pause(2);//init - long pause = 0; - for (int i = 0; i < 3; i++) { - pause += limiter.pause(4 * 1024 * 1024); // fire up 3 * 4 MB - } - final long convert = TimeUnit.MILLISECONDS.convert(pause, TimeUnit.NANOSECONDS); - assertThat(convert, lessThan(2000l)); // more than 2 seconds should be an error here! - assertThat(convert, greaterThan(1000l)); // we should sleep at lease 1 sec - assert false : "Upgrade XSimpleRateLimiter to Lucene SimpleRateLimiter"; - } - } -}