Search in sources :

Example 6 with RegionEngineOptions

use of com.alipay.sofa.jraft.rhea.options.RegionEngineOptions in project sofa-jraft by sofastack.

the class StoreEngine method init.

@Override
public synchronized boolean init(final StoreEngineOptions opts) {
    if (this.started) {
        LOG.info("[StoreEngine] already started.");
        return true;
    }
    DescriberManager.getInstance().addDescriber(this);
    this.storeOpts = Requires.requireNonNull(opts, "opts");
    Endpoint serverAddress = Requires.requireNonNull(opts.getServerAddress(), "opts.serverAddress");
    final int port = serverAddress.getPort();
    final String ip = serverAddress.getIp();
    if (ip == null || Utils.IP_ANY.equals(ip)) {
        serverAddress = new Endpoint(NetUtil.getLocalCanonicalHostName(), port);
        opts.setServerAddress(serverAddress);
    }
    final long metricsReportPeriod = opts.getMetricsReportPeriod();
    // init region options
    List<RegionEngineOptions> rOptsList = opts.getRegionEngineOptionsList();
    if (rOptsList == null || rOptsList.isEmpty()) {
        // -1 region
        final RegionEngineOptions rOpts = new RegionEngineOptions();
        rOpts.setRegionId(Constants.DEFAULT_REGION_ID);
        rOptsList = Lists.newArrayList();
        rOptsList.add(rOpts);
        opts.setRegionEngineOptionsList(rOptsList);
    }
    final String clusterName = this.pdClient.getClusterName();
    for (final RegionEngineOptions rOpts : rOptsList) {
        rOpts.setRaftGroupId(JRaftHelper.getJRaftGroupId(clusterName, rOpts.getRegionId()));
        rOpts.setServerAddress(serverAddress);
        if (Strings.isBlank(rOpts.getInitialServerList())) {
            // if blank, extends parent's value
            rOpts.setInitialServerList(opts.getInitialServerList());
        }
        if (rOpts.getNodeOptions() == null) {
            // copy common node options
            rOpts.setNodeOptions(opts.getCommonNodeOptions() == null ? new NodeOptions() : opts.getCommonNodeOptions().copy());
        }
        if (rOpts.getMetricsReportPeriod() <= 0 && metricsReportPeriod > 0) {
            // extends store opts
            rOpts.setMetricsReportPeriod(metricsReportPeriod);
        }
    }
    // init store
    final Store store = this.pdClient.getStoreMetadata(opts);
    if (store == null || store.getRegions() == null || store.getRegions().isEmpty()) {
        LOG.error("Empty store metadata: {}.", store);
        return false;
    }
    this.storeId = store.getId();
    // init executors
    if (this.readIndexExecutor == null) {
        this.readIndexExecutor = StoreEngineHelper.createReadIndexExecutor(opts.getReadIndexCoreThreads());
    }
    if (this.raftStateTrigger == null) {
        this.raftStateTrigger = StoreEngineHelper.createRaftStateTrigger(opts.getLeaderStateTriggerCoreThreads());
    }
    if (this.snapshotExecutor == null) {
        this.snapshotExecutor = StoreEngineHelper.createSnapshotExecutor(opts.getSnapshotCoreThreads(), opts.getSnapshotMaxThreads());
    }
    // init rpc executors
    final boolean useSharedRpcExecutor = opts.isUseSharedRpcExecutor();
    if (!useSharedRpcExecutor) {
        if (this.cliRpcExecutor == null) {
            this.cliRpcExecutor = StoreEngineHelper.createCliRpcExecutor(opts.getCliRpcCoreThreads());
        }
        if (this.raftRpcExecutor == null) {
            this.raftRpcExecutor = StoreEngineHelper.createRaftRpcExecutor(opts.getRaftRpcCoreThreads());
        }
        if (this.kvRpcExecutor == null) {
            this.kvRpcExecutor = StoreEngineHelper.createKvRpcExecutor(opts.getKvRpcCoreThreads());
        }
    }
    // init metrics
    startMetricReporters(metricsReportPeriod);
    // init rpc server
    this.rpcServer = RaftRpcServerFactory.createRaftRpcServer(serverAddress, this.raftRpcExecutor, this.cliRpcExecutor);
    StoreEngineHelper.addKvStoreRequestProcessor(this.rpcServer, this);
    if (!this.rpcServer.init(null)) {
        LOG.error("Fail to init [RpcServer].");
        return false;
    }
    // init db store
    if (!initRawKVStore(opts)) {
        return false;
    }
    if (this.rawKVStore instanceof Describer) {
        DescriberManager.getInstance().addDescriber((Describer) this.rawKVStore);
    }
    // init all region engine
    if (!initAllRegionEngine(opts, store)) {
        LOG.error("Fail to init all [RegionEngine].");
        return false;
    }
    // heartbeat sender
    if (this.pdClient instanceof RemotePlacementDriverClient) {
        HeartbeatOptions heartbeatOpts = opts.getHeartbeatOptions();
        if (heartbeatOpts == null) {
            heartbeatOpts = new HeartbeatOptions();
        }
        this.heartbeatSender = new HeartbeatSender(this);
        if (!this.heartbeatSender.init(heartbeatOpts)) {
            LOG.error("Fail to init [HeartbeatSender].");
            return false;
        }
    }
    this.startTime = System.currentTimeMillis();
    LOG.info("[StoreEngine] start successfully: {}.", this);
    return this.started = true;
}
Also used : BatchRawKVStore(com.alipay.sofa.jraft.rhea.storage.BatchRawKVStore) Store(com.alipay.sofa.jraft.rhea.metadata.Store) MemoryRawKVStore(com.alipay.sofa.jraft.rhea.storage.MemoryRawKVStore) RocksRawKVStore(com.alipay.sofa.jraft.rhea.storage.RocksRawKVStore) NodeOptions(com.alipay.sofa.jraft.option.NodeOptions) RegionEngineOptions(com.alipay.sofa.jraft.rhea.options.RegionEngineOptions) RemotePlacementDriverClient(com.alipay.sofa.jraft.rhea.client.pd.RemotePlacementDriverClient) Endpoint(com.alipay.sofa.jraft.util.Endpoint) HeartbeatSender(com.alipay.sofa.jraft.rhea.client.pd.HeartbeatSender) Endpoint(com.alipay.sofa.jraft.util.Endpoint) HeartbeatOptions(com.alipay.sofa.jraft.rhea.options.HeartbeatOptions) Describer(com.alipay.sofa.jraft.util.Describer)

Example 7 with RegionEngineOptions

use of com.alipay.sofa.jraft.rhea.options.RegionEngineOptions in project sofa-jraft by sofastack.

the class StoreEngine method doSplit.

public void doSplit(final Long regionId, final Long newRegionId, final byte[] splitKey) {
    try {
        Requires.requireNonNull(regionId, "regionId");
        Requires.requireNonNull(newRegionId, "newRegionId");
        final RegionEngine parent = getRegionEngine(regionId);
        final Region region = parent.getRegion().copy();
        final RegionEngineOptions rOpts = parent.copyRegionOpts();
        region.setId(newRegionId);
        region.setStartKey(splitKey);
        region.setRegionEpoch(new RegionEpoch(-1, -1));
        rOpts.setRegionId(newRegionId);
        rOpts.setStartKeyBytes(region.getStartKey());
        rOpts.setEndKeyBytes(region.getEndKey());
        rOpts.setRaftGroupId(JRaftHelper.getJRaftGroupId(this.pdClient.getClusterName(), newRegionId));
        rOpts.setRaftDataPath(null);
        String baseRaftDataPath = this.storeOpts.getRaftDataPath();
        if (Strings.isBlank(baseRaftDataPath)) {
            baseRaftDataPath = "";
        }
        rOpts.setRaftDataPath(baseRaftDataPath + "raft_data_region_" + region.getId() + "_" + getSelfEndpoint().getPort());
        final RegionEngine engine = new RegionEngine(region, this);
        if (!engine.init(rOpts)) {
            LOG.error("Fail to init [RegionEngine: {}].", region);
            throw Errors.REGION_ENGINE_FAIL.exception();
        }
        // update parent conf
        final Region pRegion = parent.getRegion();
        final RegionEpoch pEpoch = pRegion.getRegionEpoch();
        final long version = pEpoch.getVersion();
        // version + 1
        pEpoch.setVersion(version + 1);
        // update endKey
        pRegion.setEndKey(splitKey);
        // the following two lines of code can make a relation of 'happens-before' for
        // read 'pRegion', because that a write to a ConcurrentMap happens-before every
        // subsequent read of that ConcurrentMap.
        this.regionEngineTable.put(region.getId(), engine);
        registerRegionKVService(new DefaultRegionKVService(engine));
        // update local regionRouteTable
        this.pdClient.getRegionRouteTable().splitRegion(pRegion.getId(), region);
    } finally {
        this.splitting.set(false);
    }
}
Also used : Region(com.alipay.sofa.jraft.rhea.metadata.Region) RegionEngineOptions(com.alipay.sofa.jraft.rhea.options.RegionEngineOptions) RegionEpoch(com.alipay.sofa.jraft.rhea.metadata.RegionEpoch)

Aggregations

RegionEngineOptions (com.alipay.sofa.jraft.rhea.options.RegionEngineOptions)7 Region (com.alipay.sofa.jraft.rhea.metadata.Region)4 Endpoint (com.alipay.sofa.jraft.util.Endpoint)4 Store (com.alipay.sofa.jraft.rhea.metadata.Store)3 File (java.io.File)2 NodeOptions (com.alipay.sofa.jraft.option.NodeOptions)1 DefaultRheaKVStore (com.alipay.sofa.jraft.rhea.client.DefaultRheaKVStore)1 RheaKVStore (com.alipay.sofa.jraft.rhea.client.RheaKVStore)1 HeartbeatSender (com.alipay.sofa.jraft.rhea.client.pd.HeartbeatSender)1 PlacementDriverClient (com.alipay.sofa.jraft.rhea.client.pd.PlacementDriverClient)1 RemotePlacementDriverClient (com.alipay.sofa.jraft.rhea.client.pd.RemotePlacementDriverClient)1 RegionEpoch (com.alipay.sofa.jraft.rhea.metadata.RegionEpoch)1 HeartbeatOptions (com.alipay.sofa.jraft.rhea.options.HeartbeatOptions)1 RheaKVStoreOptions (com.alipay.sofa.jraft.rhea.options.RheaKVStoreOptions)1 BatchRawKVStore (com.alipay.sofa.jraft.rhea.storage.BatchRawKVStore)1 MemoryRawKVStore (com.alipay.sofa.jraft.rhea.storage.MemoryRawKVStore)1 RocksRawKVStore (com.alipay.sofa.jraft.rhea.storage.RocksRawKVStore)1 Describer (com.alipay.sofa.jraft.util.Describer)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 YAMLFactory (com.fasterxml.jackson.dataformat.yaml.YAMLFactory)1