Skip to content

Commit aaf9e69

Browse files
authoredApr 3, 2024
Memoize isOnRemoteNode in index settings and refactor as well (#12994) (#13016)
Signed-off-by: Gaurav Bafna <gbbafna@amazon.com> (cherry picked from commit eb66f62) Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent 71abf35 commit aaf9e69

File tree

10 files changed

+37
-24
lines changed

10 files changed

+37
-24
lines changed
 

‎server/src/main/java/org/opensearch/index/IndexSettings.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,7 @@ public static IndexMergePolicy fromString(String text) {
759759

760760
private volatile String defaultSearchPipeline;
761761
private final boolean widenIndexSortType;
762+
private final boolean assignedOnRemoteNode;
762763

763764
/**
764765
* The maximum age of a retention lease before it is considered expired.
@@ -981,6 +982,7 @@ public IndexSettings(final IndexMetadata indexMetadata, final Settings nodeSetti
981982
* Now this sortField (IndexSort) is stored in SegmentInfo and we need to maintain backward compatibility for them.
982983
*/
983984
widenIndexSortType = IndexMetadata.SETTING_INDEX_VERSION_CREATED.get(settings).before(V_2_7_0);
985+
assignedOnRemoteNode = RemoteStoreNodeAttribute.isRemoteDataAttributePresent(this.getNodeSettings());
984986

985987
setEnableFuzzySetForDocId(scopedSettings.get(INDEX_DOC_ID_FUZZY_SET_ENABLED_SETTING));
986988
setDocIdFuzzySetFalsePositiveProbability(scopedSettings.get(INDEX_DOC_ID_FUZZY_SET_FALSE_POSITIVE_PROBABILITY_SETTING));
@@ -1226,7 +1228,7 @@ public int getNumberOfReplicas() {
12261228
* proper index setting during the migration.
12271229
*/
12281230
public boolean isSegRepEnabledOrRemoteNode() {
1229-
return ReplicationType.SEGMENT.equals(replicationType) || isRemoteNode();
1231+
return ReplicationType.SEGMENT.equals(replicationType) || isAssignedOnRemoteNode();
12301232
}
12311233

12321234
public boolean isSegRepLocalEnabled() {
@@ -1244,8 +1246,8 @@ public boolean isRemoteStoreEnabled() {
12441246
return isRemoteStoreEnabled;
12451247
}
12461248

1247-
public boolean isRemoteNode() {
1248-
return RemoteStoreNodeAttribute.isRemoteDataAttributePresent(this.getNodeSettings());
1249+
public boolean isAssignedOnRemoteNode() {
1250+
return assignedOnRemoteNode;
12491251
}
12501252

12511253
/**

‎server/src/main/java/org/opensearch/index/engine/NRTReplicationEngine.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ protected final void closeNoLock(String reason, CountDownLatch closedLatch) {
489489
during promotion.
490490
*/
491491
if (engineConfig.getIndexSettings().isRemoteStoreEnabled() == false
492-
&& engineConfig.getIndexSettings().isRemoteNode() == false) {
492+
&& engineConfig.getIndexSettings().isAssignedOnRemoteNode() == false) {
493493
latestSegmentInfos.counter = latestSegmentInfos.counter + SI_COUNTER_INCREMENT;
494494
latestSegmentInfos.changed();
495495
}

‎server/src/main/java/org/opensearch/index/remote/RemoteStoreStatsTrackerFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public RemoteStoreStatsTrackerFactory(ClusterService clusterService, Settings se
6868

6969
@Override
7070
public void afterIndexShardCreated(IndexShard indexShard) {
71-
if (indexShard.indexSettings().isRemoteStoreEnabled() == false && indexShard.indexSettings().isRemoteNode() == false) {
71+
if (indexShard.indexSettings().isRemoteStoreEnabled() == false && indexShard.indexSettings().isAssignedOnRemoteNode() == false) {
7272
return;
7373
}
7474
ShardId shardId = indexShard.shardId();

‎server/src/main/java/org/opensearch/index/shard/IndexShard.java

+13-13
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ public IndexShard(
408408
logger,
409409
threadPool,
410410
this::getEngine,
411-
indexSettings.isRemoteNode(),
411+
indexSettings.isAssignedOnRemoteNode(),
412412
() -> getRemoteTranslogUploadBufferInterval(remoteStoreSettings::getClusterRemoteTranslogBufferInterval)
413413
);
414414
this.mapperService = mapperService;
@@ -1476,7 +1476,7 @@ public SegmentsStats segmentStats(boolean includeSegmentFileSizes, boolean inclu
14761476
SegmentsStats segmentsStats = getEngine().segmentsStats(includeSegmentFileSizes, includeUnloadedSegments);
14771477
segmentsStats.addBitsetMemoryInBytes(shardBitsetFilterCache.getMemorySizeInBytes());
14781478
// Populate remote_store stats only if the index is remote store backed
1479-
if (indexSettings().isRemoteNode()) {
1479+
if (indexSettings().isAssignedOnRemoteNode()) {
14801480
segmentsStats.addRemoteSegmentStats(
14811481
new RemoteSegmentStats(remoteStoreStatsTrackerFactory.getRemoteSegmentTransferTracker(shardId).stats())
14821482
);
@@ -1498,7 +1498,7 @@ public FieldDataStats fieldDataStats(String... fields) {
14981498
public TranslogStats translogStats() {
14991499
TranslogStats translogStats = getEngine().getTranslogStats();
15001500
// Populate remote_store stats only if the index is remote store backed
1501-
if (indexSettings.isRemoteNode()) {
1501+
if (indexSettings.isAssignedOnRemoteNode()) {
15021502
translogStats.addRemoteTranslogStats(
15031503
new RemoteTranslogStats(remoteStoreStatsTrackerFactory.getRemoteTranslogTransferTracker(shardId).stats())
15041504
);
@@ -1537,7 +1537,7 @@ public void flush(FlushRequest request) {
15371537
* {@link org.opensearch.index.translog.TranslogDeletionPolicy} for details
15381538
*/
15391539
public void trimTranslog() {
1540-
if (indexSettings.isRemoteNode()) {
1540+
if (indexSettings.isAssignedOnRemoteNode()) {
15411541
return;
15421542
}
15431543
verifyNotClosed();
@@ -2059,7 +2059,7 @@ public void close(String reason, boolean flushEngine, boolean deleted) throws IO
20592059
ToDo : Fix this https://github.com/opensearch-project/OpenSearch/issues/8003
20602060
*/
20612061
public RemoteSegmentStoreDirectory getRemoteDirectory() {
2062-
assert indexSettings.isRemoteNode();
2062+
assert indexSettings.isAssignedOnRemoteNode();
20632063
assert remoteStore.directory() instanceof FilterDirectory : "Store.directory is not an instance of FilterDirectory";
20642064
FilterDirectory remoteStoreDirectory = (FilterDirectory) remoteStore.directory();
20652065
FilterDirectory byteSizeCachingStoreDirectory = (FilterDirectory) remoteStoreDirectory.getDelegate();
@@ -2072,7 +2072,7 @@ public RemoteSegmentStoreDirectory getRemoteDirectory() {
20722072
* is in sync with local
20732073
*/
20742074
public boolean isRemoteSegmentStoreInSync() {
2075-
assert indexSettings.isRemoteNode();
2075+
assert indexSettings.isAssignedOnRemoteNode();
20762076
try {
20772077
RemoteSegmentStoreDirectory directory = getRemoteDirectory();
20782078
if (directory.readLatestMetadataFile() != null) {
@@ -2111,7 +2111,7 @@ public void waitForRemoteStoreSync() {
21112111
Calls onProgress on seeing an increased file count on remote
21122112
*/
21132113
public void waitForRemoteStoreSync(Runnable onProgress) {
2114-
assert indexSettings.isRemoteNode();
2114+
assert indexSettings.isAssignedOnRemoteNode();
21152115
RemoteSegmentStoreDirectory directory = getRemoteDirectory();
21162116
int segmentUploadeCount = 0;
21172117
if (shardRouting.primary() == false) {
@@ -2285,7 +2285,7 @@ public long recoverLocallyAndFetchStartSeqNo(boolean localTranslog) {
22852285
* @return the starting sequence number from which the recovery should start.
22862286
*/
22872287
private long recoverLocallyUptoLastCommit() {
2288-
assert indexSettings.isRemoteNode() : "Remote translog store is not enabled";
2288+
assert indexSettings.isAssignedOnRemoteNode() : "Remote translog store is not enabled";
22892289
long seqNo;
22902290
validateLocalRecoveryState();
22912291

@@ -3555,7 +3555,7 @@ assert getLocalCheckpoint() == primaryContext.getCheckpointStates().get(allocati
35553555
}
35563556

35573557
private void postActivatePrimaryMode() {
3558-
if (indexSettings.isRemoteNode()) {
3558+
if (indexSettings.isAssignedOnRemoteNode()) {
35593559
// We make sure to upload translog (even if it does not contain any operations) to remote translog.
35603560
// This helps to get a consistent state in remote store where both remote segment store and remote
35613561
// translog contains data.
@@ -4025,7 +4025,7 @@ public boolean enableUploadToRemoteTranslog() {
40254025
}
40264026

40274027
private boolean hasOneRemoteSegmentSyncHappened() {
4028-
assert indexSettings.isRemoteNode();
4028+
assert indexSettings.isAssignedOnRemoteNode();
40294029
// We upload remote translog only after one remote segment upload in case of migration
40304030
RemoteSegmentStoreDirectory rd = getRemoteDirectory();
40314031
AtomicBoolean segment_n_uploaded = new AtomicBoolean(false);
@@ -4639,7 +4639,7 @@ public final boolean isSearchIdle() {
46394639
public final boolean isSearchIdleSupported() {
46404640
// If the index is remote store backed, then search idle is not supported. This is to ensure that async refresh
46414641
// task continues to upload to remote store periodically.
4642-
if (isRemoteTranslogEnabled() || indexSettings.isRemoteNode()) {
4642+
if (isRemoteTranslogEnabled() || indexSettings.isAssignedOnRemoteNode()) {
46434643
return false;
46444644
}
46454645
return indexSettings.isSegRepEnabledOrRemoteNode() == false || indexSettings.getNumberOfReplicas() == 0;
@@ -5269,9 +5269,9 @@ enum ShardMigrationState {
52695269
}
52705270

52715271
static ShardMigrationState getShardMigrationState(IndexSettings indexSettings, boolean shouldSeed) {
5272-
if (indexSettings.isRemoteNode() && indexSettings.isRemoteStoreEnabled()) {
5272+
if (indexSettings.isAssignedOnRemoteNode() && indexSettings.isRemoteStoreEnabled()) {
52735273
return REMOTE_NON_MIGRATING;
5274-
} else if (indexSettings.isRemoteNode()) {
5274+
} else if (indexSettings.isAssignedOnRemoteNode()) {
52755275
return shouldSeed ? REMOTE_MIGRATING_UNSEEDED : REMOTE_MIGRATING_SEEDED;
52765276
}
52775277
return ShardMigrationState.DOCREP_NON_MIGRATING;

‎server/src/main/java/org/opensearch/index/store/Store.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -893,7 +893,7 @@ public void beforeClose() {
893893
* @throws IOException when there is an IO error committing.
894894
*/
895895
public void commitSegmentInfos(SegmentInfos latestSegmentInfos, long maxSeqNo, long processedCheckpoint) throws IOException {
896-
assert indexSettings.isSegRepEnabledOrRemoteNode() || indexSettings.isRemoteNode();
896+
assert indexSettings.isSegRepEnabledOrRemoteNode() || indexSettings.isAssignedOnRemoteNode();
897897
metadataLock.writeLock().lock();
898898
try {
899899
final Map<String, String> userData = new HashMap<>(latestSegmentInfos.getUserData());

‎server/src/main/java/org/opensearch/index/translog/Translog.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ TranslogWriter createWriter(
525525
tragedy,
526526
persistedSequenceNumberConsumer,
527527
bigArrays,
528-
indexSettings.isRemoteNode()
528+
indexSettings.isAssignedOnRemoteNode()
529529
);
530530
} catch (final IOException e) {
531531
throw new TranslogException(shardId, "failed to create new translog file", e);

‎server/src/main/java/org/opensearch/indices/IndicesService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,7 @@ private EngineFactory getEngineFactory(final IndexSettings idxSettings) {
923923
if (idxSettings.isRemoteSnapshot()) {
924924
return config -> new ReadOnlyEngine(config, new SeqNoStats(0, 0, 0), new TranslogStats(), true, Function.identity(), false);
925925
}
926-
if (idxSettings.isSegRepEnabledOrRemoteNode() || idxSettings.isRemoteNode()) {
926+
if (idxSettings.isSegRepEnabledOrRemoteNode() || idxSettings.isAssignedOnRemoteNode()) {
927927
return new NRTReplicationEngineFactory();
928928
}
929929
return new InternalEngineFactory();

‎server/src/main/java/org/opensearch/indices/recovery/PeerRecoveryTargetService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ private void doRecovery(final long recoveryId, final StartRecoveryRequest preExi
262262
}
263263
}
264264
final boolean hasRemoteTranslog = recoveryTarget.state().getPrimary() == false
265-
&& indexShard.indexSettings().isRemoteNode();
265+
&& indexShard.indexSettings().isAssignedOnRemoteNode();
266266
final boolean hasNoTranslog = indexShard.indexSettings().isRemoteSnapshot();
267267
final boolean verifyTranslog = (hasRemoteTranslog || hasNoTranslog || hasRemoteSegmentStore) == false;
268268
final long startingSeqNo = indexShard.recoverLocallyAndFetchStartSeqNo(!hasRemoteTranslog);

‎server/src/test/java/org/opensearch/index/IndexSettingsTests.java

+11
Original file line numberDiff line numberDiff line change
@@ -1052,4 +1052,15 @@ public void testDefaultSearchPipeline() throws Exception {
10521052
settings.updateIndexMetadata(metadata);
10531053
assertEquals("foo", settings.getDefaultSearchPipeline());
10541054
}
1055+
1056+
public void testIsOnRemoteNode() {
1057+
Version version = VersionUtils.getPreviousVersion();
1058+
Settings theSettings = Settings.builder()
1059+
.put(IndexMetadata.SETTING_VERSION_CREATED, version)
1060+
.put(IndexMetadata.SETTING_INDEX_UUID, "0xdeadbeef")
1061+
.build();
1062+
Settings nodeSettings = Settings.builder().put("node.attr.remote_store.translog.repository", "my-repo-1").build();
1063+
IndexSettings settings = newIndexSettings(newIndexMeta("index", theSettings), nodeSettings);
1064+
assertTrue("Index should be on remote node", settings.isAssignedOnRemoteNode());
1065+
}
10551066
}

‎test/framework/src/main/java/org/opensearch/index/shard/IndexShardTestCase.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,7 @@ protected IndexShard newShard(
654654
RemoteStoreStatsTrackerFactory remoteStoreStatsTrackerFactory = null;
655655
RepositoriesService mockRepoSvc = mock(RepositoriesService.class);
656656

657-
if (indexSettings.isRemoteStoreEnabled() || indexSettings.isRemoteNode()) {
657+
if (indexSettings.isRemoteStoreEnabled() || indexSettings.isAssignedOnRemoteNode()) {
658658
String remoteStoreRepository = indexSettings.getRemoteStoreRepository();
659659
// remote path via setting a repository . This is a hack used for shards are created using reset .
660660
// since we can't get remote path from IndexShard directly, we are using repository to store it .
@@ -1498,7 +1498,7 @@ private SegmentReplicationTargetService prepareForReplication(
14981498

14991499
SegmentReplicationSourceFactory sourceFactory = null;
15001500
SegmentReplicationTargetService targetService;
1501-
if (primaryShard.indexSettings.isRemoteStoreEnabled() || primaryShard.indexSettings.isRemoteNode()) {
1501+
if (primaryShard.indexSettings.isRemoteStoreEnabled() || primaryShard.indexSettings.isAssignedOnRemoteNode()) {
15021502
RecoverySettings recoverySettings = new RecoverySettings(
15031503
Settings.EMPTY,
15041504
new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS)

0 commit comments

Comments
 (0)