diff --git a/core/src/main/java/org/elasticsearch/index/IndexService.java b/core/src/main/java/org/elasticsearch/index/IndexService.java
index f848c706835..cbbdaab10c8 100644
--- a/core/src/main/java/org/elasticsearch/index/IndexService.java
+++ b/core/src/main/java/org/elasticsearch/index/IndexService.java
@@ -635,7 +635,9 @@ public final class IndexService extends AbstractIndexComponent implements IndexC
case STARTED:
case RELOCATED:
try {
- shard.refresh("schedule");
+ if (shard.isRefreshNeeded()) {
+ shard.refresh("schedule");
+ }
} catch (EngineClosedException | AlreadyClosedException ex) {
// fine - continue;
}
diff --git a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java
index 1fb0b7ec4d3..73ba9d04003 100644
--- a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java
+++ b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java
@@ -541,25 +541,23 @@ public class IndexShard extends AbstractIndexShardComponent {
/** Writes all indexing changes to disk and opens a new searcher reflecting all changes. This can throw {@link EngineClosedException}. */
public void refresh(String source) {
verifyNotClosed();
- if (getEngine().refreshNeeded()) {
- if (canIndex()) {
- long bytes = getEngine().getIndexBufferRAMBytesUsed();
- writingBytes.addAndGet(bytes);
- try {
- logger.debug("refresh with source [{}] indexBufferRAMBytesUsed [{}]", source, new ByteSizeValue(bytes));
- long time = System.nanoTime();
- getEngine().refresh(source);
- refreshMetric.inc(System.nanoTime() - time);
- } finally {
- logger.debug("remove [{}] writing bytes for shard [{}]", new ByteSizeValue(bytes), shardId());
- writingBytes.addAndGet(-bytes);
- }
- } else {
- logger.debug("refresh with source [{}]", source);
+ if (canIndex()) {
+ long bytes = getEngine().getIndexBufferRAMBytesUsed();
+ writingBytes.addAndGet(bytes);
+ try {
+ logger.debug("refresh with source [{}] indexBufferRAMBytesUsed [{}]", source, new ByteSizeValue(bytes));
long time = System.nanoTime();
getEngine().refresh(source);
refreshMetric.inc(System.nanoTime() - time);
+ } finally {
+ logger.debug("remove [{}] writing bytes for shard [{}]", new ByteSizeValue(bytes), shardId());
+ writingBytes.addAndGet(-bytes);
}
+ } else {
+ logger.debug("refresh with source [{}]", source);
+ long time = System.nanoTime();
+ getEngine().refresh(source);
+ refreshMetric.inc(System.nanoTime() - time);
}
}
@@ -1514,4 +1512,15 @@ public class IndexShard extends AbstractIndexShardComponent {
return engineFactory;
}
+ /**
+ * Returns true
iff one or more changes to the engine are not visible to via the current searcher.
+ * Otherwise false
.
+ *
+ * @throws EngineClosedException if the engine is already closed
+ * @throws AlreadyClosedException if the internal indexwriter in the engine is already closed
+ */
+ public boolean isRefreshNeeded() {
+ return getEngine().refreshNeeded();
+ }
+
}