blob: 8e650670d0d1a3f5c1a5032a1a753b8d1d0fff84 [file] [log] [blame]
/*
* 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.app;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import io.netty.util.internal.StringUtil;
import org.apache.ignite.app.Ignite;
import org.apache.ignite.app.Ignition;
import org.apache.ignite.configuration.RootKey;
import org.apache.ignite.configuration.internal.ConfigurationManager;
import org.apache.ignite.configuration.schemas.network.NetworkConfiguration;
import org.apache.ignite.configuration.schemas.network.NetworkView;
import org.apache.ignite.configuration.schemas.runner.ClusterConfiguration;
import org.apache.ignite.configuration.schemas.runner.NodeConfiguration;
import org.apache.ignite.configuration.schemas.table.TablesConfiguration;
import org.apache.ignite.configuration.storage.ConfigurationStorage;
import org.apache.ignite.configuration.storage.ConfigurationType;
import org.apache.ignite.internal.affinity.AffinityManager;
import org.apache.ignite.internal.baseline.BaselineManager;
import org.apache.ignite.internal.metastorage.MetaStorageManager;
import org.apache.ignite.internal.raft.Loza;
import org.apache.ignite.internal.schema.SchemaManager;
import org.apache.ignite.internal.storage.DistributedConfigurationStorage;
import org.apache.ignite.internal.storage.LocalConfigurationStorage;
import org.apache.ignite.internal.table.distributed.TableManager;
import org.apache.ignite.internal.vault.VaultManager;
import org.apache.ignite.internal.vault.impl.VaultServiceImpl;
import org.apache.ignite.lang.IgniteLogger;
import org.apache.ignite.network.ClusterLocalConfiguration;
import org.apache.ignite.network.ClusterService;
import org.apache.ignite.network.MessageSerializationRegistryInitializer;
import org.apache.ignite.network.scalecube.ScaleCubeClusterServiceFactory;
import org.apache.ignite.network.serialization.MessageSerializationRegistry;
import org.apache.ignite.table.manager.IgniteTables;
import org.apache.ignite.utils.IgniteProperties;
/**
* Implementation of an entry point for handling grid lifecycle.
*/
public class IgnitionImpl implements Ignition {
/** The logger. */
private static final IgniteLogger LOG = IgniteLogger.forClass(IgnitionImpl.class);
/** */
private static final String[] BANNER = new String[] {
"",
" # ___ __",
" ### / | ____ ____ _ _____ / /_ ___",
" # ##### / /| | / __ \\ / __ `// ___// __ \\ / _ \\",
" ### ###### / ___ | / /_/ // /_/ // /__ / / / // ___/",
" ##### ####### /_/ |_|/ .___/ \\__,_/ \\___//_/ /_/ \\___/",
" ####### ###### /_/",
" ######## #### ____ _ __ _____",
" # ######## ## / _/____ _ ____ (_)/ /_ ___ |__ /",
" #### ####### # / / / __ `// __ \\ / // __// _ \\ /_ <",
" ##### ##### _/ / / /_/ // / / // // /_ / ___/ ___/ /",
" #### ## /___/ \\__, //_/ /_//_/ \\__/ \\___/ /____/",
" ## /____/\n"
};
/** */
private static final String VER_KEY = "version";
/** {@inheritDoc} */
@Override public synchronized Ignite start(String jsonStrBootstrapCfg) {
ackBanner();
// Vault Component startup.
VaultManager vaultMgr = new VaultManager(new VaultServiceImpl());
boolean cfgBootstrappedFromPds = vaultMgr.bootstrapped();
List<RootKey<?, ?>> rootKeys = Arrays.asList(
NetworkConfiguration.KEY,
NodeConfiguration.KEY,
ClusterConfiguration.KEY,
TablesConfiguration.KEY
);
List<ConfigurationStorage> configurationStorages =
new ArrayList<>(Collections.singletonList(new LocalConfigurationStorage(vaultMgr)));
// Bootstrap local configuration manager.
ConfigurationManager locConfigurationMgr = new ConfigurationManager(rootKeys, configurationStorages);
if (!cfgBootstrappedFromPds && jsonStrBootstrapCfg != null)
try {
locConfigurationMgr.bootstrap(jsonStrBootstrapCfg, ConfigurationType.LOCAL);
}
catch (Exception e) {
LOG.warn("Unable to parse user specific configuration, default configuration will be used: " + e.getMessage());
}
else if (jsonStrBootstrapCfg != null)
LOG.warn("User specific configuration will be ignored, cause vault was bootstrapped with pds configuration");
else
locConfigurationMgr.configurationRegistry().startStorageConfigurations(ConfigurationType.LOCAL);
NetworkView netConfigurationView =
locConfigurationMgr.configurationRegistry().getConfiguration(NetworkConfiguration.KEY).value();
var serializationRegistry = new MessageSerializationRegistry();
MessageSerializationRegistryInitializer.initialize(serializationRegistry);
String localNodeName = locConfigurationMgr.configurationRegistry().getConfiguration(NodeConfiguration.KEY)
.name().value();
assert !StringUtil.isNullOrEmpty(localNodeName) : "Node local name is empty";
// Network startup.
ClusterService clusterNetSvc = new ScaleCubeClusterServiceFactory().createClusterService(
new ClusterLocalConfiguration(
localNodeName,
netConfigurationView.port(),
Arrays.asList(netConfigurationView.netClusterNodes()),
serializationRegistry
)
);
clusterNetSvc.start();
// Raft Component startup.
Loza raftMgr = new Loza(clusterNetSvc);
// Meta storage Component startup.
MetaStorageManager metaStorageMgr = new MetaStorageManager(
vaultMgr,
locConfigurationMgr,
clusterNetSvc,
raftMgr
);
// TODO IGNITE-14578 Bootstrap configuration manager with distributed configuration.
configurationStorages.add(new DistributedConfigurationStorage(metaStorageMgr));
// Start configuration manager.
ConfigurationManager configurationMgr = new ConfigurationManager(rootKeys, configurationStorages);
// Baseline manager startup.
BaselineManager baselineMgr = new BaselineManager(configurationMgr, metaStorageMgr, clusterNetSvc);
// Affinity manager startup.
AffinityManager affinityMgr = new AffinityManager(configurationMgr, metaStorageMgr, baselineMgr);
SchemaManager schemaMgr = new SchemaManager(configurationMgr, metaStorageMgr, vaultMgr);
// Distributed table manager startup.
IgniteTables distributedTblMgr = new TableManager(
configurationMgr,
metaStorageMgr,
schemaMgr,
affinityMgr,
raftMgr,
vaultMgr
);
// TODO IGNITE-14579 Start rest manager.
// Deploy all resisted watches cause all components are ready and have registered their listeners.
metaStorageMgr.deployWatches();
ackSuccessStart();
return new IgniteImpl(distributedTblMgr);
}
/** */
private static void ackSuccessStart() {
LOG.info("Apache Ignite started successfully!");
}
/** */
private static void ackBanner() {
String ver = IgniteProperties.get(VER_KEY);
String banner = String.join("\n", BANNER);
LOG.info(banner + '\n' + " ".repeat(22) + "Apache Ignite ver. " + ver + '\n');
}
}