Skip to content

Commit d7262fb

Browse files
original-brownbeargeorgewallace
authored andcommitted
Make some constant SubscribableListener instances cheaper (elastic#124452)
We can just use a real constant for the `null` case, avoiding any non-plain stores in all cases. This should be somewhat helpful for the security interceptors.
1 parent 374f484 commit d7262fb

File tree

16 files changed

+31
-21
lines changed

16 files changed

+31
-21
lines changed

server/src/main/java/org/elasticsearch/action/admin/cluster/stats/TransportClusterStatsAction.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,15 @@ public TransportClusterStatsAction(
157157
protected SubscribableListener<AdditionalStats> createActionContext(Task task, ClusterStatsRequest request) {
158158
assert task instanceof CancellableTask;
159159
final var cancellableTask = (CancellableTask) task;
160-
final var additionalStatsListener = new SubscribableListener<AdditionalStats>();
161160
if (request.isRemoteStats() == false) {
161+
final var additionalStatsListener = new SubscribableListener<AdditionalStats>();
162162
final AdditionalStats additionalStats = new AdditionalStats();
163163
additionalStats.compute(cancellableTask, request, additionalStatsListener);
164+
return additionalStatsListener;
164165
} else {
165166
// For remote stats request, we don't need to compute anything
166-
additionalStatsListener.onResponse(null);
167+
return SubscribableListener.nullSuccess();
167168
}
168-
return additionalStatsListener;
169169
}
170170

171171
@Override

server/src/main/java/org/elasticsearch/action/support/SubscribableListener.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,4 +586,15 @@ private Runnable scheduleTimeout(TimeValue timeout, ThreadPool threadPool, Execu
586586
private Object compareAndExchangeState(Object expectedValue, Object newValue) {
587587
return VH_STATE_FIELD.compareAndExchange(this, expectedValue, newValue);
588588
}
589+
590+
@SuppressWarnings("rawtypes")
591+
private static final SubscribableListener NULL_SUCCESS = newSucceeded(null);
592+
593+
/**
594+
* Same as {@link #newSucceeded(Object)} but always returns the same instance with result value {@code null}.
595+
*/
596+
@SuppressWarnings("unchecked")
597+
public static <T> SubscribableListener<T> nullSuccess() {
598+
return NULL_SUCCESS;
599+
}
589600
}

server/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ protected void doClose() {}
243243
* Kind of a hack tbh, we can't be sure the shard locks are fully released when this is completed so there's all sorts of retries and
244244
* other lenience to handle that. It'd be better to wait for the shard locks to be released and then delete the data. See #74149.
245245
*/
246-
private volatile SubscribableListener<Void> lastClusterStateShardsClosedListener = SubscribableListener.newSucceeded(null);
246+
private volatile SubscribableListener<Void> lastClusterStateShardsClosedListener = SubscribableListener.nullSuccess();
247247

248248
@Nullable // if not currently applying a cluster state
249249
private RefCountingListener currentClusterStateShardsClosedListeners;
@@ -397,7 +397,7 @@ private void deleteIndices(final ClusterChangedEvent event) {
397397
);
398398
} else if (project.isPresent() && project.get().hasIndex(index)) {
399399
// The deleted index was part of the previous cluster state, but not loaded on the local node
400-
indexServiceClosedListener = SubscribableListener.newSucceeded(null);
400+
indexServiceClosedListener = SubscribableListener.nullSuccess();
401401
final IndexMetadata metadata = project.get().index(index);
402402
indexSettings = new IndexSettings(metadata, settings);
403403
indicesService.deleteUnassignedIndex("deleted index was not assigned to local node", metadata, state);
@@ -411,7 +411,7 @@ private void deleteIndices(final ClusterChangedEvent event) {
411411
// previous cluster state is not initialized/recovered.
412412
assert state.metadata().projects().values().stream().anyMatch(p -> p.indexGraveyard().containsIndex(index))
413413
|| previousState.blocks().hasGlobalBlock(GatewayService.STATE_NOT_RECOVERED_BLOCK);
414-
indexServiceClosedListener = SubscribableListener.newSucceeded(null);
414+
indexServiceClosedListener = SubscribableListener.nullSuccess();
415415
final IndexMetadata metadata = indicesService.verifyIndexIsDeleted(index, event.state());
416416
if (metadata != null) {
417417
indexSettings = new IndexSettings(metadata, settings);

test/framework/src/main/java/org/elasticsearch/indices/recovery/RecoveryClusterStateDelayListeners.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public SubscribableListener<Void> getClusterStateDelayListener(long clusterState
6464
refCounted.decRef();
6565
}
6666
} else {
67-
return SubscribableListener.newSucceeded(null);
67+
return SubscribableListener.nullSuccess();
6868
}
6969
}
7070

test/framework/src/main/java/org/elasticsearch/test/TestCluster.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,7 @@ private void deleteTemplates(Set<String> excludeTemplates, ActionListener<Void>
130130
SubscribableListener
131131

132132
// dummy start step for symmetry
133-
.newSucceeded(null)
134-
133+
.nullSuccess()
135134
// delete composable templates
136135
.<GetComposableIndexTemplateAction.Response>andThen(getComposableTemplates::addListener)
137136
.<AcknowledgedResponse>andThen((l, r) -> {

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/Operator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ default IsBlockedResult isBlocked() {
9292
return NOT_BLOCKED;
9393
}
9494

95-
IsBlockedResult NOT_BLOCKED = new IsBlockedResult(SubscribableListener.newSucceeded(null), "not blocked");
95+
IsBlockedResult NOT_BLOCKED = new IsBlockedResult(SubscribableListener.nullSuccess(), "not blocked");
9696

9797
/**
9898
* A factory for creating intermediate operators.

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/exchange/ExchangeService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ public void fetchPageAsync(boolean allSourcesFinished, ActionListener<ExchangeRe
357357
}
358358
doFetchPageAsync(false, ActionListener.wrap(r -> {
359359
if (r.finished()) {
360-
completionListenerRef.compareAndSet(null, SubscribableListener.newSucceeded(null));
360+
completionListenerRef.compareAndSet(null, SubscribableListener.nullSuccess());
361361
}
362362
listener.onResponse(r);
363363
}, e -> close(ActionListener.running(() -> listener.onFailure(e)))));

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/interceptor/BulkShardRequestInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,6 @@ public SubscribableListener<Void> intercept(
8181
}
8282
}
8383
}
84-
return SubscribableListener.newSucceeded(null);
84+
return SubscribableListener.nullSuccess();
8585
}
8686
}

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/interceptor/DlsFlsLicenseRequestInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,6 @@ public SubscribableListener<Void> intercept(
101101
}
102102
}
103103
}
104-
return SubscribableListener.newSucceeded(null);
104+
return SubscribableListener.nullSuccess();
105105
}
106106
}

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/interceptor/FieldAndDocumentLevelSecurityRequestInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ && supports(indicesRequest)
7777
return listener;
7878
}
7979
}
80-
return SubscribableListener.newSucceeded(null);
80+
return SubscribableListener.nullSuccess();
8181
}
8282

8383
abstract void disableFeatures(

0 commit comments

Comments
 (0)