Skip to content

Commit 204e165

Browse files
committed
simons patch + 4.8.1 snapshot
1 parent 9ed34b5 commit 204e165

File tree

2 files changed

+63
-5
lines changed

2 files changed

+63
-5
lines changed

pom.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
</parent>
3232

3333
<properties>
34-
<lucene.version>4.8.0</lucene.version>
34+
<lucene.version>4.8.1</lucene.version>
3535
<tests.jvms>auto</tests.jvms>
3636
<tests.shuffle>true</tests.shuffle>
3737
<tests.output>onerror</tests.output>
@@ -47,6 +47,10 @@
4747
<id>Codehaus Snapshots</id>
4848
<url>http://repository.codehaus.org/</url>
4949
</repository>
50+
<repository>
51+
<id>Release Candidate</id>
52+
<url>http://people.apache.org/~rmuir/fake_staging_area/lucene-solr-4.8.1-r1592647/lucene/maven/</url>
53+
</repository>
5054
</repositories>
5155

5256
<dependencies>

src/main/java/org/elasticsearch/index/engine/internal/InternalEngine.java

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ public class InternalEngine extends AbstractIndexShardComponent implements Engin
163163

164164
private SegmentInfos lastCommittedSegmentInfos;
165165

166+
private IndexThrottle throttle;
167+
166168
@Inject
167169
public InternalEngine(ShardId shardId, @IndexSettings Settings indexSettings, ThreadPool threadPool,
168170
IndexSettingsService indexSettingsService, ShardIndexingService indexingService, @Nullable IndicesWarmer warmer,
@@ -257,6 +259,10 @@ public void start() throws EngineException {
257259
}
258260
try {
259261
this.indexWriter = createWriter();
262+
mergeScheduler.removeListener(this.throttle);
263+
//nocommit find a good value for this?
264+
this.throttle = new IndexThrottle(ConcurrentMergeScheduler.DEFAULT_MAX_MERGE_COUNT, indexWriter);
265+
mergeScheduler.addListener(throttle);
260266
} catch (IOException e) {
261267
throw new EngineCreationFailureException(shardId, "failed to create engine", e);
262268
}
@@ -373,7 +379,9 @@ public void create(Create create) throws EngineException {
373379
if (writer == null) {
374380
throw new EngineClosedException(shardId, failedEngine);
375381
}
376-
innerCreate(create, writer);
382+
try (Releasable r = throttle.acquireThrottle()) {
383+
innerCreate(create, writer);
384+
}
377385
dirty = true;
378386
possibleMergeNeeded = true;
379387
flushNeeded = true;
@@ -462,8 +470,9 @@ public void index(Index index) throws EngineException {
462470
if (writer == null) {
463471
throw new EngineClosedException(shardId, failedEngine);
464472
}
465-
466-
innerIndex(index, writer);
473+
try (Releasable r = throttle.acquireThrottle()) {
474+
innerIndex(index, writer);
475+
}
467476
dirty = true;
468477
possibleMergeNeeded = true;
469478
flushNeeded = true;
@@ -744,7 +753,10 @@ public void flush(Flush flush) throws EngineException {
744753
// to be allocated to a different node
745754
currentIndexWriter().close(false);
746755
indexWriter = createWriter();
747-
756+
mergeScheduler.removeListener(this.throttle);
757+
//nocommit find a good value for this?
758+
this.throttle = new IndexThrottle(ConcurrentMergeScheduler.DEFAULT_MAX_MERGE_COUNT, indexWriter);
759+
mergeScheduler.addListener(throttle);
748760
// commit on a just opened writer will commit even if there are no changes done to it
749761
// we rely on that for the commit data translog id key
750762
if (flushNeeded || flush.force()) {
@@ -1559,4 +1571,46 @@ boolean assertLockIsHeld() {
15591571
return aBoolean != null && aBoolean.booleanValue();
15601572
}
15611573
}
1574+
1575+
private static final class IndexThrottle implements MergeSchedulerProvider.Listener {
1576+
1577+
private final IndexWriter writer;
1578+
private volatile InternalLock lock;
1579+
private final InternalLock lockReference = new InternalLock(new ReentrantLock());
1580+
private final AtomicInteger numMergesInFlight = new AtomicInteger(0);
1581+
private final int maxNumMerges;
1582+
1583+
private static final Releasable DUMMY = new Releasable() {
1584+
@Override
1585+
public void close() throws ElasticsearchException {}
1586+
};
1587+
1588+
public IndexThrottle(int maxNumMerges, IndexWriter writer) {
1589+
this.maxNumMerges = maxNumMerges;
1590+
this.writer = writer;
1591+
}
1592+
1593+
public Releasable acquireThrottle() {
1594+
final InternalLock lock = this.lock;
1595+
if (lock == null) {
1596+
return DUMMY;
1597+
}
1598+
return lock.acquire();
1599+
}
1600+
1601+
1602+
@Override
1603+
public void beforeMerge(OnGoingMerge merge) {
1604+
if (numMergesInFlight.incrementAndGet() > maxNumMerges && writer.hasPendingMerges()) {
1605+
lock = lockReference;
1606+
}
1607+
}
1608+
1609+
@Override
1610+
public void afterMerge(OnGoingMerge merge) {
1611+
if (numMergesInFlight.decrementAndGet() <= maxNumMerges && !writer.hasPendingMerges()) {
1612+
lock = null;
1613+
}
1614+
}
1615+
}
15621616
}

0 commit comments

Comments
 (0)