View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  package org.apache.hadoop.hbase.chaos.actions;
20  
21  import java.io.IOException;
22  
23  import org.apache.hadoop.hbase.ServerName;
24  import org.apache.hadoop.hbase.util.Threads;
25  import org.slf4j.Logger;
26  import org.slf4j.LoggerFactory;
27  
28  /**
29  * Base class for restarting HBaseServer's
30  */
31  public class RestartActionBaseAction extends Action {
32    private static final Logger LOG =
33        LoggerFactory.getLogger(RestartActionBaseAction.class);
34    long sleepTime; // how long should we sleep
35  
36    public RestartActionBaseAction(long sleepTime) {
37      this.sleepTime = sleepTime;
38    }
39  
40    @Override protected Logger getLogger() {
41      return LOG;
42    }
43  
44    void sleep(long sleepTime) {
45      getLogger().info("Sleeping for:" + sleepTime);
46      Threads.sleep(sleepTime);
47    }
48  
49    void restartMaster(ServerName server, long sleepTime) throws IOException {
50      sleepTime = Math.max(sleepTime, 1000);
51      // Don't try the kill if we're stopping
52      if (context.isStopping()) {
53        return;
54      }
55  
56      getLogger().info("Killing master: " + server);
57      killMaster(server);
58      sleep(sleepTime);
59      getLogger().info("Starting master: " + server);
60      startMaster(server);
61    }
62  
63    /**
64     * Stop and then restart the region server instead of killing it.
65     * @param server hostname to restart the regionserver on
66     * @param sleepTime number of milliseconds between stop and restart
67     * @throws IOException if something goes wrong
68     */
69    void gracefulRestartRs(ServerName server, long sleepTime) throws IOException {
70      sleepTime = Math.max(sleepTime, 1000);
71      // Don't try the stop if we're stopping already
72      if (context.isStopping()) {
73        return;
74      }
75      getLogger().info("Stopping region server: " + server);
76      stopRs(server);
77      sleep(sleepTime);
78      getLogger().info("Starting region server: " + server);
79      startRs(server);
80    }
81  
82    void restartRs(ServerName server, long sleepTime) throws IOException {
83      sleepTime = Math.max(sleepTime, 1000);
84      // Don't try the kill if we're stopping
85      if (context.isStopping()) {
86        return;
87      }
88      getLogger().info("Killing region server: " + server);
89      killRs(server);
90      sleep(sleepTime);
91      getLogger().info("Starting region server: " + server);
92      startRs(server);
93    }
94  
95    void restartZKNode(ServerName server, long sleepTime) throws IOException {
96      sleepTime = Math.max(sleepTime, 1000);
97      // Don't try the kill if we're stopping
98      if (context.isStopping()) {
99        return;
100     }
101     getLogger().info("Killing zookeeper node: " + server);
102     killZKNode(server);
103     sleep(sleepTime);
104     getLogger().info("Starting zookeeper node: " + server);
105     startZKNode(server);
106   }
107 
108   void restartDataNode(ServerName server, long sleepTime) throws IOException {
109     sleepTime = Math.max(sleepTime, 1000);
110     // Don't try the kill if we're stopping
111     if (context.isStopping()) {
112       return;
113     }
114     getLogger().info("Killing data node: " + server);
115     killDataNode(server);
116     sleep(sleepTime);
117     getLogger().info("Starting data node: " + server);
118     startDataNode(server);
119   }
120 
121   void restartNameNode(ServerName server, long sleepTime) throws IOException {
122     sleepTime = Math.max(sleepTime, 1000);
123     // Don't try the kill if we're stopping
124     if (context.isStopping()) {
125       return;
126     }
127     getLogger().info("Killing name node: " + server);
128     killNameNode(server);
129     sleep(sleepTime);
130     getLogger().info("Starting name node: " + server);
131     startNameNode(server);
132   }
133 }