/** * Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com) * * Licensed 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 com.linkedin.pinot.tools.admin.command; import com.linkedin.pinot.common.utils.ZkStarter; import com.linkedin.pinot.tools.Command; import java.io.File; import java.io.IOException; import org.I0Itec.zkclient.IDefaultNameSpace; import org.I0Itec.zkclient.ZkServer; import org.apache.commons.io.FileUtils; import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.io.Files; /** * Class for command to start ZooKeeper. * * */ public class StartZookeeperCommand extends AbstractBaseAdminCommand implements Command { private static final Logger LOGGER = LoggerFactory.getLogger(StartZookeeperCommand.class); @Option(name="-zkPort", required=false, metaVar="<int>", usage="Port to start zookeeper server on.") private int _zkPort=2181; @Option(name="-dataDir", required=false, metaVar="<string>", usage="Directory for zookeper data.") private String _dataDir = TMP_DIR + "PinotAdmin/zkData"; @Option(name="-help", required=false, help=true, aliases={"-h", "--h", "--help"}, usage="Print this message.") private boolean _help = false; @Override public boolean getHelp() { return _help; } @Override public String getName() { return "StartZookeeper"; } @Override public String toString() { return ("StartZookeeper -zkPort " + _zkPort + " -dataDir " + _dataDir); } @Override public void cleanup() { if (_tmpdir != null) { try { FileUtils.deleteDirectory(_tmpdir); } catch (IOException e) { // Nothing to do right now. } } } @Override public String description() { return "Start the Zookeeper process at the specified port."; } StartZookeeperCommand setPort(int port) { _zkPort = port; return this; } StartZookeeperCommand setDataDir(String dataDir) { _dataDir = dataDir; return this; } private ZkStarter.ZookeeperInstance _zookeeperInstance; private File _tmpdir; public void init(int zkPort, String dataDir) { _zkPort = zkPort; _dataDir = dataDir; } @Override public boolean execute() throws IOException { LOGGER.info("Executing command: " + toString()); _tmpdir = createAutoDeleteTempDir(); File logdir = new File(_tmpdir + File.separator + "translog"); File datadir = new File(_tmpdir + File.separator + "snapshot"); IDefaultNameSpace _defaultNameSpace = new IDefaultNameSpace() { @Override public void createDefaultNameSpace(org.I0Itec.zkclient.ZkClient zkClient) { // init any zk paths if needed } }; _zookeeperInstance = ZkStarter.startLocalZkServer(_zkPort, datadir.getAbsolutePath()); LOGGER.info("Start zookeeper at localhost:" + _zkPort + " in thread " + Thread.currentThread().getName()); savePID(System.getProperty("java.io.tmpdir") + File.separator + ".zooKeeper.pid"); return true; } public static File createAutoDeleteTempDir() { File tempdir = Files.createTempDir(); tempdir.delete(); tempdir.mkdir(); tempdir.deleteOnExit(); return tempdir; } public boolean stop() { ZkStarter.stopLocalZkServer(_zookeeperInstance); return true; } public static void main(String[] args) throws Exception { StartZookeeperCommand zkc = new StartZookeeperCommand(); zkc.execute(); } }