9494import org .elasticsearch .index .engine .EngineException ;
9595import org .elasticsearch .index .engine .EngineFactory ;
9696import org .elasticsearch .index .engine .ReadOnlyEngine ;
97+ import org .elasticsearch .index .engine .ReaderAwareRefreshListener ;
9798import org .elasticsearch .index .engine .RefreshFailedEngineException ;
9899import org .elasticsearch .index .engine .SafeCommitInfo ;
99100import org .elasticsearch .index .engine .Segment ;
@@ -2259,6 +2260,7 @@ private boolean assertLastestCommitUserData() throws IOException {
22592260
22602261 private void onNewEngine (Engine newEngine ) {
22612262 assert engineLock .isWriteLockedByCurrentThread ();
2263+ refreshPendingLocationListener .setTranslogLastWriteLocationSupplier (newEngine ::getTranslogLastWriteLocation );
22622264 refreshListeners .setCurrentRefreshLocationSupplier (newEngine ::getTranslogLastWriteLocation );
22632265 refreshListeners .setCurrentProcessedCheckpointSupplier (newEngine ::getProcessedLocalCheckpoint );
22642266 refreshListeners .setMaxIssuedSeqNoSupplier (newEngine ::getMaxSeqNo );
@@ -4168,12 +4170,17 @@ private void setRefreshPending(Engine engine) {
41684170 }
41694171
41704172 private class RefreshPendingLocationListener implements ReferenceManager .RefreshListener {
4173+ Supplier <Translog .Location > supplier ;
41714174 Translog .Location lastWriteLocation ;
41724175
4176+ public void setTranslogLastWriteLocationSupplier (Supplier <Translog .Location > translogLastWriteLocation ) {
4177+ this .supplier = translogLastWriteLocation ;
4178+ }
4179+
41734180 @ Override
41744181 public void beforeRefresh () {
41754182 try {
4176- lastWriteLocation = getEngine (). getTranslogLastWriteLocation ();
4183+ lastWriteLocation = supplier . get ();
41774184 } catch (AlreadyClosedException exc ) {
41784185 // shard is closed - no location is fine
41794186 lastWriteLocation = null ;
@@ -4194,18 +4201,14 @@ public void afterRefresh(boolean didRefresh) {
41944201 }
41954202 }
41964203
4197- private class RefreshFieldHasValueListener implements ReferenceManager . RefreshListener {
4204+ private class RefreshFieldHasValueListener implements ReaderAwareRefreshListener {
41984205 @ Override
41994206 public void beforeRefresh () {}
42004207
42014208 @ Override
4202- public void afterRefresh (boolean didRefresh ) {
4209+ public void afterRefresh (boolean didRefresh , ElasticsearchDirectoryReader reader ) throws IOException {
42034210 if (enableFieldHasValue && (didRefresh || fieldInfos == FieldInfos .EMPTY )) {
4204- try (Engine .Searcher hasValueSearcher = getEngine ().acquireSearcher ("field_has_value" )) {
4205- setFieldInfos (FieldInfos .getMergedFieldInfos (hasValueSearcher .getIndexReader ()));
4206- } catch (AlreadyClosedException ignore ) {
4207- // engine is closed - no updated FieldInfos is fine
4208- }
4211+ setFieldInfos (FieldInfos .getMergedFieldInfos (reader .getContext ().reader ()));
42094212 }
42104213 }
42114214 }
@@ -4218,35 +4221,29 @@ public ShardFieldStats getShardFieldStats() {
42184221 return shardFieldStats ;
42194222 }
42204223
4221- private class RefreshShardFieldStatsListener implements ReferenceManager . RefreshListener {
4224+ private class RefreshShardFieldStatsListener implements ReaderAwareRefreshListener {
42224225 @ Override
4223- public void beforeRefresh () {
4224-
4225- }
4226+ public void beforeRefresh () {}
42264227
42274228 @ Override
4228- public void afterRefresh (boolean didRefresh ) {
4229+ public void afterRefresh (boolean didRefresh , ElasticsearchDirectoryReader reader ) throws IOException {
42294230 if (shardFieldStats == null || didRefresh ) {
4230- try (var searcher = getEngine ().acquireSearcher ("shard_field_stats" , Engine .SearcherScope .INTERNAL )) {
4231- int numSegments = 0 ;
4232- int totalFields = 0 ;
4233- long usages = 0 ;
4234- for (LeafReaderContext leaf : searcher .getLeafContexts ()) {
4235- numSegments ++;
4236- var fieldInfos = leaf .reader ().getFieldInfos ();
4237- totalFields += fieldInfos .size ();
4238- if (fieldInfos instanceof FieldInfosWithUsages ft ) {
4239- if (usages != -1 ) {
4240- usages += ft .getTotalUsages ();
4241- }
4242- } else {
4243- usages = -1 ;
4231+ int numSegments = 0 ;
4232+ int totalFields = 0 ;
4233+ long usages = 0 ;
4234+ for (LeafReaderContext leaf : reader .getContext ().leaves ()) {
4235+ numSegments ++;
4236+ var fieldInfos = leaf .reader ().getFieldInfos ();
4237+ totalFields += fieldInfos .size ();
4238+ if (fieldInfos instanceof FieldInfosWithUsages ft ) {
4239+ if (usages != -1 ) {
4240+ usages += ft .getTotalUsages ();
42444241 }
4242+ } else {
4243+ usages = -1 ;
42454244 }
4246- shardFieldStats = new ShardFieldStats (numSegments , totalFields , usages );
4247- } catch (AlreadyClosedException ignored ) {
4248-
42494245 }
4246+ shardFieldStats = new ShardFieldStats (numSegments , totalFields , usages );
42504247 }
42514248 }
42524249 }
0 commit comments