/* * Copyright (c) 2010-2012 Grid Dynamics Consulting Services, Inc, All Rights Reserved * http://www.griddynamics.com * * This library is free software; you can redistribute it and/or modify it under the terms of * the Apache License; either * version 2.0 of the License, or any later version. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.griddynamics.jagger; import com.griddynamics.jagger.coordinator.zookeeper.IZookeeper; import com.griddynamics.jagger.coordinator.zookeeper.Zoo; import com.griddynamics.jagger.coordinator.zookeeper.ZooKeeperFactory; import com.griddynamics.jagger.exception.TechnicalException; import org.apache.zookeeper.server.ServerConfig; import org.apache.zookeeper.server.quorum.QuorumPeerConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.Properties; import static com.griddynamics.jagger.coordinator.zookeeper.Zoo.znode; public class ZooKeeperServer implements AttendantServer, Runnable { private static final Logger log = LoggerFactory.getLogger(ZooKeeperServer.class); private ZooKeeperServerWrapper zooKeeperServer; private Zoo zoo; private Properties startupProperties; private String endpoint; private int sessionTimeout; private String rootNode; @Override public void run() { log.info("Starting ZooKeeper..."); QuorumPeerConfig quorumConfiguration = new QuorumPeerConfig(); try { quorumConfiguration.parseProperties( startupProperties ); } catch(Exception e) { throw new TechnicalException(e); } zooKeeperServer = new ZooKeeperServerWrapper(); final ServerConfig configuration = new ServerConfig(); configuration.readFrom( quorumConfiguration ); new Thread() { public void run() { try { zooKeeperServer.runFromConfig(configuration); } catch (IOException e) { log.error("ZooKeeper Failed", e); } } }.start(); } @Override public void terminate() { log.debug("termination signal received"); if(zooKeeperServer != null) { try { if (zoo != null) { zoo.root().child(rootNode).removeWithChildren(); } zooKeeperServer.shutdown(); } catch (Exception e) { log.warn("Error during zookeeper termination. Message: {}", e.getMessage()); } } } public void initialize() { ZooKeeperFactory zooKeeperFactory = new ZooKeeperFactory(); zooKeeperFactory.setConnectString(endpoint); zooKeeperFactory.setSessionTimeout(sessionTimeout); log.info("Connect to {} endpoint with timeout {}", endpoint, sessionTimeout); IZookeeper zooKeeper = null; try { zooKeeper = zooKeeperFactory.create(); zoo = new Zoo(zooKeeperFactory.create()); // TODO: timeout only 40000. svi. if (zoo.root().hasChild(rootNode)) { log.info("ZNode [" + rootNode + "] was found."); zoo.root().child(rootNode).removeWithChildren(); log.info("ZNode [" + rootNode + "] with children nodes were removed."); } zoo.root().createChild(znode().withPath(rootNode)); log.info("ZNode [" + rootNode + "] was created."); } finally { if (zooKeeper != null) { try { zooKeeper.close(); } catch (InterruptedException e) { // do nothing } } } } public void setStartupProperties(Properties startupProperties) { this.startupProperties = startupProperties; } public void setEndpoint(String endpoint) { this.endpoint = endpoint; } public void setSessionTimeout(int sessionTimeout) { this.sessionTimeout = sessionTimeout; } public void setRootNode(String rootNode) { this.rootNode = rootNode.substring(1, rootNode.length()); } }