package io.mycat.server.config.loader.zkloader; import com.alibaba.fastjson.JSON; import org.apache.curator.framework.CuratorFramework; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; import java.util.function.Function; import io.mycat.server.config.ConfigException; import io.mycat.server.config.node.DataHostConfig; import io.mycat.server.config.node.DataNodeConfig; import static java.util.stream.Collectors.toMap; /** * Created by v1.lion on 2015/10/8. */ public class ZkDataNodeConfigLoader extends AbstractZKLoaders { //directory name of data node config in zookeeper private static final Logger LOGGER = LoggerFactory.getLogger(ZkDataNodeConfigLoader.class); private static final String DATANODE_CONFIG_DIRECTORY = "datanode-config"; private final ZkDataHostConfigLoader dataHostConfigLoader; //hold dataNode name mapping to DataNodeConfig private Map<String, DataNodeConfig> dataNodeConfigs; public ZkDataNodeConfigLoader(final String clusterID, ZkDataHostConfigLoader dataHostConfigLoader) { super(clusterID, DATANODE_CONFIG_DIRECTORY); this.dataHostConfigLoader = dataHostConfigLoader; } @Override public void fetchConfig(CuratorFramework zkConnection) { //invoke composed this.dataHostConfigLoader.fetchConfig(zkConnection); //data node config path in zookeeper //example: /mycat-cluster-1/datanode-config this.dataNodeConfigs = new HashMap<>(); JSON.parseArray(super.fetchDataToString(zkConnection, "") , DataNodeConfig.class) .stream() .forEach(dataNodeConfig -> { if (dataNodeConfigs.containsKey(dataNodeConfig.getName())) { throw new ConfigException("dataNode " + dataNodeConfig.getName() + " duplicated!"); } if (!dataHostConfigLoader.getDataHostConfigs() .containsKey(dataNodeConfig.getDataHost())) { throw new ConfigException("dataNode " + dataNodeConfig.getName() + " reference dataHost:" + dataNodeConfig.getDataHost() + " not exists!"); } dataNodeConfigs.put(dataNodeConfig.getName(),dataNodeConfig); }); LOGGER.trace("done fetch data node config."); } public Map<String, DataNodeConfig> getDataNodeConfigs() { return this.dataNodeConfigs; } public Map<String, DataHostConfig> getDataHostConfigs() { return this.dataHostConfigLoader.getDataHostConfigs(); } }