Skip to content

Commit fdce2a4

Browse files
committed
let's see if that works
1 parent 45cbd16 commit fdce2a4

File tree

2 files changed

+33
-36
lines changed

2 files changed

+33
-36
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -304,12 +304,12 @@ public InternalEngine(EngineConfig engineConfig) {
304304
assert pendingTranslogRecovery.get() == false : "translog recovery can't be pending before we set it";
305305
// don't allow commits until we are done with recovering
306306
pendingTranslogRecovery.set(true);
307-
for (ReferenceManager.RefreshListener listener : engineConfig.getExternalRefreshListener()) {
308-
this.externalReaderManager.addListener(listener);
309-
}
310-
for (ReferenceManager.RefreshListener listener : engineConfig.getInternalRefreshListener()) {
311-
this.internalReaderManager.addListener(listener);
312-
}
307+
new ElasticsearchDirectoryReaderRefreshListener(externalReaderManager, engineConfig.getExternalRefreshListener()); // add itself
308+
// as
309+
// listener
310+
new ElasticsearchDirectoryReaderRefreshListener(internalReaderManager, engineConfig.getInternalRefreshListener()); // add itself
311+
// as
312+
// listener
313313
this.lastRefreshedCheckpointListener = new LastRefreshedCheckpointListener(localCheckpointTracker.getProcessedCheckpoint());
314314
this.internalReaderManager.addListener(lastRefreshedCheckpointListener);
315315
maxSeqNoOfUpdatesOrDeletes = new AtomicLong(SequenceNumbers.max(localCheckpointTracker.getMaxSeqNo(), translog.getMaxSeqNo()));

server/src/main/java/org/elasticsearch/index/shard/IndexShard.java

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
import org.elasticsearch.index.engine.EngineException;
9595
import org.elasticsearch.index.engine.EngineFactory;
9696
import org.elasticsearch.index.engine.ReadOnlyEngine;
97+
import org.elasticsearch.index.engine.ReaderAwareRefreshListener;
9798
import org.elasticsearch.index.engine.RefreshFailedEngineException;
9899
import org.elasticsearch.index.engine.SafeCommitInfo;
99100
import 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

Comments
 (0)