001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019package org.apache.hadoop.hbase.chaos.actions;
020
021import java.io.IOException;
022import org.apache.hadoop.hbase.ServerName;
023import org.apache.hadoop.hbase.util.Threads;
024
025/**
026* Base class for restarting HBaseServer's
027*/
028public abstract class RestartActionBaseAction extends Action {
029  long sleepTime; // how long should we sleep
030
031  public RestartActionBaseAction(long sleepTime) {
032    this.sleepTime = sleepTime;
033  }
034
035  void sleep(long sleepTime) {
036    getLogger().info("Sleeping for:" + sleepTime);
037    Threads.sleep(sleepTime);
038  }
039
040  void restartMaster(ServerName server, long sleepTime) throws IOException {
041    sleepTime = Math.max(sleepTime, 1000);
042    // Don't try the kill if we're stopping
043    if (context.isStopping()) {
044      return;
045    }
046
047    getLogger().info("Killing master: {}", server);
048    killMaster(server);
049    sleep(sleepTime);
050    getLogger().info("Starting master: {}", server);
051    startMaster(server);
052  }
053
054  /**
055   * Stop and then restart the region server instead of killing it.
056   * @param server hostname to restart the regionserver on
057   * @param sleepTime number of milliseconds between stop and restart
058   * @throws IOException if something goes wrong
059   */
060  void gracefulRestartRs(ServerName server, long sleepTime) throws IOException {
061    sleepTime = Math.max(sleepTime, 1000);
062    // Don't try the stop if we're stopping already
063    if (context.isStopping()) {
064      return;
065    }
066    getLogger().info("Stopping region server: {}", server);
067    stopRs(server);
068    sleep(sleepTime);
069    getLogger().info("Starting region server: {}", server);
070    startRs(server);
071  }
072
073  void restartRs(ServerName server, long sleepTime) throws IOException {
074    sleepTime = Math.max(sleepTime, 1000);
075    // Don't try the kill if we're stopping
076    if (context.isStopping()) {
077      return;
078    }
079    getLogger().info("Killing region server: {}", server);
080    killRs(server);
081    sleep(sleepTime);
082    getLogger().info("Starting region server: {}", server);
083    startRs(server);
084  }
085
086  void restartZKNode(ServerName server, long sleepTime) throws IOException {
087    sleepTime = Math.max(sleepTime, 1000);
088    // Don't try the kill if we're stopping
089    if (context.isStopping()) {
090      return;
091    }
092    getLogger().info("Killing zookeeper node: {}", server);
093    killZKNode(server);
094    sleep(sleepTime);
095    getLogger().info("Starting zookeeper node: {}", server);
096    startZKNode(server);
097  }
098
099  void restartDataNode(ServerName server, long sleepTime) throws IOException {
100    sleepTime = Math.max(sleepTime, 1000);
101    // Don't try the kill if we're stopping
102    if (context.isStopping()) {
103      return;
104    }
105    getLogger().info("Killing data node: {}", server);
106    killDataNode(server);
107    sleep(sleepTime);
108    getLogger().info("Starting data node: {}", server);
109    startDataNode(server);
110  }
111
112  void restartNameNode(ServerName server, long sleepTime) throws IOException {
113    sleepTime = Math.max(sleepTime, 1000);
114    // Don't try the kill if we're stopping
115    if (context.isStopping()) {
116      return;
117    }
118    getLogger().info("Killing name node: {}", server);
119    killNameNode(server);
120    sleep(sleepTime);
121    getLogger().info("Starting name node: {}", server);
122    startNameNode(server);
123  }
124}