Detach BigArrays from Guice (#18973)
BigArrays can be fully constructed without Guice, this change cleans up it's creation and the mocking in MockNode.
This commit is contained in:
parent
9506f60504
commit
459665914b
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
package org.elasticsearch.client.transport;
|
package org.elasticsearch.client.transport;
|
||||||
|
|
||||||
|
import org.apache.lucene.util.IOUtils;
|
||||||
import org.elasticsearch.action.Action;
|
import org.elasticsearch.action.Action;
|
||||||
import org.elasticsearch.action.ActionListener;
|
import org.elasticsearch.action.ActionListener;
|
||||||
import org.elasticsearch.action.ActionModule;
|
import org.elasticsearch.action.ActionModule;
|
||||||
|
@ -41,7 +42,6 @@ import org.elasticsearch.common.settings.SettingsModule;
|
||||||
import org.elasticsearch.common.transport.TransportAddress;
|
import org.elasticsearch.common.transport.TransportAddress;
|
||||||
import org.elasticsearch.common.util.BigArrays;
|
import org.elasticsearch.common.util.BigArrays;
|
||||||
import org.elasticsearch.indices.breaker.CircuitBreakerService;
|
import org.elasticsearch.indices.breaker.CircuitBreakerService;
|
||||||
import org.elasticsearch.monitor.MonitorService;
|
|
||||||
import org.elasticsearch.node.Node;
|
import org.elasticsearch.node.Node;
|
||||||
import org.elasticsearch.node.internal.InternalSettingsPreparer;
|
import org.elasticsearch.node.internal.InternalSettingsPreparer;
|
||||||
import org.elasticsearch.plugins.Plugin;
|
import org.elasticsearch.plugins.Plugin;
|
||||||
|
@ -52,6 +52,7 @@ import org.elasticsearch.threadpool.ThreadPool;
|
||||||
import org.elasticsearch.transport.TransportService;
|
import org.elasticsearch.transport.TransportService;
|
||||||
import org.elasticsearch.transport.netty.NettyTransport;
|
import org.elasticsearch.transport.netty.NettyTransport;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -118,10 +119,11 @@ public class TransportClient extends AbstractClient {
|
||||||
public TransportClient build() {
|
public TransportClient build() {
|
||||||
final PluginsService pluginsService = newPluginService(providedSettings);
|
final PluginsService pluginsService = newPluginService(providedSettings);
|
||||||
final Settings settings = pluginsService.updatedSettings();
|
final Settings settings = pluginsService.updatedSettings();
|
||||||
|
final List<Closeable> resourcesToClose = new ArrayList<>();
|
||||||
final ThreadPool threadPool = new ThreadPool(settings);
|
final ThreadPool threadPool = new ThreadPool(settings);
|
||||||
|
resourcesToClose.add(() -> ThreadPool.terminate(threadPool, 10, TimeUnit.SECONDS));
|
||||||
final NetworkService networkService = new NetworkService(settings);
|
final NetworkService networkService = new NetworkService(settings);
|
||||||
NamedWriteableRegistry namedWriteableRegistry = new NamedWriteableRegistry();
|
NamedWriteableRegistry namedWriteableRegistry = new NamedWriteableRegistry();
|
||||||
boolean success = false;
|
|
||||||
try {
|
try {
|
||||||
ModulesBuilder modules = new ModulesBuilder();
|
ModulesBuilder modules = new ModulesBuilder();
|
||||||
// plugin modules must be added here, before others or we can get crazy injection errors...
|
// plugin modules must be added here, before others or we can get crazy injection errors...
|
||||||
|
@ -149,8 +151,12 @@ public class TransportClient extends AbstractClient {
|
||||||
SettingsModule settingsModule = new SettingsModule(settings, additionalSettings, additionalSettingsFilter);
|
SettingsModule settingsModule = new SettingsModule(settings, additionalSettings, additionalSettingsFilter);
|
||||||
CircuitBreakerService circuitBreakerService = Node.createCircuitBreakerService(settingsModule.getSettings(),
|
CircuitBreakerService circuitBreakerService = Node.createCircuitBreakerService(settingsModule.getSettings(),
|
||||||
settingsModule.getClusterSettings());
|
settingsModule.getClusterSettings());
|
||||||
|
resourcesToClose.add(circuitBreakerService);
|
||||||
|
BigArrays bigArrays = new BigArrays(settings, circuitBreakerService);
|
||||||
|
resourcesToClose.add(bigArrays);
|
||||||
modules.add(settingsModule);
|
modules.add(settingsModule);
|
||||||
modules.add((b -> {
|
modules.add((b -> {
|
||||||
|
b.bind(BigArrays.class).toInstance(bigArrays);
|
||||||
b.bind(PluginsService.class).toInstance(pluginsService);
|
b.bind(PluginsService.class).toInstance(pluginsService);
|
||||||
b.bind(CircuitBreakerService.class).toInstance(circuitBreakerService);
|
b.bind(CircuitBreakerService.class).toInstance(circuitBreakerService);
|
||||||
}));
|
}));
|
||||||
|
@ -159,14 +165,11 @@ public class TransportClient extends AbstractClient {
|
||||||
final TransportService transportService = injector.getInstance(TransportService.class);
|
final TransportService transportService = injector.getInstance(TransportService.class);
|
||||||
transportService.start();
|
transportService.start();
|
||||||
transportService.acceptIncomingRequests();
|
transportService.acceptIncomingRequests();
|
||||||
|
|
||||||
TransportClient transportClient = new TransportClient(injector);
|
TransportClient transportClient = new TransportClient(injector);
|
||||||
success = true;
|
resourcesToClose.clear();
|
||||||
return transportClient;
|
return transportClient;
|
||||||
} finally {
|
} finally {
|
||||||
if (!success) {
|
IOUtils.closeWhileHandlingException(resourcesToClose);
|
||||||
ThreadPool.terminate(threadPool, 10, TimeUnit.SECONDS);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -261,24 +264,16 @@ public class TransportClient extends AbstractClient {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
injector.getInstance(TransportClientNodesService.class).close();
|
List<Closeable> closeables = new ArrayList<>();
|
||||||
injector.getInstance(TransportService.class).close();
|
closeables.add(injector.getInstance(TransportClientNodesService.class));
|
||||||
try {
|
closeables.add(injector.getInstance(TransportService.class));
|
||||||
injector.getInstance(MonitorService.class).close();
|
|
||||||
} catch (Exception e) {
|
|
||||||
// ignore, might not be bounded
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Class<? extends LifecycleComponent> plugin : injector.getInstance(PluginsService.class).nodeServices()) {
|
for (Class<? extends LifecycleComponent> plugin : injector.getInstance(PluginsService.class).nodeServices()) {
|
||||||
injector.getInstance(plugin).close();
|
closeables.add(injector.getInstance(plugin));
|
||||||
}
|
}
|
||||||
try {
|
closeables.add(() -> ThreadPool.terminate(injector.getInstance(ThreadPool.class), 10, TimeUnit.SECONDS));
|
||||||
ThreadPool.terminate(injector.getInstance(ThreadPool.class), 10, TimeUnit.SECONDS);
|
closeables.add(injector.getInstance(BigArrays.class));
|
||||||
} catch (Exception e) {
|
IOUtils.closeWhileHandlingException(closeables);
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
|
|
||||||
injector.getInstance(BigArrays.class).close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -48,6 +48,7 @@ import org.elasticsearch.transport.TransportException;
|
||||||
import org.elasticsearch.transport.TransportRequestOptions;
|
import org.elasticsearch.transport.TransportRequestOptions;
|
||||||
import org.elasticsearch.transport.TransportService;
|
import org.elasticsearch.transport.TransportService;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
@ -66,7 +67,7 @@ import static org.elasticsearch.common.unit.TimeValue.timeValueSeconds;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class TransportClientNodesService extends AbstractComponent {
|
public class TransportClientNodesService extends AbstractComponent implements Closeable {
|
||||||
|
|
||||||
private final TimeValue nodesSamplerInterval;
|
private final TimeValue nodesSamplerInterval;
|
||||||
|
|
||||||
|
|
|
@ -373,12 +373,11 @@ public class BigArrays implements Releasable {
|
||||||
final boolean checkBreaker;
|
final boolean checkBreaker;
|
||||||
private final BigArrays circuitBreakingInstance;
|
private final BigArrays circuitBreakingInstance;
|
||||||
|
|
||||||
@Inject
|
|
||||||
public BigArrays(Settings settings, @Nullable final CircuitBreakerService breakerService) {
|
public BigArrays(Settings settings, @Nullable final CircuitBreakerService breakerService) {
|
||||||
// Checking the breaker is disabled if not specified
|
// Checking the breaker is disabled if not specified
|
||||||
this(new PageCacheRecycler(settings), breakerService, false);
|
this(new PageCacheRecycler(settings), breakerService, false);
|
||||||
}
|
}
|
||||||
|
// public for tests
|
||||||
public BigArrays(PageCacheRecycler recycler, @Nullable final CircuitBreakerService breakerService, boolean checkBreaker) {
|
public BigArrays(PageCacheRecycler recycler, @Nullable final CircuitBreakerService breakerService, boolean checkBreaker) {
|
||||||
this.checkBreaker = checkBreaker;
|
this.checkBreaker = checkBreaker;
|
||||||
this.recycler = recycler;
|
this.recycler = recycler;
|
||||||
|
|
|
@ -32,12 +32,9 @@ import org.elasticsearch.ElasticsearchException;
|
||||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||||
import org.elasticsearch.common.SuppressForbidden;
|
import org.elasticsearch.common.SuppressForbidden;
|
||||||
import org.elasticsearch.common.UUIDs;
|
|
||||||
import org.elasticsearch.common.component.AbstractComponent;
|
import org.elasticsearch.common.component.AbstractComponent;
|
||||||
import org.elasticsearch.common.inject.Inject;
|
|
||||||
import org.elasticsearch.common.io.FileSystemUtils;
|
import org.elasticsearch.common.io.FileSystemUtils;
|
||||||
import org.elasticsearch.common.logging.DeprecationLogger;
|
import org.elasticsearch.common.logging.DeprecationLogger;
|
||||||
import org.elasticsearch.common.logging.ESLogger;
|
|
||||||
import org.elasticsearch.common.settings.Setting;
|
import org.elasticsearch.common.settings.Setting;
|
||||||
import org.elasticsearch.common.settings.Setting.Property;
|
import org.elasticsearch.common.settings.Setting.Property;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
@ -66,7 +63,6 @@ import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -167,7 +163,6 @@ public final class NodeEnvironment extends AbstractComponent implements Closeabl
|
||||||
public static final String NODE_LOCK_FILENAME = "node.lock";
|
public static final String NODE_LOCK_FILENAME = "node.lock";
|
||||||
public static final String UPGRADE_LOCK_FILENAME = "upgrade.lock";
|
public static final String UPGRADE_LOCK_FILENAME = "upgrade.lock";
|
||||||
|
|
||||||
@Inject
|
|
||||||
public NodeEnvironment(Settings settings, Environment environment) throws IOException {
|
public NodeEnvironment(Settings settings, Environment environment) throws IOException {
|
||||||
super(settings);
|
super(settings);
|
||||||
|
|
||||||
|
|
|
@ -266,6 +266,8 @@ public class Node implements Closeable {
|
||||||
CircuitBreakerService circuitBreakerService = createCircuitBreakerService(settingsModule.getSettings(),
|
CircuitBreakerService circuitBreakerService = createCircuitBreakerService(settingsModule.getSettings(),
|
||||||
settingsModule.getClusterSettings());
|
settingsModule.getClusterSettings());
|
||||||
resourcesToClose.add(circuitBreakerService);
|
resourcesToClose.add(circuitBreakerService);
|
||||||
|
BigArrays bigArrays = createBigArrays(settings, circuitBreakerService);
|
||||||
|
resourcesToClose.add(bigArrays);
|
||||||
modules.add(settingsModule);
|
modules.add(settingsModule);
|
||||||
modules.add(b -> {
|
modules.add(b -> {
|
||||||
b.bind(PluginsService.class).toInstance(pluginsService);
|
b.bind(PluginsService.class).toInstance(pluginsService);
|
||||||
|
@ -276,6 +278,7 @@ public class Node implements Closeable {
|
||||||
b.bind(TribeService.class).toInstance(tribeService);
|
b.bind(TribeService.class).toInstance(tribeService);
|
||||||
b.bind(ResourceWatcherService.class).toInstance(resourceWatcherService);
|
b.bind(ResourceWatcherService.class).toInstance(resourceWatcherService);
|
||||||
b.bind(CircuitBreakerService.class).toInstance(circuitBreakerService);
|
b.bind(CircuitBreakerService.class).toInstance(circuitBreakerService);
|
||||||
|
b.bind(BigArrays.class).toInstance(bigArrays);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
injector = modules.createInjector();
|
injector = modules.createInjector();
|
||||||
|
@ -626,4 +629,12 @@ public class Node implements Closeable {
|
||||||
throw new IllegalArgumentException("Unknown circuit breaker type [" + type + "]");
|
throw new IllegalArgumentException("Unknown circuit breaker type [" + type + "]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link BigArrays} instance used for this node.
|
||||||
|
* This method can be overwritten by subclasses to change their {@link BigArrays} implementation for instance for testing
|
||||||
|
*/
|
||||||
|
BigArrays createBigArrays(Settings settings, CircuitBreakerService circuitBreakerService) {
|
||||||
|
return new BigArrays(settings, circuitBreakerService);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,9 +37,6 @@ public class NodeModule extends AbstractModule {
|
||||||
private final MonitorService monitorService;
|
private final MonitorService monitorService;
|
||||||
private final ProcessorsRegistry.Builder processorsRegistryBuilder;
|
private final ProcessorsRegistry.Builder processorsRegistryBuilder;
|
||||||
|
|
||||||
// pkg private so tests can mock
|
|
||||||
Class<? extends BigArrays> bigArraysImpl = BigArrays.class;
|
|
||||||
|
|
||||||
public NodeModule(Node node, MonitorService monitorService) {
|
public NodeModule(Node node, MonitorService monitorService) {
|
||||||
this.node = node;
|
this.node = node;
|
||||||
this.monitorService = monitorService;
|
this.monitorService = monitorService;
|
||||||
|
@ -48,12 +45,6 @@ public class NodeModule extends AbstractModule {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
if (bigArraysImpl == BigArrays.class) {
|
|
||||||
bind(BigArrays.class).asEagerSingleton();
|
|
||||||
} else {
|
|
||||||
bind(BigArrays.class).to(bigArraysImpl).asEagerSingleton();
|
|
||||||
}
|
|
||||||
|
|
||||||
bind(Node.class).toInstance(node);
|
bind(Node.class).toInstance(node);
|
||||||
bind(MonitorService.class).toInstance(monitorService);
|
bind(MonitorService.class).toInstance(monitorService);
|
||||||
bind(NodeService.class).asEagerSingleton();
|
bind(NodeService.class).asEagerSingleton();
|
||||||
|
|
|
@ -74,7 +74,6 @@ public class MockBigArrays extends BigArrays {
|
||||||
private final PageCacheRecycler recycler;
|
private final PageCacheRecycler recycler;
|
||||||
private final CircuitBreakerService breakerService;
|
private final CircuitBreakerService breakerService;
|
||||||
|
|
||||||
@Inject
|
|
||||||
public MockBigArrays(Settings settings, CircuitBreakerService breakerService) {
|
public MockBigArrays(Settings settings, CircuitBreakerService breakerService) {
|
||||||
this(new MockPageCacheRecycler(settings), breakerService, false);
|
this(new MockPageCacheRecycler(settings), breakerService, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,10 @@
|
||||||
|
|
||||||
package org.elasticsearch.node;
|
package org.elasticsearch.node;
|
||||||
|
|
||||||
import org.elasticsearch.Version;
|
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.common.util.BigArrays;
|
||||||
|
import org.elasticsearch.common.util.MockBigArrays;
|
||||||
|
import org.elasticsearch.indices.breaker.CircuitBreakerService;
|
||||||
import org.elasticsearch.node.internal.InternalSettingsPreparer;
|
import org.elasticsearch.node.internal.InternalSettingsPreparer;
|
||||||
import org.elasticsearch.plugins.Plugin;
|
import org.elasticsearch.plugins.Plugin;
|
||||||
|
|
||||||
|
@ -35,15 +37,25 @@ import java.util.Collection;
|
||||||
*/
|
*/
|
||||||
public class MockNode extends Node {
|
public class MockNode extends Node {
|
||||||
|
|
||||||
|
private final boolean mockBigArrays;
|
||||||
private Collection<Class<? extends Plugin>> plugins;
|
private Collection<Class<? extends Plugin>> plugins;
|
||||||
|
|
||||||
public MockNode(Settings settings, Collection<Class<? extends Plugin>> classpathPlugins) {
|
public MockNode(Settings settings, Collection<Class<? extends Plugin>> classpathPlugins) {
|
||||||
super(InternalSettingsPreparer.prepareEnvironment(settings, null), classpathPlugins);
|
super(InternalSettingsPreparer.prepareEnvironment(settings, null), classpathPlugins);
|
||||||
this.plugins = classpathPlugins;
|
this.plugins = classpathPlugins;
|
||||||
|
this.mockBigArrays = classpathPlugins.contains(NodeMocksPlugin.class); // if this plugin is present we mock bigarrays :)
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<Class<? extends Plugin>> getPlugins() {
|
public Collection<Class<? extends Plugin>> getPlugins() {
|
||||||
return plugins;
|
return plugins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected BigArrays createBigArrays(Settings settings, CircuitBreakerService circuitBreakerService) {
|
||||||
|
if (mockBigArrays) {
|
||||||
|
return new MockBigArrays(settings, circuitBreakerService);
|
||||||
|
} else {
|
||||||
|
return super.createBigArrays(settings, circuitBreakerService);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,12 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.elasticsearch.node;
|
package org.elasticsearch.node;
|
||||||
|
|
||||||
import org.elasticsearch.common.util.MockBigArrays;
|
|
||||||
import org.elasticsearch.plugins.Plugin;
|
import org.elasticsearch.plugins.Plugin;
|
||||||
|
|
||||||
public class NodeMocksPlugin extends Plugin {
|
public class NodeMocksPlugin extends Plugin { // just a marker plugin for MockNode to mock out BigArrays
|
||||||
|
|
||||||
public void onModule(NodeModule module) {
|
|
||||||
module.bigArraysImpl = MockBigArrays.class;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -902,9 +902,12 @@ public final class InternalTestCluster extends TestCluster {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
resetClient();
|
try {
|
||||||
closed.set(true);
|
resetClient();
|
||||||
closeNode();
|
} finally {
|
||||||
|
closed.set(true);
|
||||||
|
closeNode();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,18 +19,10 @@
|
||||||
package org.elasticsearch.test;
|
package org.elasticsearch.test;
|
||||||
|
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.index.MockEngineFactoryPlugin;
|
|
||||||
import org.elasticsearch.node.NodeMocksPlugin;
|
|
||||||
import org.elasticsearch.plugins.Plugin;
|
import org.elasticsearch.plugins.Plugin;
|
||||||
import org.elasticsearch.search.MockSearchService;
|
|
||||||
import org.elasticsearch.test.store.MockFSIndexStore;
|
|
||||||
import org.elasticsearch.test.transport.AssertingLocalTransport;
|
|
||||||
import org.elasticsearch.test.transport.MockTransportService;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public abstract class NodeConfigurationSource {
|
public abstract class NodeConfigurationSource {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue