You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vk...@apache.org on 2015/02/02 04:27:56 UTC
[04/52] [abbrv] incubator-ignite git commit: GridNamedInstance ->
IgniteNamedInstance GridgainEx -> IgnitionEx
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c5247ab3/modules/core/src/main/java/org/apache/ignite/internal/GridGainEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridGainEx.java b/modules/core/src/main/java/org/apache/ignite/internal/GridGainEx.java
deleted file mode 100644
index 65c2776..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridGainEx.java
+++ /dev/null
@@ -1,2399 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal;
-
-import org.apache.ignite.*;
-import org.apache.ignite.cache.*;
-import org.apache.ignite.cache.affinity.rendezvous.*;
-import org.apache.ignite.configuration.*;
-import org.apache.ignite.fs.*;
-import org.apache.ignite.internal.util.*;
-import org.apache.ignite.lang.*;
-import org.apache.ignite.lifecycle.*;
-import org.apache.ignite.logger.*;
-import org.apache.ignite.logger.java.*;
-import org.apache.ignite.marshaller.*;
-import org.apache.ignite.marshaller.jdk.*;
-import org.apache.ignite.marshaller.optimized.*;
-import org.apache.ignite.mxbean.*;
-import org.apache.ignite.spi.*;
-import org.apache.ignite.spi.authentication.*;
-import org.apache.ignite.spi.authentication.noop.*;
-import org.apache.ignite.spi.indexing.*;
-import org.apache.ignite.streamer.*;
-import org.apache.ignite.thread.*;
-import org.apache.ignite.internal.processors.resource.*;
-import org.apache.ignite.internal.processors.spring.*;
-import org.apache.ignite.plugin.segmentation.*;
-import org.apache.ignite.spi.checkpoint.*;
-import org.apache.ignite.spi.checkpoint.noop.*;
-import org.apache.ignite.spi.collision.*;
-import org.apache.ignite.spi.collision.noop.*;
-import org.apache.ignite.spi.communication.*;
-import org.apache.ignite.spi.communication.tcp.*;
-import org.apache.ignite.spi.deployment.*;
-import org.apache.ignite.spi.deployment.local.*;
-import org.apache.ignite.spi.discovery.*;
-import org.apache.ignite.spi.discovery.tcp.*;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.*;
-import org.apache.ignite.spi.eventstorage.*;
-import org.apache.ignite.spi.eventstorage.memory.*;
-import org.apache.ignite.spi.failover.*;
-import org.apache.ignite.spi.failover.always.*;
-import org.apache.ignite.spi.loadbalancing.*;
-import org.apache.ignite.spi.loadbalancing.roundrobin.*;
-import org.apache.ignite.spi.securesession.*;
-import org.apache.ignite.spi.securesession.noop.*;
-import org.apache.ignite.spi.swapspace.*;
-import org.apache.ignite.spi.swapspace.file.*;
-import org.apache.ignite.spi.swapspace.noop.*;
-import org.apache.ignite.internal.util.typedef.*;
-import org.apache.ignite.internal.util.typedef.internal.*;
-import org.jdk8.backport.*;
-import org.jetbrains.annotations.*;
-
-import javax.management.*;
-import java.io.*;
-import java.lang.management.*;
-import java.lang.reflect.*;
-import java.net.*;
-import java.util.*;
-import java.util.Map.*;
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.*;
-import java.util.logging.*;
-
-import static org.apache.ignite.configuration.IgniteConfiguration.*;
-import static org.apache.ignite.IgniteState.*;
-import static org.apache.ignite.IgniteSystemProperties.*;
-import static org.apache.ignite.cache.CacheAtomicityMode.*;
-import static org.apache.ignite.cache.CacheDistributionMode.*;
-import static org.apache.ignite.cache.CacheMode.*;
-import static org.apache.ignite.cache.CachePreloadMode.*;
-import static org.apache.ignite.cache.CacheWriteSynchronizationMode.*;
-import static org.apache.ignite.internal.IgniteComponentType.*;
-import static org.apache.ignite.plugin.segmentation.GridSegmentationPolicy.*;
-
-/**
- * This class defines a factory for the main GridGain API. It controls Grid life cycle
- * and allows listening for grid events.
- * <h1 class="header">Grid Loaders</h1>
- * Although user can apply grid factory directly to start and stop grid, grid is
- * often started and stopped by grid loaders. Grid loaders can be found in
- * {@link org.apache.ignite.startup} package, for example:
- * <ul>
- * <li>{@code GridCommandLineStartup}</li>
- * <li>{@code GridServletStartup}</li>
- * </ul>
- * <h1 class="header">Examples</h1>
- * Use {@link #start()} method to start grid with default configuration. You can also use
- * {@link org.apache.ignite.configuration.IgniteConfiguration} to override some default configuration. Below is an
- * example on how to start grid with <strong>URI deployment</strong>.
- * <pre name="code" class="java">
- * GridConfiguration cfg = new GridConfiguration();
- */
-public class GridGainEx {
- /** Default configuration path relative to GridGain home. */
- public static final String DFLT_CFG = "config/default-config.xml";
-
- /** Map of named grids. */
- private static final ConcurrentMap<Object, GridNamedInstance> grids = new ConcurrentHashMap8<>();
-
- /** Map of grid states ever started in this JVM. */
- private static final Map<Object, IgniteState> gridStates = new ConcurrentHashMap8<>();
-
- /** Mutex to synchronize updates of default grid reference. */
- private static final Object dfltGridMux = new Object();
-
- /** Default grid. */
- private static volatile GridNamedInstance dfltGrid;
-
- /** Default grid state. */
- private static volatile IgniteState dfltGridState;
-
- /** List of state listeners. */
- private static final Collection<IgniteListener> lsnrs = new GridConcurrentHashSet<>(4);
-
- /** */
- private static volatile boolean daemon;
-
- /**
- * Checks runtime version to be 1.7.x or 1.8.x.
- * This will load pretty much first so we must do these checks here.
- */
- static {
- // Check 1.8 just in case for forward compatibility.
- if (!U.jdkVersion().contains("1.7") &&
- !U.jdkVersion().contains("1.8"))
- throw new IllegalStateException("GridGain requires Java 7 or above. Current Java version " +
- "is not supported: " + U.jdkVersion());
-
- // To avoid nasty race condition in UUID.randomUUID() in JDK prior to 6u34.
- // For details please see:
- // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7071826
- // http://www.oracle.com/technetwork/java/javase/2col/6u34-bugfixes-1733379.html
- // http://hg.openjdk.java.net/jdk6/jdk6/jdk/rev/563d392b3e5c
- UUID.randomUUID();
- }
-
- /**
- * Enforces singleton.
- */
- private GridGainEx() {
- // No-op.
- }
-
- /**
- * Sets daemon flag.
- * <p>
- * If daemon flag is set then all grid instances created by the factory will be
- * daemon, i.e. the local node for these instances will be a daemon node. Note that
- * if daemon flag is set - it will override the same settings in {@link org.apache.ignite.configuration.IgniteConfiguration#isDaemon()}.
- * Note that you can set on and off daemon flag at will.
- *
- * @param daemon Daemon flag to set.
- */
- public static void setDaemon(boolean daemon) {
- GridGainEx.daemon = daemon;
- }
-
- /**
- * Gets daemon flag.
- * <p>
- * If daemon flag it set then all grid instances created by the factory will be
- * daemon, i.e. the local node for these instances will be a daemon node. Note that
- * if daemon flag is set - it will override the same settings in {@link org.apache.ignite.configuration.IgniteConfiguration#isDaemon()}.
- * Note that you can set on and off daemon flag at will.
- *
- * @return Daemon flag.
- */
- public static boolean isDaemon() {
- return daemon;
- }
-
- /**
- * Gets state of grid default grid.
- *
- * @return Default grid state.
- */
- public static IgniteState state() {
- return state(null);
- }
-
- /**
- * Gets states of named grid. If name is {@code null}, then state of
- * default no-name grid is returned.
- *
- * @param name Grid name. If name is {@code null}, then state of
- * default no-name grid is returned.
- * @return Grid state.
- */
- public static IgniteState state(@Nullable String name) {
- GridNamedInstance grid = name != null ? grids.get(name) : dfltGrid;
-
- if (grid == null) {
- IgniteState state = name != null ? gridStates.get(name) : dfltGridState;
-
- return state != null ? state : STOPPED;
- }
-
- return grid.state();
- }
-
- /**
- * Stops default grid. This method is identical to {@code G.stop(null, cancel)} apply.
- * Note that method does not wait for all tasks to be completed.
- *
- * @param cancel If {@code true} then all jobs currently executing on
- * default grid will be cancelled by calling {@link org.apache.ignite.compute.ComputeJob#cancel()}
- * method. Note that just like with {@link Thread#interrupt()}, it is
- * up to the actual job to exit from execution
- * @return {@code true} if default grid instance was indeed stopped,
- * {@code false} otherwise (if it was not started).
- */
- public static boolean stop(boolean cancel) {
- return stop(null, cancel);
- }
-
- /**
- * Stops named grid. If {@code cancel} flag is set to {@code true} then
- * all jobs currently executing on local node will be interrupted. If
- * grid name is {@code null}, then default no-name grid will be stopped.
- * If wait parameter is set to {@code true} then grid will wait for all
- * tasks to be finished.
- *
- * @param name Grid name. If {@code null}, then default no-name grid will
- * be stopped.
- * @param cancel If {@code true} then all jobs currently will be cancelled
- * by calling {@link org.apache.ignite.compute.ComputeJob#cancel()} method. Note that just like with
- * {@link Thread#interrupt()}, it is up to the actual job to exit from
- * execution. If {@code false}, then jobs currently running will not be
- * canceled. In either case, grid node will wait for completion of all
- * jobs running on it before stopping.
- * @return {@code true} if named grid instance was indeed found and stopped,
- * {@code false} otherwise (the instance with given {@code name} was
- * not found).
- */
- public static boolean stop(@Nullable String name, boolean cancel) {
- GridNamedInstance grid = name != null ? grids.get(name) : dfltGrid;
-
- if (grid != null && grid.state() == STARTED) {
- grid.stop(cancel);
-
- boolean fireEvt;
-
- if (name != null)
- fireEvt = grids.remove(name, grid);
- else {
- synchronized (dfltGridMux) {
- fireEvt = dfltGrid == grid;
-
- if (fireEvt)
- dfltGrid = null;
- }
- }
-
- if (fireEvt)
- notifyStateChange(grid.getName(), grid.state());
-
- return true;
- }
-
- // We don't have log at this point...
- U.warn(null, "Ignoring stopping grid instance that was already stopped or never started: " + name);
-
- return false;
- }
-
- /**
- * Stops <b>all</b> started grids. If {@code cancel} flag is set to {@code true} then
- * all jobs currently executing on local node will be interrupted.
- * If wait parameter is set to {@code true} then grid will wait for all
- * tasks to be finished.
- * <p>
- * <b>Note:</b> it is usually safer and more appropriate to stop grid instances individually
- * instead of blanket operation. In most cases, the party that started the grid instance
- * should be responsible for stopping it.
- *
- * @param cancel If {@code true} then all jobs currently executing on
- * all grids will be cancelled by calling {@link org.apache.ignite.compute.ComputeJob#cancel()}
- * method. Note that just like with {@link Thread#interrupt()}, it is
- * up to the actual job to exit from execution
- */
- public static void stopAll(boolean cancel) {
- GridNamedInstance dfltGrid0 = dfltGrid;
-
- if (dfltGrid0 != null) {
- dfltGrid0.stop(cancel);
-
- boolean fireEvt;
-
- synchronized (dfltGridMux) {
- fireEvt = dfltGrid == dfltGrid0;
-
- if (fireEvt)
- dfltGrid = null;
- }
-
- if (fireEvt)
- notifyStateChange(dfltGrid0.getName(), dfltGrid0.state());
- }
-
- // Stop the rest and clear grids map.
- for (GridNamedInstance grid : grids.values()) {
- grid.stop(cancel);
-
- boolean fireEvt = grids.remove(grid.getName(), grid);
-
- if (fireEvt)
- notifyStateChange(grid.getName(), grid.state());
- }
- }
-
- /**
- * Restarts <b>all</b> started grids. If {@code cancel} flag is set to {@code true} then
- * all jobs currently executing on the local node will be interrupted.
- * If {@code wait} parameter is set to {@code true} then grid will wait for all
- * tasks to be finished.
- * <p>
- * <b>Note:</b> it is usually safer and more appropriate to stop grid instances individually
- * instead of blanket operation. In most cases, the party that started the grid instance
- * should be responsible for stopping it.
- * <p>
- * Note also that restarting functionality only works with the tools that specifically
- * support GridGain's protocol for restarting. Currently only standard <tt>ggstart.{sh|bat}</tt>
- * scripts support restarting of JVM GridGain's process.
- *
- * @param cancel If {@code true} then all jobs currently executing on
- * all grids will be cancelled by calling {@link org.apache.ignite.compute.ComputeJob#cancel()}
- * method. Note that just like with {@link Thread#interrupt()}, it is
- * up to the actual job to exit from execution.
- * @see org.apache.ignite.Ignition#RESTART_EXIT_CODE
- */
- public static void restart(boolean cancel) {
- String file = System.getProperty(GG_SUCCESS_FILE);
-
- if (file == null)
- U.warn(null, "Cannot restart node when restart not enabled.");
- else {
- try {
- new File(file).createNewFile();
- }
- catch (IOException e) {
- U.error(null, "Failed to create restart marker file (restart aborted): " + e.getMessage());
-
- return;
- }
-
- U.log(null, "Restarting node. Will exit (" + Ignition.RESTART_EXIT_CODE + ").");
-
- // Set the exit code so that shell process can recognize it and loop
- // the start up sequence again.
- System.setProperty(GG_RESTART_CODE, Integer.toString(Ignition.RESTART_EXIT_CODE));
-
- stopAll(cancel);
-
- // This basically leaves loaders hang - we accept it.
- System.exit(Ignition.RESTART_EXIT_CODE);
- }
- }
-
- /**
- * Stops <b>all</b> started grids. If {@code cancel} flag is set to {@code true} then
- * all jobs currently executing on the local node will be interrupted.
- * If {@code wait} parameter is set to {@code true} then grid will wait for all
- * tasks to be finished.
- * <p>
- * <b>Note:</b> it is usually safer and more appropriate to stop grid instances individually
- * instead of blanket operation. In most cases, the party that started the grid instance
- * should be responsible for stopping it.
- * <p>
- * Note that upon completion of this method, the JVM with forcefully exist with
- * exit code {@link org.apache.ignite.Ignition#KILL_EXIT_CODE}.
- *
- * @param cancel If {@code true} then all jobs currently executing on
- * all grids will be cancelled by calling {@link org.apache.ignite.compute.ComputeJob#cancel()}
- * method. Note that just like with {@link Thread#interrupt()}, it is
- * up to the actual job to exit from execution.
- * @see org.apache.ignite.Ignition#KILL_EXIT_CODE
- */
- public static void kill(boolean cancel) {
- stopAll(cancel);
-
- // This basically leaves loaders hang - we accept it.
- System.exit(Ignition.KILL_EXIT_CODE);
- }
-
- /**
- * Starts grid with default configuration. By default this method will
- * use grid configuration defined in {@code GRIDGAIN_HOME/config/default-config.xml}
- * configuration file. If such file is not found, then all system defaults will be used.
- *
- * @return Started grid.
- * @throws IgniteCheckedException If default grid could not be started. This exception will be thrown
- * also if default grid has already been started.
- */
- public static Ignite start() throws IgniteCheckedException {
- return start((GridSpringResourceContext)null);
- }
-
- /**
- * Starts grid with default configuration. By default this method will
- * use grid configuration defined in {@code GRIDGAIN_HOME/config/default-config.xml}
- * configuration file. If such file is not found, then all system defaults will be used.
- *
- * @param springCtx Optional Spring application context, possibly {@code null}.
- * Spring bean definitions for bean injection are taken from this context.
- * If provided, this context can be injected into grid tasks and grid jobs using
- * {@link org.apache.ignite.resources.IgniteSpringApplicationContextResource @IgniteSpringApplicationContextResource} annotation.
- * @return Started grid.
- * @throws IgniteCheckedException If default grid could not be started. This exception will be thrown
- * also if default grid has already been started.
- */
- public static Ignite start(@Nullable GridSpringResourceContext springCtx) throws IgniteCheckedException {
- URL url = U.resolveGridGainUrl(DFLT_CFG);
-
- if (url != null)
- return start(DFLT_CFG, null, springCtx);
-
- U.warn(null, "Default Spring XML file not found (is GRIDGAIN_HOME set?): " + DFLT_CFG);
-
- return start0(new GridStartContext(new IgniteConfiguration(), null, springCtx)).grid();
- }
-
- /**
- * Starts grid with given configuration. Note that this method is no-op if grid with the name
- * provided in given configuration is already started.
- *
- * @param cfg Grid configuration. This cannot be {@code null}.
- * @return Started grid.
- * @throws IgniteCheckedException If grid could not be started. This exception will be thrown
- * also if named grid has already been started.
- */
- public static Ignite start(IgniteConfiguration cfg) throws IgniteCheckedException {
- return start(cfg, null);
- }
-
- /**
- * Starts grid with given configuration. Note that this method is no-op if grid with the name
- * provided in given configuration is already started.
- *
- * @param cfg Grid configuration. This cannot be {@code null}.
- * @param springCtx Optional Spring application context, possibly {@code null}.
- * Spring bean definitions for bean injection are taken from this context.
- * If provided, this context can be injected into grid tasks and grid jobs using
- * {@link org.apache.ignite.resources.IgniteSpringApplicationContextResource @IgniteSpringApplicationContextResource} annotation.
- * @return Started grid.
- * @throws IgniteCheckedException If grid could not be started. This exception will be thrown
- * also if named grid has already been started.
- */
- public static Ignite start(IgniteConfiguration cfg, @Nullable GridSpringResourceContext springCtx) throws IgniteCheckedException {
- A.notNull(cfg, "cfg");
-
- return start0(new GridStartContext(cfg, null, springCtx)).grid();
- }
-
- /**
- * Starts all grids specified within given Spring XML configuration file. If grid with given name
- * is already started, then exception is thrown. In this case all instances that may
- * have been started so far will be stopped too.
- * <p>
- * Usually Spring XML configuration file will contain only one Grid definition. Note that
- * Grid configuration bean(s) is retrieved form configuration file by type, so the name of
- * the Grid configuration bean is ignored.
- *
- * @param springCfgPath Spring XML configuration file path or URL.
- * @return Started grid. If Spring configuration contains multiple grid instances,
- * then the 1st found instance is returned.
- * @throws IgniteCheckedException If grid could not be started or configuration
- * read. This exception will be thrown also if grid with given name has already
- * been started or Spring XML configuration file is invalid.
- */
- public static Ignite start(@Nullable String springCfgPath) throws IgniteCheckedException {
- return springCfgPath == null ? start() : start(springCfgPath, null);
- }
-
- /**
- * Starts all grids specified within given Spring XML configuration file. If grid with given name
- * is already started, then exception is thrown. In this case all instances that may
- * have been started so far will be stopped too.
- * <p>
- * Usually Spring XML configuration file will contain only one Grid definition. Note that
- * Grid configuration bean(s) is retrieved form configuration file by type, so the name of
- * the Grid configuration bean is ignored.
- *
- * @param springCfgPath Spring XML configuration file path or URL.
- * @param gridName Grid name that will override default.
- * @return Started grid. If Spring configuration contains multiple grid instances,
- * then the 1st found instance is returned.
- * @throws IgniteCheckedException If grid could not be started or configuration
- * read. This exception will be thrown also if grid with given name has already
- * been started or Spring XML configuration file is invalid.
- */
- public static Ignite start(@Nullable String springCfgPath, @Nullable String gridName) throws IgniteCheckedException {
- if (springCfgPath == null) {
- IgniteConfiguration cfg = new IgniteConfiguration();
-
- if (cfg.getGridName() == null && !F.isEmpty(gridName))
- cfg.setGridName(gridName);
-
- return start(cfg);
- }
- else
- return start(springCfgPath, gridName, null);
- }
-
- /**
- * Start Grid for interop scenario.
- *
- * @param springCfgPath Spring config path.
- * @param gridName Grid name.
- * @param cfgClo Configuration closure.
- * @return Started Grid.
- * @throws IgniteCheckedException If failed.
- */
- public static Ignite startInterop(@Nullable String springCfgPath, @Nullable String gridName,
- IgniteClosure<IgniteConfiguration, IgniteConfiguration> cfgClo) throws IgniteCheckedException {
- URL url = resolveSpringUrl(springCfgPath);
-
- return start(url, gridName, null, cfgClo);
- }
-
- /**
- * Loads all grid configurations specified within given Spring XML configuration file.
- * <p>
- * Usually Spring XML configuration file will contain only one Grid definition. Note that
- * Grid configuration bean(s) is retrieved form configuration file by type, so the name of
- * the Grid configuration bean is ignored.
- *
- * @param springCfgUrl Spring XML configuration file path or URL. This cannot be {@code null}.
- * @return Tuple containing all loaded configurations and Spring context used to load them.
- * @throws IgniteCheckedException If grid could not be started or configuration
- * read. This exception will be thrown also if grid with given name has already
- * been started or Spring XML configuration file is invalid.
- */
- public static IgniteBiTuple<Collection<IgniteConfiguration>, ? extends GridSpringResourceContext> loadConfigurations(
- URL springCfgUrl) throws IgniteCheckedException {
- IgniteSpringProcessor spring = SPRING.create(false);
-
- return spring.loadConfigurations(springCfgUrl);
- }
-
- /**
- * Loads all grid configurations specified within given Spring XML configuration file.
- * <p>
- * Usually Spring XML configuration file will contain only one Grid definition. Note that
- * Grid configuration bean(s) is retrieved form configuration file by type, so the name of
- * the Grid configuration bean is ignored.
- *
- * @param springCfgPath Spring XML configuration file path. This cannot be {@code null}.
- * @return Tuple containing all loaded configurations and Spring context used to load them.
- * @throws IgniteCheckedException If grid could not be started or configuration
- * read. This exception will be thrown also if grid with given name has already
- * been started or Spring XML configuration file is invalid.
- */
- public static IgniteBiTuple<Collection<IgniteConfiguration>, ? extends GridSpringResourceContext> loadConfigurations(
- String springCfgPath) throws IgniteCheckedException {
- A.notNull(springCfgPath, "springCfgPath");
-
- URL url;
-
- try {
- url = new URL(springCfgPath);
- }
- catch (MalformedURLException e) {
- url = U.resolveGridGainUrl(springCfgPath);
-
- if (url == null)
- throw new IgniteCheckedException("Spring XML configuration path is invalid: " + springCfgPath +
- ". Note that this path should be either absolute or a relative local file system path, " +
- "relative to META-INF in classpath or valid URL to GRIDGAIN_HOME.", e);
- }
-
- return loadConfigurations(url);
- }
-
- /**
- * Loads first found grid configuration specified within given Spring XML configuration file.
- * <p>
- * Usually Spring XML configuration file will contain only one Grid definition. Note that
- * Grid configuration bean(s) is retrieved form configuration file by type, so the name of
- * the Grid configuration bean is ignored.
- *
- * @param springCfgUrl Spring XML configuration file path or URL. This cannot be {@code null}.
- * @return First found configuration and Spring context used to load it.
- * @throws IgniteCheckedException If grid could not be started or configuration
- * read. This exception will be thrown also if grid with given name has already
- * been started or Spring XML configuration file is invalid.
- */
- public static IgniteBiTuple<IgniteConfiguration, GridSpringResourceContext> loadConfiguration(URL springCfgUrl)
- throws IgniteCheckedException {
- IgniteBiTuple<Collection<IgniteConfiguration>, ? extends GridSpringResourceContext> t = loadConfigurations(springCfgUrl);
-
- return F.t(F.first(t.get1()), t.get2());
- }
-
- /**
- * Loads first found grid configuration specified within given Spring XML configuration file.
- * <p>
- * Usually Spring XML configuration file will contain only one Grid definition. Note that
- * Grid configuration bean(s) is retrieved form configuration file by type, so the name of
- * the Grid configuration bean is ignored.
- *
- * @param springCfgPath Spring XML configuration file path. This cannot be {@code null}.
- * @return First found configuration and Spring context used to load it.
- * @throws IgniteCheckedException If grid could not be started or configuration
- * read. This exception will be thrown also if grid with given name has already
- * been started or Spring XML configuration file is invalid.
- */
- public static IgniteBiTuple<IgniteConfiguration, GridSpringResourceContext> loadConfiguration(String springCfgPath)
- throws IgniteCheckedException {
- IgniteBiTuple<Collection<IgniteConfiguration>, ? extends GridSpringResourceContext> t =
- loadConfigurations(springCfgPath);
-
- return F.t(F.first(t.get1()), t.get2());
- }
-
- /**
- * Starts all grids specified within given Spring XML configuration file. If grid with given name
- * is already started, then exception is thrown. In this case all instances that may
- * have been started so far will be stopped too.
- * <p>
- * Usually Spring XML configuration file will contain only one Grid definition. Note that
- * Grid configuration bean(s) is retrieved form configuration file by type, so the name of
- * the Grid configuration bean is ignored.
- *
- * @param springCfgPath Spring XML configuration file path or URL. This cannot be {@code null}.
- * @param gridName Grid name that will override default.
- * @param springCtx Optional Spring application context, possibly {@code null}.
- * Spring bean definitions for bean injection are taken from this context.
- * If provided, this context can be injected into grid tasks and grid jobs using
- * {@link org.apache.ignite.resources.IgniteSpringApplicationContextResource @IgniteSpringApplicationContextResource} annotation.
- * @return Started grid. If Spring configuration contains multiple grid instances,
- * then the 1st found instance is returned.
- * @throws IgniteCheckedException If grid could not be started or configuration
- * read. This exception will be thrown also if grid with given name has already
- * been started or Spring XML configuration file is invalid.
- */
- public static Ignite start(String springCfgPath, @Nullable String gridName,
- @Nullable GridSpringResourceContext springCtx) throws IgniteCheckedException {
- URL url = resolveSpringUrl(springCfgPath);
-
- return start(url, gridName, springCtx);
- }
-
- /**
- * Starts all grids specified within given Spring XML configuration file URL. If grid with given name
- * is already started, then exception is thrown. In this case all instances that may
- * have been started so far will be stopped too.
- * <p>
- * Usually Spring XML configuration file will contain only one Grid definition. Note that
- * Grid configuration bean(s) is retrieved form configuration file by type, so the name of
- * the Grid configuration bean is ignored.
- *
- * @param springCfgUrl Spring XML configuration file URL. This cannot be {@code null}.
- * @return Started grid. If Spring configuration contains multiple grid instances,
- * then the 1st found instance is returned.
- * @throws IgniteCheckedException If grid could not be started or configuration
- * read. This exception will be thrown also if grid with given name has already
- * been started or Spring XML configuration file is invalid.
- */
- public static Ignite start(URL springCfgUrl) throws IgniteCheckedException {
- return start(springCfgUrl, null, null);
- }
-
- /**
- * Starts all grids specified within given Spring XML configuration file URL. If grid with given name
- * is already started, then exception is thrown. In this case all instances that may
- * have been started so far will be stopped too.
- * <p>
- * Usually Spring XML configuration file will contain only one Grid definition. Note that
- * Grid configuration bean(s) is retrieved form configuration file by type, so the name of
- * the Grid configuration bean is ignored.
- *
- * @param springCfgUrl Spring XML configuration file URL. This cannot be {@code null}.
- * @param gridName Grid name that will override default.
- * @param springCtx Optional Spring application context, possibly {@code null}.
- * Spring bean definitions for bean injection are taken from this context.
- * If provided, this context can be injected into grid tasks and grid jobs using
- * {@link org.apache.ignite.resources.IgniteSpringApplicationContextResource @IgniteSpringApplicationContextResource} annotation.
- * @return Started grid. If Spring configuration contains multiple grid instances,
- * then the 1st found instance is returned.
- * @throws IgniteCheckedException If grid could not be started or configuration
- * read. This exception will be thrown also if grid with given name has already
- * been started or Spring XML configuration file is invalid.
- */
- public static Ignite start(URL springCfgUrl, @Nullable String gridName,
- @Nullable GridSpringResourceContext springCtx) throws IgniteCheckedException {
- return start(springCfgUrl, gridName, springCtx, null);
- }
-
- /**
- * Internal Spring-based start routine.
- *
- * @param springCfgUrl Spring XML configuration file URL. This cannot be {@code null}.
- * @param gridName Grid name that will override default.
- * @param springCtx Optional Spring application context.
- * @param cfgClo Optional closure to change configuration before it is used to start the grid.
- * @return Started grid.
- * @throws IgniteCheckedException If failed.
- */
- private static Ignite start(URL springCfgUrl, @Nullable String gridName,
- @Nullable GridSpringResourceContext springCtx,
- @Nullable IgniteClosure<IgniteConfiguration, IgniteConfiguration> cfgClo)
- throws IgniteCheckedException {
- A.notNull(springCfgUrl, "springCfgUrl");
-
- boolean isLog4jUsed = U.gridClassLoader().getResource("org/apache/log4j/Appender.class") != null;
-
- IgniteBiTuple<Object, Object> t = null;
-
- Collection<Handler> savedHnds = null;
-
- if (isLog4jUsed)
- t = U.addLog4jNoOpLogger();
- else
- savedHnds = U.addJavaNoOpLogger();
-
- IgniteBiTuple<Collection<IgniteConfiguration>, ? extends GridSpringResourceContext> cfgMap;
-
- try {
- cfgMap = loadConfigurations(springCfgUrl);
- }
- finally {
- if (isLog4jUsed && t != null)
- U.removeLog4jNoOpLogger(t);
-
- if (!isLog4jUsed)
- U.removeJavaNoOpLogger(savedHnds);
- }
-
- List<GridNamedInstance> grids = new ArrayList<>(cfgMap.size());
-
- try {
- for (IgniteConfiguration cfg : cfgMap.get1()) {
- assert cfg != null;
-
- if (cfg.getGridName() == null && !F.isEmpty(gridName))
- cfg.setGridName(gridName);
-
- if (cfgClo != null) {
- cfg = cfgClo.apply(cfg);
-
- assert cfg != null;
- }
-
- // Use either user defined context or our one.
- GridNamedInstance grid = start0(
- new GridStartContext(cfg, springCfgUrl, springCtx == null ? cfgMap.get2() : springCtx));
-
- // Add it if it was not stopped during startup.
- if (grid != null)
- grids.add(grid);
- }
- }
- catch (IgniteCheckedException e) {
- // Stop all instances started so far.
- for (GridNamedInstance grid : grids) {
- try {
- grid.stop(true);
- }
- catch (Exception e1) {
- U.error(grid.log, "Error when stopping grid: " + grid, e1);
- }
- }
-
- throw e;
- }
-
- // Return the first grid started.
- GridNamedInstance res = !grids.isEmpty() ? grids.get(0) : null;
-
- return res != null ? res.grid() : null;
- }
-
- /**
- * Resolve Spring configuration URL.
- *
- * @param springCfgPath Spring XML configuration file path or URL. This cannot be {@code null}.
- * @return URL.
- * @throws IgniteCheckedException If failed.
- */
- private static URL resolveSpringUrl(String springCfgPath) throws IgniteCheckedException {
- A.notNull(springCfgPath, "springCfgPath");
-
- URL url;
-
- try {
- url = new URL(springCfgPath);
- }
- catch (MalformedURLException e) {
- url = U.resolveGridGainUrl(springCfgPath);
-
- if (url == null)
- throw new IgniteCheckedException("Spring XML configuration path is invalid: " + springCfgPath +
- ". Note that this path should be either absolute or a relative local file system path, " +
- "relative to META-INF in classpath or valid URL to GRIDGAIN_HOME.", e);
- }
-
- return url;
- }
-
- /**
- * Starts grid with given configuration.
- *
- * @param startCtx Start context.
- * @return Started grid.
- * @throws IgniteCheckedException If grid could not be started.
- */
- private static GridNamedInstance start0(GridStartContext startCtx) throws IgniteCheckedException {
- assert startCtx != null;
-
- String name = startCtx.config().getGridName();
-
- if (name != null && name.isEmpty())
- throw new IgniteCheckedException("Non default grid instances cannot have empty string name.");
-
- GridNamedInstance grid = new GridNamedInstance(name);
-
- GridNamedInstance old;
-
- if (name != null)
- old = grids.putIfAbsent(name, grid);
- else {
- synchronized (dfltGridMux) {
- old = dfltGrid;
-
- if (old == null)
- dfltGrid = grid;
- }
- }
-
- if (old != null) {
- if (name == null)
- throw new IgniteCheckedException("Default grid instance has already been started.");
- else
- throw new IgniteCheckedException("Grid instance with this name has already been started: " + name);
- }
-
- if (startCtx.config().getWarmupClosure() != null)
- startCtx.config().getWarmupClosure().apply(startCtx.config());
-
- startCtx.single(grids.size() == 1);
-
- boolean success = false;
-
- try {
- grid.start(startCtx);
-
- notifyStateChange(name, STARTED);
-
- success = true;
- }
- finally {
- if (!success) {
- if (name != null)
- grids.remove(name, grid);
- else {
- synchronized (dfltGridMux) {
- if (dfltGrid == grid)
- dfltGrid = null;
- }
- }
-
- grid = null;
- }
- }
-
- if (grid == null)
- throw new IgniteCheckedException("Failed to start grid with provided configuration.");
-
- return grid;
- }
-
- /**
- * Gets an instance of default no-name grid. Note that
- * caller of this method should not assume that it will return the same
- * instance every time.
- * <p>
- * This method is identical to {@code G.grid(null)} apply.
- *
- * @return An instance of default no-name grid. This method never returns
- * {@code null}.
- * @throws org.apache.ignite.IgniteIllegalStateException Thrown if default grid was not properly
- * initialized or grid instance was stopped or was not started.
- */
- public static Ignite grid() throws IgniteIllegalStateException {
- return grid((String)null);
- }
-
- /**
- * Gets a list of all grids started so far.
- *
- * @return List of all grids started so far.
- */
- public static List<Ignite> allGrids() {
- List<Ignite> allIgnites = new ArrayList<>(grids.size() + 1);
-
- for (GridNamedInstance grid : grids.values()) {
- Ignite g = grid.grid();
-
- if (g != null)
- allIgnites.add(g);
- }
-
- GridNamedInstance dfltGrid0 = dfltGrid;
-
- if (dfltGrid0 != null) {
- IgniteKernal g = dfltGrid0.grid();
-
- if (g != null)
- allIgnites.add(g);
- }
-
- return allIgnites;
- }
-
- /**
- * Gets a grid instance for given local node ID. Note that grid instance and local node have
- * one-to-one relationship where node has ID and instance has name of the grid to which
- * both grid instance and its node belong. Note also that caller of this method
- * should not assume that it will return the same instance every time.
- *
- * @param locNodeId ID of local node the requested grid instance is managing.
- * @return An instance of named grid. This method never returns
- * {@code null}.
- * @throws org.apache.ignite.IgniteIllegalStateException Thrown if grid was not properly
- * initialized or grid instance was stopped or was not started.
- */
- public static Ignite grid(UUID locNodeId) throws IgniteIllegalStateException {
- A.notNull(locNodeId, "locNodeId");
-
- GridNamedInstance dfltGrid0 = dfltGrid;
-
- if (dfltGrid0 != null) {
- IgniteKernal g = dfltGrid0.grid();
-
- if (g != null && g.getLocalNodeId().equals(locNodeId))
- return g;
- }
-
- for (GridNamedInstance grid : grids.values()) {
- IgniteKernal g = grid.grid();
-
- if (g != null && g.getLocalNodeId().equals(locNodeId))
- return g;
- }
-
- throw new IgniteIllegalStateException("Grid instance with given local node ID was not properly " +
- "started or was stopped: " + locNodeId);
- }
-
- /**
- * Gets an named grid instance. If grid name is {@code null} or empty string,
- * then default no-name grid will be returned. Note that caller of this method
- * should not assume that it will return the same instance every time.
- * <p>
- * Note that Java VM can run multiple grid instances and every grid instance (and its
- * node) can belong to a different grid. Grid name defines what grid a particular grid
- * instance (and correspondingly its node) belongs to.
- *
- * @param name Grid name to which requested grid instance belongs to. If {@code null},
- * then grid instance belonging to a default no-name grid will be returned.
- * @return An instance of named grid. This method never returns
- * {@code null}.
- * @throws org.apache.ignite.IgniteIllegalStateException Thrown if default grid was not properly
- * initialized or grid instance was stopped or was not started.
- */
- public static Ignite grid(@Nullable String name) throws IgniteIllegalStateException {
- GridNamedInstance grid = name != null ? grids.get(name) : dfltGrid;
-
- Ignite res;
-
- if (grid == null || (res = grid.grid()) == null)
- throw new IgniteIllegalStateException("Grid instance was not properly started " +
- "or was already stopped: " + name);
-
- return res;
- }
-
- /**
- * Gets grid instance without waiting its initialization.
- *
- * @param name Grid name.
- * @return Grid instance.
- */
- public static IgniteKernal gridx(@Nullable String name) {
- GridNamedInstance grid = name != null ? grids.get(name) : dfltGrid;
-
- IgniteKernal res;
-
- if (grid == null || (res = grid.gridx()) == null)
- throw new IllegalStateException("Grid instance was not properly started or was already stopped: " + name);
-
- return res;
- }
-
- /**
- * Adds a lsnr for grid life cycle events.
- * <p>
- * Note that unlike other listeners in GridGain this listener will be
- * notified from the same thread that triggers the state change. Because of
- * that it is the responsibility of the user to make sure that listener logic
- * is light-weight and properly handles (catches) any runtime exceptions, if any
- * are expected.
- *
- * @param lsnr Listener for grid life cycle events. If this listener was already added
- * this method is no-op.
- */
- public static void addListener(IgniteListener lsnr) {
- A.notNull(lsnr, "lsnr");
-
- lsnrs.add(lsnr);
- }
-
- /**
- * Removes lsnr added by {@link #addListener(org.apache.ignite.lifecycle.IgniteListener)} method.
- *
- * @param lsnr Listener to remove.
- * @return {@code true} if lsnr was added before, {@code false} otherwise.
- */
- public static boolean removeListener(IgniteListener lsnr) {
- A.notNull(lsnr, "lsnr");
-
- return lsnrs.remove(lsnr);
- }
-
- /**
- * @param gridName Grid instance name.
- * @param state Factory state.
- */
- private static void notifyStateChange(@Nullable String gridName, IgniteState state) {
- if (gridName != null)
- gridStates.put(gridName, state);
- else
- dfltGridState = state;
-
- for (IgniteListener lsnr : lsnrs)
- lsnr.onStateChange(gridName, state);
- }
-
- /**
- * Start context encapsulates all starting parameters.
- */
- private static final class GridStartContext {
- /** User-defined configuration. */
- private IgniteConfiguration cfg;
-
- /** Optional configuration path. */
- private URL cfgUrl;
-
- /** Optional Spring application context. */
- private GridSpringResourceContext springCtx;
-
- /** Whether or not this is a single grid instance in current VM. */
- private boolean single;
-
- /**
- *
- * @param cfg User-defined configuration.
- * @param cfgUrl Optional configuration path.
- * @param springCtx Optional Spring application context.
- */
- GridStartContext(IgniteConfiguration cfg, @Nullable URL cfgUrl, @Nullable GridSpringResourceContext springCtx) {
- assert(cfg != null);
-
- this.cfg = cfg;
- this.cfgUrl = cfgUrl;
- this.springCtx = springCtx;
- }
-
- /**
- * @return Whether or not this is a single grid instance in current VM.
- */
- public boolean single() {
- return single;
- }
-
- /**
- * @param single Whether or not this is a single grid instance in current VM.
- */
- public void single(boolean single) {
- this.single = single;
- }
-
- /**
- * @return User-defined configuration.
- */
- IgniteConfiguration config() {
- return cfg;
- }
-
- /**
- * @param cfg User-defined configuration.
- */
- void config(IgniteConfiguration cfg) {
- this.cfg = cfg;
- }
-
- /**
- * @return Optional configuration path.
- */
- URL configUrl() {
- return cfgUrl;
- }
-
- /**
- * @param cfgUrl Optional configuration path.
- */
- void configUrl(URL cfgUrl) {
- this.cfgUrl = cfgUrl;
- }
-
- /**
- * @return Optional Spring application context.
- */
- public GridSpringResourceContext springContext() {
- return springCtx;
- }
- }
-
- /**
- * Grid data container.
- */
- private static final class GridNamedInstance {
- /** Map of registered MBeans. */
- private static final Map<MBeanServer, GridMBeanServerData> mbeans =
- new HashMap<>();
-
- /** */
- private static final String[] EMPTY_STR_ARR = new String[0];
-
- /** Empty array of caches. */
- private static final CacheConfiguration[] EMPTY_CACHE_CONFIGS = new CacheConfiguration[0];
-
- /** Grid name. */
- private final String name;
-
- /** Grid instance. */
- private volatile IgniteKernal grid;
-
- /** Executor service. */
- private ExecutorService execSvc;
-
- /** Auto executor service flag. */
- private boolean isAutoExecSvc;
-
- /** Executor service shutdown flag. */
- private boolean execSvcShutdown;
-
- /** System executor service. */
- private ExecutorService sysExecSvc;
-
- /** Auto system service flag. */
- private boolean isAutoSysSvc;
-
- /** System executor service shutdown flag. */
- private boolean sysSvcShutdown;
-
- /** Management executor service. */
- private ExecutorService mgmtExecSvc;
-
- /** Auto management service flag. */
- private boolean isAutoMgmtSvc;
-
- /** Management executor service shutdown flag. */
- private boolean mgmtSvcShutdown;
-
- /** P2P executor service. */
- private ExecutorService p2pExecSvc;
-
- /** Auto P2P service flag. */
- private boolean isAutoP2PSvc;
-
- /** P2P executor service shutdown flag. */
- private boolean p2pSvcShutdown;
-
- /** GGFS executor service. */
- private ExecutorService ggfsExecSvc;
-
- /** Auto GGFS service flag. */
- private boolean isAutoGgfsSvc;
-
- /** GGFS executor service shutdown flag. */
- private boolean ggfsSvcShutdown;
-
- /** REST requests executor service. */
- private ExecutorService restExecSvc;
-
- /** Auto REST service flag. */
- private boolean isAutoRestSvc;
-
- /** REST executor service shutdown flag. */
- private boolean restSvcShutdown;
-
- /** Utility cache executor service. */
- private ExecutorService utilityCacheExecSvc;
-
- /** Grid state. */
- private volatile IgniteState state = STOPPED;
-
- /** Shutdown hook. */
- private Thread shutdownHook;
-
- /** Grid log. */
- private IgniteLogger log;
-
- /** Start guard. */
- private final AtomicBoolean startGuard = new AtomicBoolean();
-
- /** Start latch. */
- private final CountDownLatch startLatch = new CountDownLatch(1);
-
- /**
- * Thread that starts this named instance. This field can be non-volatile since
- * it makes sense only for thread where it was originally initialized.
- */
- @SuppressWarnings("FieldAccessedSynchronizedAndUnsynchronized")
- private Thread starterThread;
-
- /**
- * Creates un-started named instance.
- *
- * @param name Grid name (possibly {@code null} for default grid).
- */
- GridNamedInstance(@Nullable String name) {
- this.name = name;
- }
-
- /**
- * Gets grid name.
- *
- * @return Grid name.
- */
- String getName() {
- return name;
- }
-
- /**
- * Gets grid instance.
- *
- * @return Grid instance.
- */
- IgniteKernal grid() {
- if (starterThread != Thread.currentThread())
- U.awaitQuiet(startLatch);
-
- return grid;
- }
-
- /**
- * Gets grid instance without waiting for its initialization.
- *
- * @return Grid instance.
- */
- public IgniteKernal gridx() {
- return grid;
- }
-
- /**
- * Gets grid state.
- *
- * @return Grid state.
- */
- IgniteState state() {
- if (starterThread != Thread.currentThread())
- U.awaitQuiet(startLatch);
-
- return state;
- }
-
- /**
- * @param spi SPI implementation.
- * @throws IgniteCheckedException Thrown in case if multi-instance is not supported.
- */
- private void ensureMultiInstanceSupport(IgniteSpi spi) throws IgniteCheckedException {
- IgniteSpiMultipleInstancesSupport ann = U.getAnnotation(spi.getClass(),
- IgniteSpiMultipleInstancesSupport.class);
-
- if (ann == null || !ann.value())
- throw new IgniteCheckedException("SPI implementation doesn't support multiple grid instances in " +
- "the same VM: " + spi);
- }
-
- /**
- * @param spis SPI implementations.
- * @throws IgniteCheckedException Thrown in case if multi-instance is not supported.
- */
- private void ensureMultiInstanceSupport(IgniteSpi[] spis) throws IgniteCheckedException {
- for (IgniteSpi spi : spis)
- ensureMultiInstanceSupport(spi);
- }
-
- /**
- * Starts grid with given configuration.
- *
- * @param startCtx Starting context.
- * @throws IgniteCheckedException If start failed.
- */
- synchronized void start(GridStartContext startCtx) throws IgniteCheckedException {
- if (startGuard.compareAndSet(false, true)) {
- try {
- starterThread = Thread.currentThread();
-
- start0(startCtx);
- }
- catch (Exception e) {
- if (log != null)
- stopExecutors(log);
-
- throw e;
- }
- finally {
- startLatch.countDown();
- }
- }
- else
- U.awaitQuiet(startLatch);
- }
-
- /**
- * @param startCtx Starting context.
- * @throws IgniteCheckedException If start failed.
- */
- @SuppressWarnings({"unchecked", "TooBroadScope"})
- private void start0(GridStartContext startCtx) throws IgniteCheckedException {
- assert grid == null : "Grid is already started: " + name;
-
- IgniteConfiguration cfg = startCtx.config();
-
- if (cfg == null)
- cfg = new IgniteConfiguration();
-
- IgniteConfiguration myCfg = new IgniteConfiguration();
-
- String ggHome = cfg.getGridGainHome();
-
- // Set GridGain home.
- if (ggHome == null)
- ggHome = U.getGridGainHome();
- else
- // If user provided GRIDGAIN_HOME - set it as a system property.
- U.setGridGainHome(ggHome);
-
- U.setWorkDirectory(cfg.getWorkDirectory(), ggHome);
-
- /*
- * Set up all defaults and perform all checks.
- */
-
- // Ensure invariant.
- // It's a bit dirty - but this is a result of late refactoring
- // and I don't want to reshuffle a lot of code.
- assert F.eq(name, cfg.getGridName());
-
- // Set configuration URL, if any, into system property.
- if (startCtx.configUrl() != null)
- System.setProperty(GG_CONFIG_URL, startCtx.configUrl().toString());
-
- myCfg.setGridName(cfg.getGridName());
-
- UUID nodeId = cfg.getNodeId();
-
- if (nodeId == null)
- nodeId = UUID.randomUUID();
-
- IgniteLogger cfgLog = initLogger(cfg.getGridLogger(), nodeId);
-
- assert cfgLog != null;
-
- cfgLog = new GridLoggerProxy(cfgLog, null, name, U.id8(nodeId));
-
- // Initialize factory's log.
- log = cfgLog.getLogger(G.class);
-
- // Check GridGain home folder (after log is available).
- if (ggHome != null) {
- File ggHomeFile = new File(ggHome);
-
- if (!ggHomeFile.exists() || !ggHomeFile.isDirectory())
- throw new IgniteCheckedException("Invalid GridGain installation home folder: " + ggHome);
- }
-
- myCfg.setGridGainHome(ggHome);
-
- // Copy values that don't need extra processing.
- myCfg.setLicenseUrl(cfg.getLicenseUrl());
- myCfg.setPeerClassLoadingEnabled(cfg.isPeerClassLoadingEnabled());
- myCfg.setDeploymentMode(cfg.getDeploymentMode());
- myCfg.setNetworkTimeout(cfg.getNetworkTimeout());
- myCfg.setClockSyncSamples(cfg.getClockSyncSamples());
- myCfg.setClockSyncFrequency(cfg.getClockSyncFrequency());
- myCfg.setDiscoveryStartupDelay(cfg.getDiscoveryStartupDelay());
- myCfg.setMetricsHistorySize(cfg.getMetricsHistorySize());
- myCfg.setMetricsExpireTime(cfg.getMetricsExpireTime());
- myCfg.setMetricsUpdateFrequency(cfg.getMetricsUpdateFrequency());
- myCfg.setLifecycleBeans(cfg.getLifecycleBeans());
- myCfg.setLocalEventListeners(cfg.getLocalEventListeners());
- myCfg.setPeerClassLoadingMissedResourcesCacheSize(cfg.getPeerClassLoadingMissedResourcesCacheSize());
- myCfg.setIncludeEventTypes(cfg.getIncludeEventTypes());
- myCfg.setDaemon(cfg.isDaemon());
- myCfg.setIncludeProperties(cfg.getIncludeProperties());
- myCfg.setLifeCycleEmailNotification(cfg.isLifeCycleEmailNotification());
- myCfg.setMetricsLogFrequency(cfg.getMetricsLogFrequency());
- myCfg.setNetworkSendRetryDelay(cfg.getNetworkSendRetryDelay());
- myCfg.setNetworkSendRetryCount(cfg.getNetworkSendRetryCount());
- myCfg.setSecurityCredentialsProvider(cfg.getSecurityCredentialsProvider());
- myCfg.setServiceConfiguration(cfg.getServiceConfiguration());
- myCfg.setWarmupClosure(cfg.getWarmupClosure());
- myCfg.setInteropConfiguration(cfg.getInteropConfiguration());
- myCfg.setPluginConfigurations(cfg.getPluginConfigurations());
- myCfg.setTransactionsConfiguration(new TransactionsConfiguration(cfg.getTransactionsConfiguration()));
- myCfg.setQueryConfiguration(cfg.getQueryConfiguration());
-
- ClientConnectionConfiguration clientCfg = cfg.getClientConnectionConfiguration();
-
- if (clientCfg == null) {
- // If client config is not provided then create config copying values from GridConfiguration.
- if (cfg.isRestEnabled()) {
- clientCfg = new ClientConnectionConfiguration();
-
- clientCfg.setClientMessageInterceptor(cfg.getClientMessageInterceptor());
- clientCfg.setRestAccessibleFolders(cfg.getRestAccessibleFolders());
- clientCfg.setRestExecutorService(cfg.getRestExecutorService());
- clientCfg.setRestExecutorServiceShutdown(cfg.getRestExecutorServiceShutdown());
- clientCfg.setRestIdleTimeout(cfg.getRestIdleTimeout());
- clientCfg.setRestJettyPath(cfg.getRestJettyPath());
- clientCfg.setRestPortRange(cfg.getRestPortRange());
- clientCfg.setRestSecretKey(cfg.getRestSecretKey());
- clientCfg.setRestTcpDirectBuffer(cfg.isRestTcpDirectBuffer());
- clientCfg.setRestTcpHost(cfg.getRestTcpHost());
- clientCfg.setRestTcpNoDelay(cfg.isRestTcpNoDelay());
- clientCfg.setRestTcpPort(cfg.getRestTcpPort());
- clientCfg.setRestTcpReceiveBufferSize(cfg.getRestTcpReceiveBufferSize());
- clientCfg.setRestTcpSelectorCount(cfg.getRestTcpSelectorCount());
- clientCfg.setRestTcpSendBufferSize(cfg.getRestTcpSendBufferSize());
- clientCfg.setRestTcpSendQueueLimit(cfg.getRestTcpSendQueueLimit());
- clientCfg.setRestTcpSslClientAuth(cfg.isRestTcpSslClientAuth());
- clientCfg.setRestTcpSslContextFactory(cfg.getRestTcpSslContextFactory());
- clientCfg.setRestTcpSslEnabled(cfg.isRestTcpSslEnabled());
- }
- }
- else
- clientCfg = new ClientConnectionConfiguration(clientCfg);
-
-
- String ntfStr = IgniteSystemProperties.getString(GG_LIFECYCLE_EMAIL_NOTIFY);
-
- if (ntfStr != null)
- myCfg.setLifeCycleEmailNotification(Boolean.parseBoolean(ntfStr));
-
- // Local host.
- String locHost = IgniteSystemProperties.getString(GG_LOCAL_HOST);
-
- myCfg.setLocalHost(F.isEmpty(locHost) ? cfg.getLocalHost() : locHost);
-
- // Override daemon flag if it was set on the factory.
- if (daemon)
- myCfg.setDaemon(true);
-
- // Check for deployment mode override.
- String depModeName = IgniteSystemProperties.getString(GG_DEP_MODE_OVERRIDE);
-
- if (!F.isEmpty(depModeName)) {
- if (!F.isEmpty(cfg.getCacheConfiguration())) {
- U.quietAndInfo(log, "Skipping deployment mode override for caches (custom closure " +
- "execution may not work for console Visor)");
- }
- else {
- try {
- IgniteDeploymentMode depMode = IgniteDeploymentMode.valueOf(depModeName);
-
- if (myCfg.getDeploymentMode() != depMode)
- myCfg.setDeploymentMode(depMode);
- }
- catch (IllegalArgumentException e) {
- throw new IgniteCheckedException("Failed to override deployment mode using system property " +
- "(are there any misspellings?)" +
- "[name=" + GG_DEP_MODE_OVERRIDE + ", value=" + depModeName + ']', e);
- }
- }
- }
-
- Map<String, ?> attrs = cfg.getUserAttributes();
-
- if (attrs == null)
- attrs = Collections.emptyMap();
-
- MBeanServer mbSrv = cfg.getMBeanServer();
-
- IgniteMarshaller marsh = cfg.getMarshaller();
-
- String[] p2pExclude = cfg.getPeerClassLoadingLocalClassPathExclude();
-
- CommunicationSpi commSpi = cfg.getCommunicationSpi();
- DiscoverySpi discoSpi = cfg.getDiscoverySpi();
- EventStorageSpi evtSpi = cfg.getEventStorageSpi();
- CollisionSpi colSpi = cfg.getCollisionSpi();
- AuthenticationSpi authSpi = cfg.getAuthenticationSpi();
- SecureSessionSpi sesSpi = cfg.getSecureSessionSpi();
- DeploymentSpi deploySpi = cfg.getDeploymentSpi();
- CheckpointSpi[] cpSpi = cfg.getCheckpointSpi();
- FailoverSpi[] failSpi = cfg.getFailoverSpi();
- LoadBalancingSpi[] loadBalancingSpi = cfg.getLoadBalancingSpi();
- SwapSpaceSpi swapspaceSpi = cfg.getSwapSpaceSpi();
- GridIndexingSpi indexingSpi = cfg.getIndexingSpi();
-
- execSvc = cfg.getExecutorService();
- sysExecSvc = cfg.getSystemExecutorService();
- p2pExecSvc = cfg.getPeerClassLoadingExecutorService();
- mgmtExecSvc = cfg.getManagementExecutorService();
- ggfsExecSvc = cfg.getGgfsExecutorService();
-
- if (execSvc == null) {
- isAutoExecSvc = true;
-
- execSvc = new IgniteThreadPoolExecutor(
- "pub-" + cfg.getGridName(),
- DFLT_PUBLIC_CORE_THREAD_CNT,
- DFLT_PUBLIC_MAX_THREAD_CNT,
- DFLT_PUBLIC_KEEP_ALIVE_TIME,
- new LinkedBlockingQueue<Runnable>(DFLT_PUBLIC_THREADPOOL_QUEUE_CAP));
-
- // Pre-start all threads as they are guaranteed to be needed.
- ((ThreadPoolExecutor)execSvc).prestartAllCoreThreads();
- }
-
- if (sysExecSvc == null) {
- isAutoSysSvc = true;
-
- // Note that since we use 'LinkedBlockingQueue', number of
- // maximum threads has no effect.
- sysExecSvc = new IgniteThreadPoolExecutor(
- "sys-" + cfg.getGridName(),
- DFLT_SYSTEM_CORE_THREAD_CNT,
- DFLT_SYSTEM_MAX_THREAD_CNT,
- DFLT_SYSTEM_KEEP_ALIVE_TIME,
- new LinkedBlockingQueue<Runnable>(DFLT_SYSTEM_THREADPOOL_QUEUE_CAP));
-
- // Pre-start all threads as they are guaranteed to be needed.
- ((ThreadPoolExecutor)sysExecSvc).prestartAllCoreThreads();
- }
-
- if (mgmtExecSvc == null) {
- isAutoMgmtSvc = true;
-
- // Note that since we use 'LinkedBlockingQueue', number of
- // maximum threads has no effect.
- // Note, that we do not pre-start threads here as management pool may
- // not be needed.
- mgmtExecSvc = new IgniteThreadPoolExecutor(
- "mgmt-" + cfg.getGridName(),
- DFLT_MGMT_THREAD_CNT,
- DFLT_MGMT_THREAD_CNT,
- 0,
- new LinkedBlockingQueue<Runnable>());
- }
-
- if (p2pExecSvc == null) {
- isAutoP2PSvc = true;
-
- // Note that since we use 'LinkedBlockingQueue', number of
- // maximum threads has no effect.
- // Note, that we do not pre-start threads here as class loading pool may
- // not be needed.
- p2pExecSvc = new IgniteThreadPoolExecutor(
- "p2p-" + cfg.getGridName(),
- DFLT_P2P_THREAD_CNT,
- DFLT_P2P_THREAD_CNT,
- 0,
- new LinkedBlockingQueue<Runnable>());
- }
-
- if (ggfsExecSvc == null) {
- isAutoGgfsSvc = true;
-
- int procCnt = Runtime.getRuntime().availableProcessors();
-
- // Note that we do not pre-start threads here as ggfs pool may not be needed.
- ggfsExecSvc = new IgniteThreadPoolExecutor(
- "ggfs-" + cfg.getGridName(),
- procCnt,
- procCnt,
- 0,
- new LinkedBlockingQueue<Runnable>());
- }
-
- restExecSvc = clientCfg != null ? clientCfg.getRestExecutorService() : null;
-
- if (restExecSvc != null && !cfg.isRestEnabled()) {
- U.warn(log, "REST executor service is configured, but REST is disabled in configuration " +
- "(safely ignoring).");
- }
- else if (restExecSvc == null && clientCfg != null) {
- isAutoRestSvc = true;
-
- restExecSvc = new IgniteThreadPoolExecutor(
- "rest-" + cfg.getGridName(),
- DFLT_REST_CORE_THREAD_CNT,
- DFLT_REST_MAX_THREAD_CNT,
- DFLT_REST_KEEP_ALIVE_TIME,
- new LinkedBlockingQueue<Runnable>(DFLT_REST_THREADPOOL_QUEUE_CAP)
- );
-
- clientCfg.setRestExecutorService(restExecSvc);
- }
-
- utilityCacheExecSvc = new IgniteThreadPoolExecutor(
- "utility-" + cfg.getGridName(),
- DFLT_SYSTEM_CORE_THREAD_CNT,
- DFLT_SYSTEM_MAX_THREAD_CNT,
- DFLT_SYSTEM_KEEP_ALIVE_TIME,
- new LinkedBlockingQueue<Runnable>(DFLT_SYSTEM_THREADPOOL_QUEUE_CAP));
-
- execSvcShutdown = cfg.getExecutorServiceShutdown();
- sysSvcShutdown = cfg.getSystemExecutorServiceShutdown();
- mgmtSvcShutdown = cfg.getManagementExecutorServiceShutdown();
- p2pSvcShutdown = cfg.getPeerClassLoadingExecutorServiceShutdown();
- ggfsSvcShutdown = cfg.getGgfsExecutorServiceShutdown();
- restSvcShutdown = clientCfg != null && clientCfg.isRestExecutorServiceShutdown();
-
- if (marsh == null) {
- if (!U.isHotSpot()) {
- U.warn(log, "GridOptimizedMarshaller is not supported on this JVM " +
- "(only Java HotSpot VMs are supported). Switching to standard JDK marshalling - " +
- "object serialization performance will be significantly slower.",
- "To enable fast marshalling upgrade to recent 1.6 or 1.7 HotSpot VM release.");
-
- marsh = new IgniteJdkMarshaller();
- }
- else if (!IgniteOptimizedMarshaller.available()) {
- U.warn(log, "GridOptimizedMarshaller is not supported on this JVM " +
- "(only recent 1.6 and 1.7 versions HotSpot VMs are supported). " +
- "To enable fast marshalling upgrade to recent 1.6 or 1.7 HotSpot VM release. " +
- "Switching to standard JDK marshalling - " +
- "object serialization performance will be significantly slower.",
- "To enable fast marshalling upgrade to recent 1.6 or 1.7 HotSpot VM release.");
-
- marsh = new IgniteJdkMarshaller();
- }
- else
- marsh = new IgniteOptimizedMarshaller();
- }
- else if (marsh instanceof IgniteOptimizedMarshaller && !U.isHotSpot()) {
- U.warn(log, "Using GridOptimizedMarshaller on untested JVM (only Java HotSpot VMs were tested) - " +
- "object serialization behavior could yield unexpected results.",
- "Using GridOptimizedMarshaller on untested JVM.");
- }
-
- myCfg.setUserAttributes(attrs);
- myCfg.setMBeanServer(mbSrv == null ? ManagementFactory.getPlatformMBeanServer() : mbSrv);
- myCfg.setGridLogger(cfgLog);
- myCfg.setMarshaller(marsh);
- myCfg.setMarshalLocalJobs(cfg.isMarshalLocalJobs());
- myCfg.setExecutorService(execSvc);
- myCfg.setSystemExecutorService(sysExecSvc);
- myCfg.setManagementExecutorService(mgmtExecSvc);
- myCfg.setPeerClassLoadingExecutorService(p2pExecSvc);
- myCfg.setGgfsExecutorService(ggfsExecSvc);
- myCfg.setExecutorServiceShutdown(execSvcShutdown);
- myCfg.setSystemExecutorServiceShutdown(sysSvcShutdown);
- myCfg.setManagementExecutorServiceShutdown(mgmtSvcShutdown);
- myCfg.setPeerClassLoadingExecutorServiceShutdown(p2pSvcShutdown);
- myCfg.setGgfsExecutorServiceShutdown(ggfsSvcShutdown);
- myCfg.setNodeId(nodeId);
-
- IgniteFsConfiguration[] ggfsCfgs = cfg.getGgfsConfiguration();
-
- if (ggfsCfgs != null) {
- IgniteFsConfiguration[] clone = ggfsCfgs.clone();
-
- for (int i = 0; i < ggfsCfgs.length; i++)
- clone[i] = new IgniteFsConfiguration(ggfsCfgs[i]);
-
- myCfg.setGgfsConfiguration(clone);
- }
-
- StreamerConfiguration[] streamerCfgs = cfg.getStreamerConfiguration();
-
- if (streamerCfgs != null) {
- StreamerConfiguration[] clone = streamerCfgs.clone();
-
- for (int i = 0; i < streamerCfgs.length; i++)
- clone[i] = new StreamerConfiguration(streamerCfgs[i]);
-
- myCfg.setStreamerConfiguration(clone);
- }
-
- if (p2pExclude == null)
- p2pExclude = EMPTY_STR_ARR;
-
- myCfg.setPeerClassLoadingLocalClassPathExclude(p2pExclude);
-
- /*
- * Initialize default SPI implementations.
- */
-
- if (commSpi == null)
- commSpi = new TcpCommunicationSpi();
-
- if (discoSpi == null)
- discoSpi = new TcpDiscoverySpi();
-
- if (discoSpi instanceof TcpDiscoverySpi) {
- TcpDiscoverySpi tcpDisco = (TcpDiscoverySpi)discoSpi;
-
- if (tcpDisco.getIpFinder() == null)
- tcpDisco.setIpFinder(new TcpDiscoveryMulticastIpFinder());
- }
-
- if (evtSpi == null)
- evtSpi = new MemoryEventStorageSpi();
-
- if (colSpi == null)
- colSpi = new NoopCollisionSpi();
-
- if (authSpi == null)
- authSpi = new NoopAuthenticationSpi();
-
- if (sesSpi == null)
- sesSpi = new NoopSecureSessionSpi();
-
- if (deploySpi == null)
- deploySpi = new LocalDeploymentSpi();
-
- if (cpSpi == null)
- cpSpi = new CheckpointSpi[] {new NoopCheckpointSpi()};
-
- if (failSpi == null)
- failSpi = new FailoverSpi[] {new AlwaysFailoverSpi()};
-
- if (loadBalancingSpi == null)
- loadBalancingSpi = new LoadBalancingSpi[] {new RoundRobinLoadBalancingSpi()};
-
- if (swapspaceSpi == null) {
- boolean needSwap = false;
-
- CacheConfiguration[] caches = cfg.getCacheConfiguration();
-
- if (caches != null) {
- for (CacheConfiguration c : caches) {
- if (c.isSwapEnabled()) {
- needSwap = true;
-
- break;
- }
- }
- }
-
- swapspaceSpi = needSwap ? new FileSwapSpaceSpi() : new NoopSwapSpaceSpi();
- }
-
- if (indexingSpi == null)
- indexingSpi = new GridNoopIndexingSpi();
-
- myCfg.setCommunicationSpi(commSpi);
- myCfg.setDiscoverySpi(discoSpi);
- myCfg.setCheckpointSpi(cpSpi);
- myCfg.setEventStorageSpi(evtSpi);
- myCfg.setAuthenticationSpi(authSpi);
- myCfg.setSecureSessionSpi(sesSpi);
- myCfg.setDeploymentSpi(deploySpi);
- myCfg.setFailoverSpi(failSpi);
- myCfg.setCollisionSpi(colSpi);
- myCfg.setLoadBalancingSpi(loadBalancingSpi);
- myCfg.setSwapSpaceSpi(swapspaceSpi);
- myCfg.setIndexingSpi(indexingSpi);
-
- myCfg.setAddressResolver(cfg.getAddressResolver());
-
- // Set SMTP configuration.
- myCfg.setSmtpFromEmail(cfg.getSmtpFromEmail());
- myCfg.setSmtpHost(cfg.getSmtpHost());
- myCfg.setSmtpPort(cfg.getSmtpPort());
- myCfg.setSmtpSsl(cfg.isSmtpSsl());
- myCfg.setSmtpUsername(cfg.getSmtpUsername());
- myCfg.setSmtpPassword(cfg.getSmtpPassword());
- myCfg.setAdminEmails(cfg.getAdminEmails());
-
- // REST configuration.
- myCfg.setClientConnectionConfiguration(clientCfg);
-
- // Portable configuration.
- myCfg.setPortableConfiguration(cfg.getPortableConfiguration());
-
- // Hadoop configuration.
- myCfg.setHadoopConfiguration(cfg.getHadoopConfiguration());
-
- // Validate segmentation configuration.
- GridSegmentationPolicy segPlc = cfg.getSegmentationPolicy();
-
- // 1. Warn on potential configuration problem: grid is not configured to wait
- // for correct segment after segmentation happens.
- if (!F.isEmpty(cfg.getSegmentationResolvers()) && segPlc == RESTART_JVM && !cfg.isWaitForSegmentOnStart()) {
- U.warn(log, "Found potential configuration problem (forgot to enable waiting for segment" +
- "on start?) [segPlc=" + segPlc + ", wait=false]");
- }
-
- myCfg.setSegmentationResolvers(cfg.getSegmentationResolvers());
- myCfg.setSegmentationPolicy(segPlc);
- myCfg.setSegmentCheckFrequency(cfg.getSegmentCheckFrequency());
- myCfg.setWaitForSegmentOnStart(cfg.isWaitForSegmentOnStart());
- myCfg.setAllSegmentationResolversPassRequired(cfg.isAllSegmentationResolversPassRequired());
-
- // Override SMTP configuration from system properties
- // and environment variables, if specified.
- String fromEmail = IgniteSystemProperties.getString(GG_SMTP_FROM);
-
- if (fromEmail != null)
- myCfg.setSmtpFromEmail(fromEmail);
-
- String smtpHost = IgniteSystemProperties.getString(GG_SMTP_HOST);
-
- if (smtpHost != null)
- myCfg.setSmtpHost(smtpHost);
-
- String smtpUsername = IgniteSystemProperties.getString(GG_SMTP_USERNAME);
-
- if (smtpUsername != null)
- myCfg.setSmtpUsername(smtpUsername);
-
- String smtpPwd = IgniteSystemProperties.getString(GG_SMTP_PWD);
-
- if (smtpPwd != null)
- myCfg.setSmtpPassword(smtpPwd);
-
- int smtpPort = IgniteSystemProperties.getInteger(GG_SMTP_PORT, -1);
-
- if(smtpPort != -1)
- myCfg.setSmtpPort(smtpPort);
-
- myCfg.setSmtpSsl(IgniteSystemProperties.getBoolean(GG_SMTP_SSL));
-
- String adminEmails = IgniteSystemProperties.getString(GG_ADMIN_EMAILS);
-
- if (adminEmails != null)
- myCfg.setAdminEmails(adminEmails.split(","));
-
- CacheConfiguration[] cacheCfgs = cfg.getCacheConfiguration();
-
- boolean hasHadoop = IgniteComponentType.HADOOP.inClassPath();
-
- CacheConfiguration[] copies;
-
- if (cacheCfgs != null && cacheCfgs.length > 0) {
- if (!U.discoOrdered(discoSpi) && !U.relaxDiscoveryOrdered())
- throw new IgniteCheckedException("Discovery SPI implementation does not support node ordering and " +
- "cannot be used with cache (use SPI with @GridDiscoverySpiOrderSupport annotation, " +
- "like GridTcpDiscoverySpi)");
-
- for (CacheConfiguration ccfg : cacheCfgs) {
- if (CU.isHadoopSystemCache(ccfg.getName()))
- throw new IgniteCheckedException("Cache name cannot be \"" + CU.SYS_CACHE_HADOOP_MR +
- "\" because it is reserved for internal purposes.");
-
- if (CU.isUtilityCache(ccfg.getName()))
- throw new IgniteCheckedException("Cache name cannot start with \"" + CU.UTILITY_CACHE_NAME +
- "\" because this prefix is reserved for internal purposes.");
- }
-
- copies = new CacheConfiguration[cacheCfgs.length + (hasHadoop ? 2 : 1)];
-
- int cloneIdx = 1;
-
- if (hasHadoop)
- copies[cloneIdx++] = CU.hadoopSystemCache();
-
- for (CacheConfiguration ccfg : cacheCfgs)
- copies[cloneIdx++] = new CacheConfiguration(ccfg);
- }
- else if (hasHadoop) {
- // Populate system caches
- copies = new CacheConfiguration[hasHadoop ? 2 : 1];
-
- copies[1] = CU.hadoopSystemCache();
- }
- else
- copies = new CacheConfiguration[1];
-
- // Always add utility cache.
- copies[0] = utilitySystemCache(discoSpi instanceof TcpClientDiscoverySpi);
-
- myCfg.setCacheConfiguration(copies);
-
- myCfg.setCacheSanityCheckEnabled(cfg.isCacheSanityCheckEnabled());
-
- try {
- // Use reflection to avoid loading undesired classes.
- Class helperCls = Class.forName("org.gridgain.grid.util.GridConfigurationHelper");
-
- helperCls.getMethod("overrideConfiguration", IgniteConfiguration.class, Properties.class,
- String.class, IgniteLogger.class).invoke(helperCls, myCfg, System.getProperties(), name, log);
- }
- catch (Exception ignored) {
- // No-op.
- }
-
- // Ensure that SPIs support multiple grid instances, if required.
- if (!startCtx.single()) {
- ensureMultiInstanceSupport(deploySpi);
- ensureMultiInstanceSupport(commSpi);
- ensureMultiInstanceSupport(discoSpi);
- ensureMultiInstanceSupport(cpSpi);
- ensureMultiInstanceSupport(evtSpi);
- ensureMultiInstanceSupport(colSpi);
- ensureMultiInstanceSupport(failSpi);
- ensureMultiInstanceSupport(authSpi);
- ensureMultiInstanceSupport(sesSpi);
- ensureMultiInstanceSupport(loadBalancingSpi);
- ensureMultiInstanceSupport(swapspaceSpi);
- }
-
- // Register GridGain MBean for current grid instance.
- registerFactoryMbean(myCfg.getMBeanServer());
-
- boolean started = false;
-
- try {
- IgniteKernal grid0 = new IgniteKernal(startCtx.springContext());
-
- // Init here to make grid available to lifecycle listeners.
- grid = grid0;
-
- grid0.start(myCfg, utilityCacheExecSvc, new CA() {
- @Override public void apply() {
- startLatch.countDown();
- }
- });
-
- state = STARTED;
-
- if (log.isDebugEnabled())
- log.debug("Grid factory started ok: " + name);
-
- started = true;
- }
- catch (IgniteCheckedException e) {
- unregisterFactoryMBean();
-
- throw e;
- }
- // Catch Throwable to protect against any possible failure.
- catch (Throwable e) {
- unregisterFactoryMBean();
-
- throw new IgniteCheckedException("Unexpected exception when starting grid.", e);
- }
- finally {
- if (!started)
- // Grid was not started.
- grid = null;
- }
-
- // Do NOT set it up only if GRIDGAIN_NO_SHUTDOWN_HOOK=TRUE is provided.
- if (!IgniteSystemProperties.getBoolean(GG_NO_SHUTDOWN_HOOK, false)) {
- try {
- Runtime.getRuntime().addShutdownHook(shutdownHook = new Thread() {
- @Override public void run() {
- if (log.isInfoEnabled())
- log.info("Invoking shutdown hook...");
-
- GridNamedInstance.this.stop(true);
- }
- });
-
- if (log.isDebugEnabled())
- log.debug("Shutdown hook is installed.");
- }
- catch (IllegalStateException e) {
- stop(true);
-
- throw new IgniteCheckedException("Failed to install shutdown hook.", e);
- }
- }
- else {
- if (log.isDebugEnabled())
- log.debug("Shutdown hook has not been installed because environment " +
- "or system property " + GG_NO_SHUTDOWN_HOOK + " is set.");
- }
- }
-
- /**
- * @param cfgLog Configured logger.
- * @param nodeId Local node ID.
- * @return Initialized logger.
- * @throws IgniteCheckedException If failed.
- */
- private IgniteLogger initLogger(@Nullable IgniteLogger cfgLog, UUID nodeId) throws IgniteCheckedException {
- try {
- if (cfgLog == null) {
- Class<?> log4jCls;
-
- try {
- log4jCls = Class.forName("org.gridgain.grid.logger.log4j.GridLog4jLogger");
- }
- catch (ClassNotFoundException | NoClassDefFoundError ignored) {
- log4jCls = null;
- }
-
- if (log4jCls != null) {
- URL url = U.resolveGridGainUrl("config/gridgain-log4j.xml");
-
- if (url == null) {
- File cfgFile = new File("config/gridgain-log4j.xml");
-
- if (!cfgFile.exists())
- cfgFile = new File("../config/gridgain-log4j.xml");
-
- if (cfgFile.exists()) {
- try {
- url = cfgFile.toURI().toURL();
- }
- catch (MalformedURLException ignore) {
- // No-op.
- }
- }
- }
-
- if (url != null) {
- boolean configured = (Boolean)log4jCls.getMethod("isConfigured").invoke(null);
-
- if (configured)
- url = null;
- }
-
- if (url != null) {
- Constructor<?> ctor = log4jCls.getConstructor(URL.class);
-
- cfgLog = (IgniteLogger)ctor.newInstance(url);
- }
- else
- cfgLog = (IgniteLogger)log4jCls.newInstance();
- }
- else
- cfgLog = new IgniteJavaLogger();
- }
-
- // Set node IDs for all file appenders.
- if (cfgLog instanceof IgniteLoggerNodeIdAware)
- ((IgniteLoggerNodeIdAware)cfgLog).setNodeId(nodeId);
-
- return cfgLog;
- }
- catch (Exception e) {
- throw new IgniteCheckedException("Failed to create logger.", e);
- }
- }
-
- /**
- * Creates utility system cache configuration.
- *
- * @param client If {@code true} creates client-only cache configuration.
- * @return Utility system cache configuration.
- */
- private CacheConfiguration utilitySystemCache(boolean client) {
- CacheConfiguration cache = new CacheConfiguration();
-
- cache.setName(CU.UTILITY_CACHE_NAME);
- cache.setCacheMode(REPLICATED);
- cache.setAtomicityMode(TRANSACTIONAL);
- cache.setSwapEnabled(false);
- cache.setQueryIndexEnabled(false);
- cache.setPreloadMode(SYNC);
- cache.setWriteSynchronizationMode(FULL_SYNC);
- cache.setAffinity(new CacheRendezvousAffinityFunction(false, 100));
-
- if (client)
- cache.setDistributionMode(CLIENT_ONLY);
-
- return cache;
- }
-
- /**
- * Stops grid.
- *
- * @param cancel Flag indicating whether all currently running jobs
- * should be cancelled.
- */
- void stop(boolean cancel) {
- // Stop cannot be called prior to start from public API,
- // since it checks for STARTED state. So, we can assert here.
- assert startGuard.get();
-
- stop0(cancel);
- }
-
- /**
- * @param cancel Flag indicating whether all currently running jobs
- * should be cancelled.
- */
- private synchronized void stop0(boolean cancel) {
- IgniteKernal grid0 = grid;
-
- // Double check.
- if (grid0 == null) {
- if (log != null)
- U.warn(log, "Attempting to stop an already stopped grid instance (ignore): " + name);
-
- return;
- }
-
- if (shutdownHook != null)
- try {
- Runtime.getRuntime().removeShutdownHook(shutdownHook);
-
- shutdownHook = null;
-
- if (log.isDebugEnabled())
- log.debug("Shutdown hook is removed.");
- }
- catch (IllegalStateException e) {
- // Shutdown is in progress...
- if (log.isDebugEnabled())
- log.debug("Shutdown is in progress (ignoring): " + e.getMessage());
- }
-
- // Unregister GridGain MBean.
- unregisterFactoryMBean();
-
- try {
- grid0.stop(cancel);
-
- if (log.isDebugEnabled())
- log.debug("Grid instance stop
<TRUNCATED>