
org.elasticsearch.cluster.service.FakeThreadPoolMasterService Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of framework Show documentation
Show all versions of framework Show documentation
Elasticsearch subproject :test:framework
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cluster.service;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.ClusterStatePublicationEvent;
import org.elasticsearch.cluster.coordination.ClusterStatePublisher.AckListener;
import org.elasticsearch.common.UUIDs;
import org.elasticsearch.common.settings.ClusterSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.util.concurrent.EsExecutors;
import org.elasticsearch.common.util.concurrent.StoppableExecutorServiceWrapper;
import org.elasticsearch.common.util.concurrent.ThreadContext;
import org.elasticsearch.node.Node;
import org.elasticsearch.tasks.TaskManager;
import org.elasticsearch.threadpool.ThreadPool;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.function.Consumer;
import static org.apache.lucene.tests.util.LuceneTestCase.random;
public class FakeThreadPoolMasterService extends MasterService {
private final Consumer taskExecutor;
private final ThreadContext threadContext;
public FakeThreadPoolMasterService(String nodeName, ThreadPool threadPool, Consumer taskExecutor) {
this(
Settings.builder().put(Node.NODE_NAME_SETTING.getKey(), nodeName).build(),
new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS),
threadPool,
taskExecutor
);
}
private FakeThreadPoolMasterService(
Settings settings,
ClusterSettings clusterSettings,
ThreadPool threadPool,
Consumer taskExecutor
) {
super(settings, clusterSettings, threadPool, new TaskManager(settings, threadPool, Set.of()));
this.taskExecutor = taskExecutor;
this.threadContext = threadPool.getThreadContext();
}
@Override
protected ExecutorService createThreadPoolExecutor() {
return new StoppableExecutorServiceWrapper(EsExecutors.DIRECT_EXECUTOR_SERVICE) {
@Override
public void execute(Runnable command) {
taskExecutor.accept(threadContext.preserveContext(command));
}
@Override
public String toString() {
return "FakeThreadPoolMasterService executor";
}
};
}
@Override
public ClusterState.Builder incrementVersion(ClusterState clusterState) {
// generate cluster UUID deterministically for repeatable tests
return ClusterState.builder(clusterState).incrementVersion().stateUUID(UUIDs.randomBase64UUID(random()));
}
@Override
protected void publish(
ClusterStatePublicationEvent clusterStatePublicationEvent,
AckListener ackListener,
ActionListener publicationListener
) {
// allow to fork the publication to add a little extra room for concurrent activity here
taskExecutor.accept(threadPool.getThreadContext().preserveContext(new Runnable() {
@Override
public void run() {
FakeThreadPoolMasterService.super.publish(clusterStatePublicationEvent, wrapAckListener(ackListener), publicationListener);
}
@Override
public String toString() {
return "publish change of cluster state from version ["
+ clusterStatePublicationEvent.getOldState().version()
+ "] in term ["
+ clusterStatePublicationEvent.getOldState().term()
+ "] to version ["
+ clusterStatePublicationEvent.getNewState().version()
+ "] in term ["
+ clusterStatePublicationEvent.getNewState().term()
+ "]";
}
}));
}
protected AckListener wrapAckListener(AckListener ackListener) {
return ackListener;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy