19
19
20
20
package org .elasticsearch .index .engine .internal ;
21
21
22
- import com .google .common .collect .Lists ;
22
+ import java .io .IOException ;
23
+ import java .util .*;
24
+ import java .util .concurrent .ConcurrentMap ;
25
+ import java .util .concurrent .CopyOnWriteArrayList ;
26
+ import java .util .concurrent .TimeUnit ;
27
+ import java .util .concurrent .atomic .AtomicBoolean ;
28
+ import java .util .concurrent .atomic .AtomicInteger ;
29
+ import java .util .concurrent .atomic .AtomicLong ;
30
+ import java .util .concurrent .locks .Lock ;
31
+ import java .util .concurrent .locks .ReentrantLock ;
32
+ import java .util .concurrent .locks .ReentrantReadWriteLock ;
33
+
23
34
import org .apache .lucene .index .*;
24
35
import org .apache .lucene .index .IndexWriter .IndexReaderWarmer ;
25
36
import org .apache .lucene .search .IndexSearcher ;
39
50
import org .elasticsearch .common .inject .Inject ;
40
51
import org .elasticsearch .common .lease .Releasable ;
41
52
import org .elasticsearch .common .lease .Releasables ;
53
+ import org .elasticsearch .common .logging .ESLogger ;
54
+ import org .elasticsearch .common .logging .Loggers ;
42
55
import org .elasticsearch .common .lucene .HashedBytesRef ;
43
56
import org .elasticsearch .common .lucene .LoggerInfoStream ;
44
57
import org .elasticsearch .common .lucene .Lucene ;
75
88
import org .elasticsearch .indices .warmer .IndicesWarmer ;
76
89
import org .elasticsearch .indices .warmer .InternalIndicesWarmer ;
77
90
import org .elasticsearch .threadpool .ThreadPool ;
78
-
79
- import java .io .IOException ;
80
- import java .util .*;
81
- import java .util .concurrent .ConcurrentMap ;
82
- import java .util .concurrent .CopyOnWriteArrayList ;
83
- import java .util .concurrent .TimeUnit ;
84
- import java .util .concurrent .atomic .AtomicBoolean ;
85
- import java .util .concurrent .atomic .AtomicInteger ;
86
- import java .util .concurrent .atomic .AtomicLong ;
87
- import java .util .concurrent .locks .Lock ;
88
- import java .util .concurrent .locks .ReentrantLock ;
89
- import java .util .concurrent .locks .ReentrantReadWriteLock ;
91
+ import com .google .common .collect .Lists ;
90
92
91
93
/**
92
94
*
@@ -260,8 +262,7 @@ public void start() throws EngineException {
260
262
try {
261
263
this .indexWriter = createWriter ();
262
264
mergeScheduler .removeListener (this .throttle );
263
- //nocommit find a good value for this?
264
- this .throttle = new IndexThrottle (ConcurrentMergeScheduler .DEFAULT_MAX_MERGE_COUNT , indexWriter );
265
+ this .throttle = new IndexThrottle (mergeScheduler .getMaxMerges (), indexWriter , indexSettings , shardId );
265
266
mergeScheduler .addListener (throttle );
266
267
} catch (IOException e ) {
267
268
throw new EngineCreationFailureException (shardId , "failed to create engine" , e );
@@ -754,8 +755,7 @@ public void flush(Flush flush) throws EngineException {
754
755
currentIndexWriter ().close (false );
755
756
indexWriter = createWriter ();
756
757
mergeScheduler .removeListener (this .throttle );
757
- //nocommit find a good value for this?
758
- this .throttle = new IndexThrottle (ConcurrentMergeScheduler .DEFAULT_MAX_MERGE_COUNT , indexWriter );
758
+ this .throttle = new IndexThrottle (mergeScheduler .getMaxMerges (), indexWriter , indexSettings , shardId );
759
759
mergeScheduler .addListener (throttle );
760
760
// commit on a just opened writer will commit even if there are no changes done to it
761
761
// we rely on that for the commit data translog id key
@@ -1579,15 +1579,17 @@ private static final class IndexThrottle implements MergeSchedulerProvider.Liste
1579
1579
private final InternalLock lockReference = new InternalLock (new ReentrantLock ());
1580
1580
private final AtomicInteger numMergesInFlight = new AtomicInteger (0 );
1581
1581
private final int maxNumMerges ;
1582
+ private final ESLogger logger ;
1582
1583
1583
1584
private static final Releasable DUMMY = new Releasable () {
1584
1585
@ Override
1585
1586
public void close () throws ElasticsearchException {}
1586
1587
};
1587
1588
1588
- public IndexThrottle (int maxNumMerges , IndexWriter writer ) {
1589
+ public IndexThrottle (int maxNumMerges , IndexWriter writer , Settings indexSettings , ShardId shardId ) {
1589
1590
this .maxNumMerges = maxNumMerges ;
1590
1591
this .writer = writer ;
1592
+ this .logger = Loggers .getLogger (getClass (), indexSettings , shardId );
1591
1593
}
1592
1594
1593
1595
public Releasable acquireThrottle () {
@@ -1598,17 +1600,18 @@ public Releasable acquireThrottle() {
1598
1600
return lock .acquire ();
1599
1601
}
1600
1602
1601
-
1602
1603
@ Override
1603
1604
public void beforeMerge (OnGoingMerge merge ) {
1604
1605
if (numMergesInFlight .incrementAndGet () > maxNumMerges && writer .hasPendingMerges ()) {
1605
- lock = lockReference ;
1606
+ logger .warn ("now throttling indexing: numMergesInFlight={}, maxNumMerges={}" , numMergesInFlight , maxNumMerges );
1607
+ lock = lockReference ;
1606
1608
}
1607
1609
}
1608
1610
1609
1611
@ Override
1610
1612
public void afterMerge (OnGoingMerge merge ) {
1611
1613
if (numMergesInFlight .decrementAndGet () <= maxNumMerges && !writer .hasPendingMerges ()) {
1614
+ logger .warn ("stop throttling indexing: numMergesInFlight={}, maxNumMerges={}" , numMergesInFlight , maxNumMerges );
1612
1615
lock = null ;
1613
1616
}
1614
1617
}
0 commit comments